234 lines
7.2 KiB
JavaScript
234 lines
7.2 KiB
JavaScript
//
|
|
// Handle keyboard shortcuts
|
|
//
|
|
|
|
function Shortcuts() {}
|
|
|
|
Shortcuts.init = function(target) {
|
|
target.addEventListener("keydown", this.handleKey);
|
|
};
|
|
|
|
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;
|
|
|
|
switch (event.key) {
|
|
case 'ArrowLeft':
|
|
if (event.ctrlKey) {
|
|
// CTRL+LEFT: Decrease squelch
|
|
this.moveSlider('#openwebrx-panel-receiver .openwebrx-squelch-slider', -5);
|
|
} 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', 5);
|
|
} 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', 10);
|
|
} 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', -10);
|
|
} 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':
|
|
// 0-9: Select modulation
|
|
var $modes = $('.openwebrx-demodulator-button');
|
|
var n = parseInt(event.key);
|
|
n = n > 0? n - 1 : 9;
|
|
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 '?':
|
|
// TODO: Help screen goes here!!!
|
|
break;
|
|
|
|
default:
|
|
// Key not handled, pass it on
|
|
return;
|
|
}
|
|
|
|
// Key handled, prevent default operation
|
|
event.preventDefault();
|
|
};
|