reactronic-dom
Version:
Reactronic DOM - Transactional Reactive Front-End Development Framework
144 lines (143 loc) • 5.95 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, sensitive, transaction, LoggingLevel } from 'reactronic';
import { grabElementDataList, SymDataForSensor } from './DataForSensor';
import { HtmlElementSensor } from './HtmlElementSensor';
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() {
super();
this.down = '';
this.up = '';
this.modifiers = KeyboardModifiers.None;
}
listen(element, enabled = true) {
const existing = this.sourceElement;
if (element !== existing) {
if (existing) {
existing.removeEventListener('keydown', this.onKeyDown.bind(this), { capture: true });
existing.removeEventListener('keyup', this.onKeyUp.bind(this), { capture: true });
}
this.sourceElement = element;
if (element && enabled) {
element.addEventListener('keydown', this.onKeyDown.bind(this), { capture: true });
element.addEventListener('keyup', this.onKeyUp.bind(this), { capture: true });
}
}
}
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);
}
keyDown(e) {
this.updateSensorData(e);
this.up = '';
sensitive(true, () => this.down = e.key);
}
keyUp(e) {
this.updateSensorData(e);
this.down = '';
sensitive(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", [Object, Boolean]),
__metadata("design:returntype", void 0)
], KeyboardSensor.prototype, "listen", null);
__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;
}