@webwriter/geometry-cloze
Version:
Create and view geometry exercises with coloring, styling and labeling options.
55 lines (47 loc) • 1.61 kB
text/typescript
import Debouncer from '../helper/Debouncer';
import InteractionManager from './InteractionManager';
export default class CanvasManager extends InteractionManager {
private updateDebouncer = new Debouncer(
this.sendUpdate.bind(this),
500,
2000
);
requestRedraw(originallyScheduledAt?: number) {
super.requestRedraw(originallyScheduledAt);
this.updateDebouncer.call();
}
private sendUpdate() {
const exportedData = this.export();
this.updateListeners.forEach((listener) => listener(exportedData));
}
private updateListeners: ((exportedData: CanvasData) => void)[] = [];
public addUpdateListener(listener: (exportedData: any) => void) {
this.updateListeners.push(listener);
}
public removeUpdateListener(listener: (exportedData: CanvasData) => void) {
const index = this.updateListeners.indexOf(listener);
if (index < 0) return;
this.updateListeners.splice(index, 1);
}
private _abstractRightAngle = false;
public get abstractRightAngle() {
return this._abstractRightAngle;
}
public set abstractRightAngle(value: boolean) {
this._abstractRightAngle = value;
this.requestRedraw();
}
public export() {
return {
...super.export(),
abstractRightAngle: this.abstractRightAngle
};
}
public import(data: Partial<ReturnType<this['export']>>) {
super.import(data);
if (data.abstractRightAngle !== undefined) {
this.abstractRightAngle = data.abstractRightAngle;
}
}
}
export type CanvasData = ReturnType<CanvasManager['export']>;