From 26356e78d3c153bdad944e1b3f05805726125937 Mon Sep 17 00:00:00 2001 From: kts of kettek Date: Fri, 16 Feb 2024 18:59:17 -0800 Subject: [PATCH] Add release dispatch in addition to trigger --- frontend/src/components/Shortcut.svelte | 4 +++- frontend/src/components/Shortcuts.svelte | 26 +++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/Shortcut.svelte b/frontend/src/components/Shortcut.svelte index 9f90585..2cae3e4 100644 --- a/frontend/src/components/Shortcut.svelte +++ b/frontend/src/components/Shortcut.svelte @@ -11,8 +11,10 @@ export let global: boolean = false const { registerShortcut } = getContext(SHORTCUTS) as ShortcutsType - registerShortcut({cmd, group, global, keys, callback: () => { + registerShortcut({cmd, group, global, keys, trigger: () => { dispatch('trigger', {}) + }, release: () => { + dispatch('release', {}) }}) \ No newline at end of file diff --git a/frontend/src/components/Shortcuts.svelte b/frontend/src/components/Shortcuts.svelte index a4a2ea9..6a76a99 100644 --- a/frontend/src/components/Shortcuts.svelte +++ b/frontend/src/components/Shortcuts.svelte @@ -3,7 +3,7 @@ import { get, writable } from 'svelte/store' export const SHORTCUTS = {} export type ShortcutsType = { - registerShortcut: (opts: {cmd: string, group: string, global: boolean, keys: string[], callback: () => void}) => void, + registerShortcut: (opts: {cmd: string, group: string, global: boolean, keys: string[], trigger: () => void, release: () => void}) => void, } let currentShortcuts = writable({id: {}, group: 'default'}) @@ -13,10 +13,12 @@ cmd: string, keys: string[], global: boolean, - callback: () => void, + trigger: () => void, + release: () => void, group: string, } + let triggered: Set = new Set() let keys: Set = new Set() let keystring = '' @@ -46,11 +48,25 @@ if (shortcut.group !== cur.group) continue if (!shortcut.global && shortcut.id !== cur.id) continue if (shortcut.keys.includes(keystring)) { - shortcut.callback() + triggered.add(keystring) + shortcut.trigger() } } }) window.addEventListener('keyup', (event: KeyboardEvent) => { + keystring = keysToString([...keys]) + + if (triggered.has(keystring)) { + triggered.delete(keystring) + for (let shortcut of get(shortcuts)) { + if (shortcut.group !== get(currentShortcuts).group) continue + if (!shortcut.global && shortcut.id !== get(currentShortcuts).id) continue + if (shortcut.keys.includes(keystring)) { + shortcut.release() + } + } + } + let key = normalizeKey(event) keys.delete(key.toLowerCase()) keystring = keysToString([...keys]) @@ -87,12 +103,12 @@ })(id, group, active) setContext(SHORTCUTS, { - registerShortcut: (opts: {cmd: string, keys: string[], global: boolean, callback: () => void}) => { + registerShortcut: (opts: {cmd: string, keys: string[], global: boolean, trigger: () => void, release: () => void}) => { shortcuts.update(shortcuts => { let keys = opts.keys.map(v => { return v.replaceAll('ctrl', 'control') }) - shortcuts.push({id, cmd: opts.cmd, group: group, global: opts.global, keys: keys.map(v=>keysToString(v.toLowerCase().split('+'))), callback: opts.callback}) + shortcuts.push({id, cmd: opts.cmd, group: group, global: opts.global, keys: keys.map(v=>keysToString(v.toLowerCase().split('+'))), trigger: opts.trigger, release: opts.release}) return shortcuts })