// // Handle keyboard shortcuts // function Shortcuts() {} Shortcuts.init = function(target) { var that = this; target.addEventListener('keydown', function(e) { that.handleKey(e); }); this.overlay = jQuery('
'); this.overlay.hide(); this.overlay.appendTo(target); this.overlay.html(`
Keyboard Shortcuts
Hide this help with '?'.
tune frequency
${this.keycap('ArrowLeft')}|${this.keycap('ArrowRight')}
zoom waterfall
${this.keycap('ArrowUp')}|${this.keycap('ArrowDown')}
select modulation
(${this.keycap('Control')}+) ${this.keycap('0')}..${this.keycap('9')}
change tuning step
${this.keycap('[')}|${this.keycap(']')}
change volume
${this.keycap('Control')}+${this.keycap('ArrowUp')}|${this.keycap('ArrowDown')}
mute/unumte sound
${this.keycap('Space')}
auto-set squelch
${this.keycap('A')}
change squelch level
${this.keycap('Control')}+${this.keycap('ArrowLeft')}|${this.keycap('ArrowRight')}
disable squelch
${this.keycap('D')}
toggle noise reduction
${this.keycap('N')}
adjust bandpass offset
${this.keycap('Shift')}+${this.keycap('ArrowLeft')}|${this.keycap('ArrowRight')}
adjust bandpass width
${this.keycap('Shift')}+${this.keycap('ArrowUp')}|${this.keycap('ArrowDown')}
toggle scanner
${this.keycap('S')}
adjust waterfall min level
${this.keycap(',')}|${this.keycap('.')}
adjust waterfall max level
${this.keycap('<')}|${this.keycap('>')}
auto-set colors once
${this.keycap('Z')}
auto-set colors
${this.keycap('X')}
set default colors
${this.keycap('C')}
toggle recorder
${this.keycap('R')}
toggle spectrum
${this.keycap('V')}
toggle bandplan
${this.keycap('B')}
open map
${this.keycap('M')}
open files browser
${this.keycap('F')}
open documentation
${this.keycap('H')}
`); }; Shortcuts.moveSlider = function(slider, delta) { var $control = $(slider); if (!$control.prop('disabled')) { $control.val(parseInt($control.val()) + delta).change(); } }; Shortcuts.moveSelector = function(selector, steps) { var $control = $(selector); if (!$control.prop('disabled')) { var max = $(selector + ' option').length; var n = $control.prop('selectedIndex') + steps; n = n < 0? n + max : n >= max? n - max : n; $control.prop('selectedIndex', n).change(); } }; Shortcuts.handleKey = function(event) { // Do not handle shortcuts when focused on a text or numeric input var on_input = !!($('input:focus').length && ($('input:focus')[0].type === 'text' || $('input:focus')[0].type === 'number')); if (on_input) return; // Leave CTRL+ combinations to the browser if (event.ctrlKey && event.key.match(/^[a-z]$/i)) return; switch (event.key) { case 'ArrowLeft': if (event.ctrlKey) { // CTRL+LEFT: Decrease squelch this.moveSlider('#openwebrx-panel-receiver .openwebrx-squelch-slider', -1); } else if (event.shiftKey) { // SHIFT+LEFT: Shift bandpass left var demodulators = getDemodulators(); for (var i = 0; i < demodulators.length; i++) { demodulators[i].moveBandpass( demodulators[i].low_cut - 50, demodulators[i].high_cut - 50 ); } } else { // LEFT: Tune down tuneBySteps(-1); } break; case 'ArrowRight': if (event.ctrlKey) { // CTRL+RIGHT: Increase squelch this.moveSlider('#openwebrx-panel-receiver .openwebrx-squelch-slider', 1); } else if (event.shiftKey) { // SHIFT+RIGHT: Shift bandpass right var demodulators = getDemodulators(); for (var i = 0; i < demodulators.length; i++) { demodulators[i].moveBandpass( demodulators[i].low_cut + 50, demodulators[i].high_cut + 50 ); } } else { // RIGHT: Tune up tuneBySteps(1); } break; case 'ArrowUp': if (event.ctrlKey) { // CTRL+UP: Increase volume this.moveSlider('#openwebrx-panel-volume', 1); } else if (event.shiftKey) { // SHIFT+UP: Make bandpass wider var demodulators = getDemodulators(); for (var i = 0; i < demodulators.length; i++) { demodulators[i].moveBandpass( demodulators[i].low_cut - 50, demodulators[i].high_cut + 50 ); } } else { // UP: Zoom in zoomInOneStep(); } break; case 'ArrowDown': if (event.ctrlKey) { // CTRL+DOWN: Decrease volume this.moveSlider('#openwebrx-panel-volume', -1); } else if (event.shiftKey) { // SHIFT+DOWN: Make bandpass narrower var demodulators = getDemodulators(); for (var i = 0; i < demodulators.length; i++) { demodulators[i].moveBandpass( demodulators[i].low_cut + 50, demodulators[i].high_cut - 50 ); } } else { // DOWN: Zoom out zoomOutOneStep(); } break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': // [CTRL+]0-9: Select modulation var $modes = $('.openwebrx-demodulator-button'); var n = parseInt(event.key); n = n > 0? n - 1 : 9; if (event.ctrlKey) n += 10; if (n < $modes.length) $modes[n].click(); break; case '[': case '{': // [: Decrease tuning step this.moveSelector('#openwebrx-tuning-step-listbox', -1); break; case ']': case '}': // ]: Increase tuning step this.moveSelector('#openwebrx-tuning-step-listbox', 1); break; case 'a': // A: Set squelch automatically $('.openwebrx-squelch-auto').click(); break; case 's': // S: Toggle scanner toggleScanner(); break; case 'd': // D: Turn off squelch var $squelchControl = $('#openwebrx-panel-receiver .openwebrx-squelch-slider'); if (!$squelchControl.prop('disabled')) { $squelchControl.val($squelchControl.attr('min')).change(); } break; case 'z': // Z: Set waterfall colors automatically $('#openwebrx-waterfall-colors-auto').click(); break; case 'x': // X: Continuously auto-set waterfall colors $('#openwebrx-waterfall-colors-auto').triggerHandler('contextmenu'); break; case 'c': // C: Set default waterfall colors $('#openwebrx-waterfall-colors-default').click(); break; case 'v': // V: Toggle spectrum display UI.toggleSpectrum(); break; case 'b': // B: Toggle bandplan display UI.toggleBandplan(); break; case ' ': // SPACE: Mute/unmute sound UI.toggleMute(); break; case 'n': // N: Toggle noise reduction UI.toggleNR(); break; case 'r': // R: Toggle recorder UI.toggleRecording(); break; case '<': // SHIFT+<: Decrease waterfall max level this.moveSlider('#openwebrx-waterfall-color-max', -1); break; case ',': // <: Decrease waterfall min level this.moveSlider('#openwebrx-waterfall-color-min', -1); break; case '>': // SHIFT+>: Increase waterfall max level this.moveSlider('#openwebrx-waterfall-color-max', 1); break; case '.': // >: Increase waterfall min level this.moveSlider('#openwebrx-waterfall-color-min', 1); break; case 'f': // F: Open file browser $('a.button[target="openwebrx-files"]')[0].click(); break; case 'h': // H: Open documentation $('a.button[target="openwebrx-help"]')[0].click(); break; case 'm': // M: Open map $('a.button[target="openwebrx-map"]')[0].click(); break; case '/': case '?': Shortcuts.overlay.slideToggle(100); break; default: // Key not handled, pass it on return; } // Key handled, prevent default operation event.preventDefault(); }; Shortcuts.keycap = function(key) { var keymap = { ',': ', comma', '.': '. dot', ';': '; semicolon', '\'': '\' apostrophe', 'SHIFT': '⇧ Shift', 'CONTROL': '⌃ Ctrl', 'COMMAND': '⌘ Cmd', 'META': '⌘ Meta', 'ALT': '⌥ Alt', 'OPTION': '⌥ Opt', 'ENTER': '↵ Enter', 'RETURN': '↵ Enter', 'DELETE': '⌦ Del', 'BACKSPACE': '⌫ BS', 'ESCAPE': '⎋ ESC', 'ARROWRIGHT': '→', 'ARROWLEFT': '←', 'ARROWUP': '↑', 'ARROWDOWN': '↓', 'PAGEUP': '⇞ PgUp', 'PAGEDOWN': '⇟ PgDn', 'HOME': '↖ Home', 'END': '↘ End', 'TAB': '⇥ Tab', 'SPACE': '␣ Space', 'INTERVAL': '␣ Space', }; var k = keymap[key.toUpperCase()] || key.toUpperCase(); return ``; };