Compare commits

...

2 Commits

3 changed files with 27 additions and 6 deletions

View File

@ -42,10 +42,12 @@
let toolBrush = new BrushTool()
let toolPicker = new PickerTool()
let currentTool: Tool = toolBrush
let previousTool: Tool = null
let brushSize: number = 1
let brushType: BrushType = 'circle'
function swapTool(tool: Tool) {
previousTool = currentTool
currentTool = tool
}
@ -116,6 +118,7 @@
<Shortcuts group='editor2D'>
<Shortcut global cmd='selection' keys={['s']} on:trigger={()=>swapTool(toolSelection)} />
<Shortcut global cmd='brush' keys={['b']} on:trigger={()=>swapTool(toolBrush)} />
<Shortcut global cmd='brushToPicker' keys={['alt']} on:trigger={()=>currentTool===toolBrush?swapTool(toolPicker):null} on:release={()=>previousTool===toolBrush&&currentTool===toolPicker?swapTool(toolBrush):null} />
<Shortcut global cmd='fill' keys={['f']} on:trigger={()=>swapTool(toolFill)} />
<Shortcut global cmd='picker' keys={['i']} on:trigger={()=>swapTool(toolPicker)} />
<Shortcut global cmd='erase' keys={['e']} on:trigger={()=>swapTool(toolErase)} />

View File

@ -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', {})
}})
</script>

View File

@ -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<string> = new Set()
let keys: Set<string> = 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
})