Add release dispatch in addition to trigger
parent
1845451c09
commit
26356e78d3
|
@ -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>
|
|
@ -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
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue