diff --git a/ts/components/Shortcut.svelte b/ts/components/Shortcut.svelte index 29d63d098..0c8e77bfe 100644 --- a/ts/components/Shortcut.svelte +++ b/ts/components/Shortcut.svelte @@ -9,13 +9,18 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import { registerShortcut } from "../lib/shortcuts"; export let keyCombination: string; + export let event: "keydown" | "keyup" | undefined = undefined; const dispatch = createEventDispatcher(); onMount(() => - registerShortcut((event: KeyboardEvent) => { - preventDefault(event); - dispatch("action", { originalEvent: event }); - }, keyCombination), + registerShortcut( + (event: KeyboardEvent) => { + preventDefault(event); + dispatch("action", { originalEvent: event }); + }, + keyCombination, + { event }, + ), ); diff --git a/ts/editable/content-editable.ts b/ts/editable/content-editable.ts index 4dd28a279..48fafa31b 100644 --- a/ts/editable/content-editable.ts +++ b/ts/editable/content-editable.ts @@ -126,7 +126,7 @@ if (isApplePlatform()) { export function preventBuiltinShortcuts(editable: HTMLElement): void { for (const keyCombination of ["Control+B", "Control+U", "Control+I"]) { - registerShortcut(preventDefault, keyCombination, editable); + registerShortcut(preventDefault, keyCombination, { target: editable }); } } diff --git a/ts/editor/PlainTextBadge.svelte b/ts/editor/PlainTextBadge.svelte index 36c267b65..838d48ad1 100644 --- a/ts/editor/PlainTextBadge.svelte +++ b/ts/editor/PlainTextBadge.svelte @@ -22,8 +22,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html off = !off; } - function shortcut(element: HTMLElement): void { - registerShortcut(toggle, keyCombination, element); + function shortcut(target: HTMLElement): () => void { + return registerShortcut(toggle, keyCombination, { target }); } onMount(() => editorField.element.then(shortcut)); diff --git a/ts/editor/StickyBadge.svelte b/ts/editor/StickyBadge.svelte index 79c1fada2..0b264c6c8 100644 --- a/ts/editor/StickyBadge.svelte +++ b/ts/editor/StickyBadge.svelte @@ -27,8 +27,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html }); } - function shortcut(element: HTMLElement): void { - registerShortcut(toggle, keyCombination, element); + function shortcut(target: HTMLElement): () => void { + return registerShortcut(toggle, keyCombination, { target }); } onMount(() => editorField.element.then(shortcut)); diff --git a/ts/editor/editor-toolbar/ClozeButton.svelte b/ts/editor/editor-toolbar/ClozeButton.svelte index 6073ed995..eb6fa8579 100644 --- a/ts/editor/editor-toolbar/ClozeButton.svelte +++ b/ts/editor/editor-toolbar/ClozeButton.svelte @@ -63,4 +63,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html {@html ellipseIcon} - onCloze(event.detail.originalEvent)} /> + onCloze(event.detail.originalEvent)} +/> diff --git a/ts/lib/shortcuts.ts b/ts/lib/shortcuts.ts index 0a4d55cdf..e4da2732d 100644 --- a/ts/lib/shortcuts.ts +++ b/ts/lib/shortcuts.ts @@ -142,11 +142,28 @@ function innerShortcut( } } +export interface RegisterShortcutRestParams { + target: EventTarget; + /// There might be no good reason to use `keyup` other + /// than to circumvent Qt bugs + event: "keydown" | "keyup"; +} + +const defaultRegisterShortcutRestParams = { + target: document, + event: "keydown" as const, +}; + export function registerShortcut( callback: (event: KeyboardEvent) => void, keyCombinationString: string, - target: EventTarget | Document = document, + restParams: Partial = defaultRegisterShortcutRestParams, ): () => void { + const { + target = defaultRegisterShortcutRestParams.target, + event = defaultRegisterShortcutRestParams.event, + } = restParams; + const [check, ...restChecks] = splitKeyCombinationString(keyCombinationString).map(keyCombinationToCheck); @@ -156,7 +173,7 @@ export function registerShortcut( } } - return on(target, "keydown", handler); + return on(target, event, handler); } registerPackage("anki/shortcuts", { diff --git a/ts/sveltelib/shortcut.ts b/ts/sveltelib/shortcut.ts index 897a51e6b..cde3a505d 100644 --- a/ts/sveltelib/shortcut.ts +++ b/ts/sveltelib/shortcut.ts @@ -1,26 +1,23 @@ // Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html +import type { RegisterShortcutRestParams } from "../lib/shortcuts"; import { registerShortcut } from "../lib/shortcuts"; +interface ShortcutParams { + action: (event: KeyboardEvent) => void; + keyCombination: string; + params?: RegisterShortcutRestParams; +} + export function shortcut( _node: Node, - { - action, - keyCombination, - target, - }: { - action: (event: KeyboardEvent) => void; - keyCombination: string; - target?: EventTarget; - }, + { action, keyCombination, params }: ShortcutParams, ): { destroy: () => void } { - const deregister = registerShortcut(action, keyCombination, target ?? document); + const deregister = registerShortcut(action, keyCombination, params); return { - destroy() { - deregister(); - }, + destroy: deregister, }; }