ascii-ui
Version:
Graphic terminal emulator for HTML canvas elements
54 lines • 1.66 kB
JavaScript
export class EventManager {
constructor(terminal) {
this.listeners = new Map();
this.terminal = terminal;
}
addListener(type, listener, widget) {
const target = widget || this.terminal;
let targets = this.listeners.get(type);
if (!targets) {
targets = new Map();
this.listeners.set(type, targets);
}
let listeners = targets.get(target);
if (!listeners) {
listeners = [];
targets.set(target, listeners);
}
listeners.push(listener);
}
removeListener(type, listener, widget) {
const target = widget || this.terminal;
const targets = this.listeners.get(type);
if (!targets) {
return;
}
const listeners = targets.get(target);
if (!listeners) {
return;
}
const index = listeners.indexOf(listener);
if (index !== -1) {
listeners.splice(index, 1);
}
}
trigger(event, widget) {
const path = widget ? [...this.terminal.getWidgetPath(widget), this.terminal] : [this.terminal];
const targets = this.listeners.get(event.type);
if (!targets) {
return;
}
for (const target of path) {
const listeners = targets.get(target);
if (listeners) {
for (const listener of listeners) {
listener(event, target);
if (event.isCancelled()) {
return;
}
}
}
}
}
}
//# sourceMappingURL=EventManager.js.map