@react-slate/core
Version:
Write interactive CLI apps with React
88 lines • 3.04 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EventTypes;
(function (EventTypes) {
EventTypes["MOUSE_LEFT_BUTTON_PRESSED"] = "MOUSE_LEFT_BUTTON_PRESSED";
EventTypes["MOUSE_WHEEL"] = "MOUSE_WHEEL";
EventTypes["MOUSE_MOTION"] = "MOUSE_MOTION";
})(EventTypes = exports.EventTypes || (exports.EventTypes = {}));
class EventManager {
constructor() {
this.propagate = (name, eventData, rootListener) => {
if (rootListener.listenerCount <= 0) {
return false;
}
const handled = rootListener.children.some(child => this.propagate(name, eventData, child));
if (handled) {
return true;
}
const handler = rootListener.listeners[name];
const validator = rootListener.validator;
if (typeof handler === 'function' &&
(!validator || validator(name, eventData))) {
return Boolean(handler(eventData));
}
return false;
};
}
propagateEvent(name, eventData, rootListener) {
return this.propagate(name, eventData, rootListener);
}
}
exports.EventManager = EventManager;
class EventListener {
constructor() {
this.children = [];
this.listeners = {};
this.listenerCount = 0;
}
updateListenerCount(value) {
this.listenerCount += value;
if (this.parent) {
this.parent.updateListenerCount(value);
}
}
addChild(child) {
child.parent = this;
this.children.push(child);
this.updateListenerCount(child.listenerCount);
}
findChild(child) {
return this.children.indexOf(child);
}
removeChild(child) {
child.parent = undefined;
const index = this.findChild(child);
this.children.splice(index, 1);
this.updateListenerCount(-child.listenerCount);
}
setListener(eventName, listener) {
// If both values are undefined or the same, do nothing.
if (this.listeners[eventName] === listener) {
return;
}
// If both values are not undefined, swap for new listener without changing the count.
if (this.listeners[eventName] && listener) {
this.listeners[eventName] = listener;
}
else {
// If initial listener is added or listener is removed, update the count.
this.updateListenerCount(listener ? 1 : -1);
this.listeners[eventName] = listener;
}
}
setOnClickListener(listener) {
this.setListener(EventTypes.MOUSE_LEFT_BUTTON_PRESSED, listener);
}
setValidator(validator) {
this.validator = validator;
}
setOnWheelListener(listener) {
this.setListener(EventTypes.MOUSE_WHEEL, listener);
}
setOnMouseMoveListener(listener) {
this.setListener(EventTypes.MOUSE_MOTION, listener);
}
}
exports.EventListener = EventListener;
//# sourceMappingURL=events.js.map