astrXbian/www/jukebox/ui/hotkeys.js

246 lines
8.7 KiB
JavaScript

var shortcuts = function() {
var key_names = {
8: "backspace",
9: "tab",
10: "return",
13: "return",
16: "shift",
17: "ctrl",
18: "alt",
19: "pause",
20: "capslock",
27: "esc",
32: "space",
33: "pageup",
34: "pagedown",
35: "end",
36: "home",
37: "left",
38: "up",
39: "right",
40: "down",
45: "insert",
46: "del",
59: ";",
61: "=",
96: "0",
97: "1",
98: "2",
99: "3",
100: "4",
101: "5",
102: "6",
103: "7",
104: "8",
105: "9",
106: "*",
107: "+",
109: "-",
110: ".",
111: "/",
112: "f1",
113: "f2",
114: "f3",
115: "f4",
116: "f5",
117: "f6",
118: "f7",
119: "f8",
120: "f9",
121: "f10",
122: "f11",
123: "f12",
144: "numlock",
145: "scroll",
173: "-",
186: ";",
187: "=",
188: ",",
189: "-",
190: ".",
191: "/",
192: "`",
219: "[",
220: "\\",
221: "]",
222: "'",
225: "enter"
};
var modifiers = ['alt', 'ctrl', 'shift'];
var hotkeys = { button_next: ".",
button_previous: ",",
button_stop: "Space",
button_play: "P",
button_volup: "=",
button_voldown: "-",
button_skipforward: "]",
button_skipbackward: "[",
button_clearplaylist: "C",
button_stopafter: "F",
button_random: "S",
button_crossfade: "X",
button_repeat: "R",
button_consume: "E",
button_rateone: "1",
button_ratetwo: "2",
button_ratethree: "3",
button_ratefour: "4",
button_ratefive: "5",
button_togglesources: ",",
button_toggleplaylist: ".",
config_hidebrowser: "H",
button_updatecollection: "U",
button_nextsource: "I",
};
var bindings = { button_next: playlist.next,
button_previous: playlist.previous,
button_stop: player.controller.stop,
button_play: infobar.playbutton.clicked,
button_volup: function() { infobar.volumeKey(5) },
button_voldown: function() { infobar.volumeKey(-5) },
button_skipforward: function() { player.skip(10) },
button_skipbackward: function() { player.skip(-10) },
button_clearplaylist: playlist.clear,
button_stopafter: playlist.stopafter,
button_random: function() { layoutProcessor.playlistControlHotKey('random') },
button_crossfade: function() { layoutProcessor.playlistControlHotKey('crossfade') },
button_repeat: function() { layoutProcessor.playlistControlHotKey('repeat') },
button_consume: function() { layoutProcessor.playlistControlHotKey('consume') },
button_rateone: function() { nowplaying.setRating(1) },
button_ratetwo: function() { nowplaying.setRating(2) },
button_ratethree: function() { nowplaying.setRating(3) },
button_ratefour: function() { nowplaying.setRating(4) },
button_ratefive: function() { nowplaying.setRating(5) },
button_togglesources: function() { layoutProcessor.expandInfo('left') },
button_toggleplaylist: function() { layoutProcessor.expandInfo('right') },
config_hidebrowser: function() { $("#hidebrowser").prop("checked", !$("#hidebrowser").is(':checked')); prefs.save({hidebrowser: $("#hidebrowser").is(':checked')}, hideBrowser) },
button_updatecollection: function() {
if (!prefs.mopidy_slave) {
collectionHelper.checkCollection(true, false);
}
},
button_nextsource: function() { browser.nextSource(1) }
};
function format_keyinput(inpname, hotkey) {
if (hotkey === null) hotkey = "";
return '<input id="'+inpname+'" class="tleft buttonchange clearbox" type="text" size="16" value="'+hotkey+'"></input>';
}
function format_clearbutton(inpname) {
return '<td><i class="icon-cancel-circled playlisticon clickicon buttonclear" name="'+inpname+'"></i></td>';
}
function unbind() {
$(window).off('keydown', shortcuts.action);
}
function getHotkeyString(event) {
var key = key_names[event.which] || String.fromCharCode(event.which);
var pieces = [];
for(var i in modifiers) {
if (event[modifiers[i]+"Key"] && modifiers[i] != key) {
pieces.push(modifiers[i].initcaps());
}
}
pieces.push(key.initcaps());
return pieces.join('+');
}
return {
load: function() {
debug.shout("SHORTCUTS","Loading Key Bindings");
unbind();
for (var i in hotkeys) {
if (localStorage.getItem('hotkeys.'+i) !== null) {
hotkeys[i] = localStorage.getItem('hotkeys.'+i);
}
}
$(window).on('keydown', shortcuts.action);
},
action: function(ev) {
if ($(ev.target).is('input')) {
debug.trace("HOTKEYS","Ignoring key event in input");
} else {
var key = getHotkeyString(ev);
for (var i in hotkeys) {
if (hotkeys[i] == key) {
bindings[i]();
break;
}
}
}
},
edit: function() {
$("#configpanel").slideToggle('fast');
var fnarkle = new popup({
css: {
width: 500,
height: 1024
},
fitheight: true,
helplink: 'https://fatg3erman.github.io/RompR/Keyboard-Shortcuts',
title: language.gettext("title_keybindings")
});
var mywin = fnarkle.create()
mywin.append('<table align="center" cellpadding="2" id="keybindtable" width="90%"></table>');
for (var i in hotkeys) {
$("#keybindtable").append('<tr><td width="50%" align="right">'+language.gettext(i).initcaps()+'</td><td>'+format_keyinput(i, hotkeys[i])+'</td></tr>');
}
$(".buttonchange").on('keydown', shortcuts.change );
$('.buttonchange').on('click', shortcuts.remove );
fnarkle.open();
},
change: function(ev) {
ev.preventDefault();
ev.stopPropagation();
var key = getHotkeyString(ev);
for (var name in hotkeys) {
if (hotkeys[name] == key) {
infobar.error(language.gettext('error_dupkey', [key, language.gettext(name)]));
return false;
}
}
$(ev.target).val(key);
shortcuts.save()
},
remove: function(ev) {
ev.preventDefault();
ev.stopPropagation();
var position = getPosition(ev);
var elemright = $(ev.target).width() + $(ev.target).offset().left;
if (position.x > elemright - 24) {
$(ev.target).val("");
shortcuts.save();
}
},
save: function() {
$("#keybindtable").find(".buttonchange").each(function() {
var k = $(this).val();
var n = $(this).attr("id");
hotkeys[n] = k;
localStorage.setItem('hotkeys.'+n, k);
});
shortcuts.load();
},
add: function(name, binding, hotkey) {
debug.log("HOTKEYS","Plugin adding key binding",name);
hotkeys[name] = hotkey;
bindings[name] = binding;
}
}
}();