56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
|
|
class KeyboardShortcuts {
|
||
|
|
constructor() {
|
||
|
|
this.shortcuts = new Map();
|
||
|
|
this.enabled = true;
|
||
|
|
this.init();
|
||
|
|
}
|
||
|
|
|
||
|
|
init() {
|
||
|
|
document.addEventListener('keydown', (e) => {
|
||
|
|
if (!this.enabled) return;
|
||
|
|
|
||
|
|
const isInput = ['INPUT', 'TEXTAREA'].includes(e.target.tagName);
|
||
|
|
const key = this.getKeyCombo(e);
|
||
|
|
|
||
|
|
if (this.shortcuts.has(key)) {
|
||
|
|
const { handler, allowInInput } = this.shortcuts.get(key);
|
||
|
|
if (!isInput || allowInInput) {
|
||
|
|
e.preventDefault();
|
||
|
|
handler(e);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
getKeyCombo(e) {
|
||
|
|
const parts = [];
|
||
|
|
if (e.ctrlKey || e.metaKey) parts.push('ctrl');
|
||
|
|
if (e.altKey) parts.push('alt');
|
||
|
|
if (e.shiftKey) parts.push('shift');
|
||
|
|
parts.push(e.key.toLowerCase());
|
||
|
|
return parts.join('+');
|
||
|
|
}
|
||
|
|
|
||
|
|
register(keyCombo, handler, allowInInput = false) {
|
||
|
|
this.shortcuts.set(keyCombo.toLowerCase(), { handler, allowInInput });
|
||
|
|
}
|
||
|
|
|
||
|
|
unregister(keyCombo) {
|
||
|
|
this.shortcuts.delete(keyCombo.toLowerCase());
|
||
|
|
}
|
||
|
|
|
||
|
|
enable() {
|
||
|
|
this.enabled = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
disable() {
|
||
|
|
this.enabled = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
getRegisteredShortcuts() {
|
||
|
|
return Array.from(this.shortcuts.keys());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export const shortcuts = new KeyboardShortcuts();
|