| class KeyEventService extends EventTarget { | |
| constructor() { | |
| var _a, _b, _c; | |
| super(); | |
| this.downKeys = {}; | |
| this.ctrlKey = false; | |
| this.altKey = false; | |
| this.metaKey = false; | |
| this.shiftKey = false; | |
| this.isMac = !!(((_a = navigator.platform) === null || _a === void 0 ? void 0 : _a.toLocaleUpperCase().startsWith("MAC")) || | |
| ((_c = (_b = navigator.userAgentData) === null || _b === void 0 ? void 0 : _b.platform) === null || _c === void 0 ? void 0 : _c.toLocaleUpperCase().startsWith("MAC"))); | |
| this.initialize(); | |
| } | |
| initialize() { | |
| const that = this; | |
| const processKey = LGraphCanvas.prototype.processKey; | |
| LGraphCanvas.prototype.processKey = function (e) { | |
| if (e.type === "keydown" || e.type === "keyup") { | |
| that.handleKeyDownOrUp(e); | |
| } | |
| return processKey.apply(this, [...arguments]); | |
| }; | |
| window.addEventListener("keydown", (e) => { | |
| that.handleKeyDownOrUp(e); | |
| }); | |
| window.addEventListener("keyup", (e) => { | |
| that.handleKeyDownOrUp(e); | |
| }); | |
| document.addEventListener("visibilitychange", (e) => { | |
| this.clearKeydowns(); | |
| }); | |
| window.addEventListener("blur", (e) => { | |
| this.clearKeydowns(); | |
| }); | |
| } | |
| handleKeyDownOrUp(e) { | |
| const key = e.key.toLocaleUpperCase(); | |
| if ((e.type === 'keydown' && this.downKeys[key] === true) | |
| || (e.type === 'keyup' && this.downKeys[key] === undefined)) { | |
| return; | |
| } | |
| this.ctrlKey = !!e.ctrlKey; | |
| this.altKey = !!e.altKey; | |
| this.metaKey = !!e.metaKey; | |
| this.shiftKey = !!e.shiftKey; | |
| if (e.type === "keydown") { | |
| this.downKeys[key] = true; | |
| this.dispatchCustomEvent("keydown", { originalEvent: e }); | |
| } | |
| else if (e.type === "keyup") { | |
| if (key === "META" && this.isMac) { | |
| this.clearKeydowns(); | |
| } | |
| else { | |
| delete this.downKeys[key]; | |
| } | |
| this.dispatchCustomEvent("keyup", { originalEvent: e }); | |
| } | |
| } | |
| clearKeydowns() { | |
| this.ctrlKey = false; | |
| this.altKey = false; | |
| this.metaKey = false; | |
| this.shiftKey = false; | |
| for (const key in this.downKeys) | |
| delete this.downKeys[key]; | |
| } | |
| dispatchCustomEvent(event, detail) { | |
| if (detail != null) { | |
| return this.dispatchEvent(new CustomEvent(event, { detail })); | |
| } | |
| return this.dispatchEvent(new CustomEvent(event)); | |
| } | |
| getKeysFromShortcut(shortcut) { | |
| let keys; | |
| if (typeof shortcut === "string") { | |
| shortcut = shortcut.replace(/\s/g, ""); | |
| shortcut = shortcut.replace(/^\+/, "__PLUS__").replace(/\+\+/, "+__PLUS__"); | |
| keys = shortcut.split("+").map((i) => i.replace("__PLUS__", "+")); | |
| } | |
| else { | |
| keys = [...shortcut]; | |
| } | |
| return keys.map((k) => k.toLocaleUpperCase()); | |
| } | |
| areAllKeysDown(keys) { | |
| keys = this.getKeysFromShortcut(keys); | |
| return keys.every((k) => { | |
| return this.downKeys[k]; | |
| }); | |
| } | |
| areOnlyKeysDown(keys, alsoAllowShift = false) { | |
| keys = this.getKeysFromShortcut(keys); | |
| const allKeysDown = this.areAllKeysDown(keys); | |
| const downKeysLength = Object.values(this.downKeys).length; | |
| if (allKeysDown && keys.length === downKeysLength) { | |
| return true; | |
| } | |
| if (alsoAllowShift && !keys.includes("SHIFT") && keys.length === downKeysLength - 1) { | |
| return allKeysDown && this.areAllKeysDown(["SHIFT"]); | |
| } | |
| return false; | |
| } | |
| } | |
| export const SERVICE = new KeyEventService(); | |