@teaui/core
Version:
A high-level terminal UI library for Node
59 lines • 1.42 kB
JavaScript
export class TickManager {
#onRender;
#tickTimer;
#tickViews = new Set();
#needsRender = false;
constructor(onRender) {
this.#onRender = onRender;
}
reset() {
this.#tickViews = new Set();
}
endRender() {
if (!this.#tickViews.size) {
this.#stop();
}
else if (this.#tickViews.size) {
this.#start();
}
}
stop() {
this.#stop();
}
#start() {
if (this.#tickTimer) {
return;
}
let prevTime = Date.now();
this.#tickTimer = setInterval(() => {
const nextTime = Date.now();
this.triggerTick(nextTime - (prevTime ?? nextTime));
prevTime = nextTime;
}, 16);
}
#stop() {
if (!this.#tickTimer) {
return;
}
clearInterval(this.#tickTimer);
this.#tickTimer = undefined;
}
registerTick(view) {
this.#tickViews.add(view);
}
needsRender() {
this.#needsRender = true;
this.#start();
}
triggerTick(dt) {
let needsRender = this.#needsRender;
for (const view of this.#tickViews) {
needsRender = view.receiveTick(dt) || needsRender;
}
if (needsRender) {
this.#onRender();
this.#needsRender = false;
}
}
}
//# sourceMappingURL=TickManager.js.map