lazy-widgets
Version:
Typescript retained mode GUI for the HTML canvas API
83 lines • 2.76 kB
JavaScript
import { BaseClickHelper } from "./BaseClickHelper.js";
import { ClickHelperEventType } from "./ClickHelperEventType.js";
import { ClickState } from "./ClickState.js";
/**
* A class that mixes multiple {@link BaseClickHelper} instances into one.
* Useful if you want a widget to be both clickable by a pointer and by the
* enter key
*
* @category Helper
*/
export class CompoundClickHelper extends BaseClickHelper {
constructor(clickHelpers) {
super();
this._clickState = ClickState.Released;
this.refs = 0;
this.handleDependentEvent = (eventType) => {
switch (eventType) {
case ClickHelperEventType.Clicked:
this.dispatchEvent(eventType);
break;
case ClickHelperEventType.StateChanged:
{
const oldState = this._clickState;
this.updateClickState();
if (oldState !== this._clickState) {
this.dispatchEvent(eventType);
}
}
break;
}
};
this.clickHelpers = clickHelpers;
}
/**
* Start listening to all ClickHelpers events. Must be called when a widget
* that uses this CompoundClickHelper is attached to the UI tree
* (handleAttachment).
*/
ref() {
if (this.refs++ > 0) {
return;
}
this.updateClickState();
for (const helper of this.clickHelpers) {
helper.addEventListener(this.handleDependentEvent);
}
}
/**
* Stop listening to all ClickHelpers events. Must be called when a widget
* that uses this CompoundClickHelper is detached from the UI tree
* (handleDetachment).
*/
unref() {
if (this.refs === 0) {
console.warn('CompoundClickHelper double-unreferenced');
return;
}
if (--this.refs === 0) {
for (const helper of this.clickHelpers) {
helper.removeEventListener(this.handleDependentEvent);
}
}
}
updateClickState() {
let highestState = ClickState.Released;
for (const clickHelper of this.clickHelpers) {
if (clickHelper.clickState > highestState) {
highestState = clickHelper.clickState;
}
}
this._clickState = highestState;
}
get clickState() {
return this._clickState;
}
/** Resets each click helper instance being mixed. */
reset() {
for (const clickHelper of this.clickHelpers) {
clickHelper.reset();
}
}
}
//# sourceMappingURL=CompoundClickHelper.js.map