This commit is contained in:
sguenter 2024-01-01 20:39:37 +01:00
parent 44c3f6e149
commit 6f06337aee
2 changed files with 25 additions and 12 deletions

View File

@ -131,7 +131,6 @@ export class HotKeyManager<HotkeyConfig extends Record<string, HotkeyEntry<strin
if (this.ignoreFormElements && HotKeyManager.isFormElement(e.target)) {
return;
}
this.keyPressedMap.set(e.key.toLowerCase(), true);
this.checkHotkeys(e);
});
@ -197,10 +196,21 @@ export class HotKeyManager<HotkeyConfig extends Record<string, HotkeyEntry<strin
}, {} as HotkeyPressedMap<HotkeyConfig>);
}
private triggerListenerFor(key: keyof HotkeyConfig, event: KeyboardEvent) {
private triggerListenerFor(
key: keyof HotkeyConfig,
event: KeyboardEvent,
oldKeyMap: HotkeyPressedMap<HotkeyConfig>[keyof HotkeyConfig],
isRepeated: boolean,
) {
const pressedEntry = this.hotKeysPressedMap[key];
this.hotKeys[key].callbacks.forEach((callback) =>
callback({ event, subKeys: pressedEntry.subKeys, isPressed: pressedEntry.isPressed }),
callback({
event,
subKeys: pressedEntry.subKeys,
isPressed: pressedEntry.isPressed,
previous: oldKeyMap,
isRepeated,
}),
);
}
@ -223,19 +233,17 @@ export class HotKeyManager<HotkeyConfig extends Record<string, HotkeyEntry<strin
// Check for repeated pressed. Nothing changed, but key is pressed again
const eventKey = event.key.toLowerCase();
hotkeysToCheckAffection.forEach(([key]) => {
const hotkeysToTroggerAgain = hotkeysToCheckAffection.filter(([key]) => {
const keyDefinition = this.hotKeys[key];
if (HotKeyManager.checkAffections(keyDefinition.keys, eventKey)) {
hotkeysToTrigger.push(key);
} else {
ObjectHelper.values(keyDefinition.subKeys).forEach((subKeyDefinitions) => {
if (HotKeyManager.checkAffections(subKeyDefinitions, eventKey)) {
hotkeysToTrigger.push(key);
}
});
return true;
}
return ObjectHelper.values(keyDefinition.subKeys).some((subKeyDefinitions) => {
return HotKeyManager.checkAffections(subKeyDefinitions, eventKey);
});
});
hotkeysToTrigger.forEach((key) => this.triggerListenerFor(key, event));
hotkeysToTrigger.forEach((key) => this.triggerListenerFor(key, event, oldMap[key], false));
hotkeysToTroggerAgain.forEach(([key]) => this.triggerListenerFor(key, event, oldMap[key], true));
}
private clearMap(event: KeyboardEvent) {

View File

@ -2,6 +2,11 @@ export type HotkeyListenerEvent<SubKeys extends string | symbol | number> = {
event: KeyboardEvent;
subKeys: Record<SubKeys, boolean>;
isPressed: boolean;
previous: {
subKeys: Record<SubKeys, boolean>;
isPressed: boolean;
};
isRepeated: boolean;
};
export type HotkeyListener<SubKeys extends string | symbol | number> = (ev: HotkeyListenerEvent<SubKeys>) => unknown;