verstak
Version:
Verstak - Front-End Library
145 lines (144 loc) • 6.11 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { options, runSensitive, transaction, LoggingLevel, Transaction } from "reactronic";
import { grabElementDataList, SymDataForSensor } from "./DataForSensor.js";
import { HtmlElementSensor } from "./HtmlElementSensor.js";
export var KeyboardModifiers;
(function (KeyboardModifiers) {
KeyboardModifiers[KeyboardModifiers["none"] = 0] = "none";
KeyboardModifiers[KeyboardModifiers["ctrl"] = 1] = "ctrl";
KeyboardModifiers[KeyboardModifiers["shift"] = 2] = "shift";
KeyboardModifiers[KeyboardModifiers["alt"] = 4] = "alt";
KeyboardModifiers[KeyboardModifiers["meta"] = 8] = "meta";
KeyboardModifiers[KeyboardModifiers["ctrlShift"] = 3] = "ctrlShift";
KeyboardModifiers[KeyboardModifiers["ctrlAlt"] = 5] = "ctrlAlt";
KeyboardModifiers[KeyboardModifiers["ctrlMeta"] = 9] = "ctrlMeta";
KeyboardModifiers[KeyboardModifiers["ctrlShiftAlt"] = 7] = "ctrlShiftAlt";
KeyboardModifiers[KeyboardModifiers["ctrlShiftAltMeta"] = 15] = "ctrlShiftAltMeta";
KeyboardModifiers[KeyboardModifiers["ctrlShiftMeta"] = 11] = "ctrlShiftMeta";
KeyboardModifiers[KeyboardModifiers["shiftAlt"] = 6] = "shiftAlt";
KeyboardModifiers[KeyboardModifiers["shiftMeta"] = 10] = "shiftMeta";
KeyboardModifiers[KeyboardModifiers["shiftAltMeta"] = 14] = "shiftAltMeta";
KeyboardModifiers[KeyboardModifiers["altMeta"] = 12] = "altMeta";
})(KeyboardModifiers || (KeyboardModifiers = {}));
export class KeyboardSensor extends HtmlElementSensor {
constructor(element) {
super(element);
this.down = "";
this.up = "";
this.modifiers = KeyboardModifiers.none;
}
listen(enabled = true) {
const t = Transaction.current;
Transaction.outside(() => {
t.whenFinished(true).then(() => {
const element = this.sourceElement;
if (enabled) {
element.addEventListener("keydown", this.onKeyDown.bind(this), { capture: true });
element.addEventListener("keyup", this.onKeyUp.bind(this), { capture: true });
window.addEventListener("blur", this.doWindowBlur.bind(this), { capture: true });
}
else {
element.removeEventListener("keydown", this.onKeyDown.bind(this), { capture: true });
element.removeEventListener("keyup", this.onKeyUp.bind(this), { capture: true });
window.removeEventListener("blur", this.doWindowBlur.bind(this), { capture: true });
}
}, e => { });
});
}
reset() {
this.preventDefault = false;
this.stopPropagation = false;
this.down = "";
this.up = "";
this.modifiers = KeyboardModifiers.none;
}
onKeyDown(e) {
this.keyDown(e);
this.setPreventDefaultAndStopPropagation(e);
}
onKeyUp(e) {
this.keyUp(e);
this.setPreventDefaultAndStopPropagation(e);
}
doWindowBlur(e) {
this.reset();
}
keyDown(e) {
this.updateSensorData(e);
this.up = "";
runSensitive(true, () => this.down = e.key);
}
keyUp(e) {
this.updateSensorData(e);
this.down = "";
runSensitive(true, () => this.up = e.key);
}
updateSensorData(e) {
this.preventDefault = false;
this.stopPropagation = false;
const path = e.composedPath();
this.elementDataList = grabElementDataList(path, SymDataForSensor, "keyboard", this.elementDataList).dataList;
this.modifiers = extractModifierKeys(e);
this.revision++;
}
static getKeyAsModifierIfAny(key) {
let modifier = KeyboardModifiers.none;
if (key === "Control")
modifier = KeyboardModifiers.ctrl;
else if (key === "Shift")
modifier = KeyboardModifiers.shift;
else if (key === "Alt")
modifier = KeyboardModifiers.alt;
else if (key === "Meta")
modifier = KeyboardModifiers.meta;
return modifier;
}
}
__decorate([
transaction,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], KeyboardSensor.prototype, "reset", null);
__decorate([
transaction,
options({ logging: LoggingLevel.Off }),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], KeyboardSensor.prototype, "keyDown", null);
__decorate([
transaction,
options({ logging: LoggingLevel.Off }),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], KeyboardSensor.prototype, "keyUp", null);
export function extractModifierKeys(e) {
let modifiers = KeyboardModifiers.none;
if (e.ctrlKey)
modifiers |= KeyboardModifiers.ctrl;
else
modifiers &= ~KeyboardModifiers.ctrl;
if (e.shiftKey)
modifiers |= KeyboardModifiers.shift;
else
modifiers &= ~KeyboardModifiers.shift;
if (e.altKey)
modifiers |= KeyboardModifiers.alt;
else
modifiers &= ~KeyboardModifiers.alt;
if (e.metaKey)
modifiers |= KeyboardModifiers.meta;
else
modifiers &= ~KeyboardModifiers.meta;
return modifiers;
}