|
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(); |
|
|