Add release dispatch in addition to trigger

main
kts of kettek 2024-02-16 18:59:17 -08:00
parent 1845451c09
commit 26356e78d3
2 changed files with 24 additions and 6 deletions

View File

@ -11,8 +11,10 @@
export let global: boolean = false export let global: boolean = false
const { registerShortcut } = getContext(SHORTCUTS) as ShortcutsType const { registerShortcut } = getContext(SHORTCUTS) as ShortcutsType
registerShortcut({cmd, group, global, keys, callback: () => { registerShortcut({cmd, group, global, keys, trigger: () => {
dispatch('trigger', {}) dispatch('trigger', {})
}, release: () => {
dispatch('release', {})
}}) }})
</script> </script>

View File

@ -3,7 +3,7 @@
import { get, writable } from 'svelte/store' import { get, writable } from 'svelte/store'
export const SHORTCUTS = {} export const SHORTCUTS = {}
export type ShortcutsType = { 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'}) let currentShortcuts = writable({id: {}, group: 'default'})
@ -13,10 +13,12 @@
cmd: string, cmd: string,
keys: string[], keys: string[],
global: boolean, global: boolean,
callback: () => void, trigger: () => void,
release: () => void,
group: string, group: string,
} }
let triggered: Set<string> = new Set()
let keys: Set<string> = new Set() let keys: Set<string> = new Set()
let keystring = '' let keystring = ''
@ -46,11 +48,25 @@
if (shortcut.group !== cur.group) continue if (shortcut.group !== cur.group) continue
if (!shortcut.global && shortcut.id !== cur.id) continue if (!shortcut.global && shortcut.id !== cur.id) continue
if (shortcut.keys.includes(keystring)) { if (shortcut.keys.includes(keystring)) {
shortcut.callback() triggered.add(keystring)
shortcut.trigger()
} }
} }
}) })
window.addEventListener('keyup', (event: KeyboardEvent) => { 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) let key = normalizeKey(event)
keys.delete(key.toLowerCase()) keys.delete(key.toLowerCase())
keystring = keysToString([...keys]) keystring = keysToString([...keys])
@ -87,12 +103,12 @@
})(id, group, active) })(id, group, active)
setContext(SHORTCUTS, { 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 => { shortcuts.update(shortcuts => {
let keys = opts.keys.map(v => { let keys = opts.keys.map(v => {
return v.replaceAll('ctrl', 'control') 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 return shortcuts
}) })