97 lines
2.3 KiB
TypeScript
97 lines
2.3 KiB
TypeScript
import { ce } from 'morphux';
|
|
import { delay } from './utils';
|
|
import { Main } from './main';
|
|
import { AnsiUp } from 'ansi_up';
|
|
|
|
export class LogsHandler {
|
|
private _Main: Main;
|
|
|
|
ansiUp = new AnsiUp();
|
|
|
|
cameraLogsContainer: HTMLDivElement = document.querySelector(
|
|
'.ntsh_tab[tabid="cameralogs"] .ntsh_logs'
|
|
);
|
|
unityLogsContainer: HTMLDivElement = document.querySelector(
|
|
'.ntsh_tab[tabid="unitylogs"] .ntsh_logs'
|
|
);
|
|
|
|
constructor(Main: Main) {
|
|
this._Main = Main;
|
|
|
|
this.registerListeners();
|
|
}
|
|
|
|
setCameraLogs(logs: string[]) {
|
|
this.applyLogs(this.cameraLogsContainer, logs);
|
|
}
|
|
|
|
setUnityLogs(logs: string[]) {
|
|
this.applyLogs(this.unityLogsContainer, logs);
|
|
}
|
|
|
|
private firstTime: Set<HTMLDivElement> = new Set();
|
|
|
|
private async applyLogs(container: HTMLDivElement, logs: string[]) {
|
|
let logCount = container.querySelectorAll(
|
|
'.ntsh_log.ntsh_log-normal'
|
|
).length;
|
|
if (logCount === logs.length) return;
|
|
if (logCount > logs.length) logCount = 0;
|
|
|
|
const isAtBottom =
|
|
!this.firstTime.has(container) ||
|
|
container.scrollTop + container.clientHeight >=
|
|
container.scrollHeight;
|
|
|
|
container.innerHTML = '';
|
|
|
|
logs.forEach((log, i) => {
|
|
const element = ce(
|
|
'div',
|
|
['ntsh_log', 'ntsh_log-normal'],
|
|
null,
|
|
null,
|
|
this.ansiUp.ansi_to_html(log)
|
|
);
|
|
|
|
if (this.firstTime.has(container) && i > logCount - 1) {
|
|
element.style.display = 'none';
|
|
const spawnDelay = (i - logCount) * 10;
|
|
setTimeout(() => {
|
|
element.style.display = 'block';
|
|
if (isAtBottom)
|
|
container.scrollTop = container.scrollHeight;
|
|
}, spawnDelay);
|
|
}
|
|
|
|
container.appendChild(element);
|
|
if (isAtBottom) container.scrollTop = container.scrollHeight;
|
|
});
|
|
|
|
if (!this.firstTime.has(container)) {
|
|
container.scrollTop = container.scrollHeight;
|
|
this.firstTime.add(container);
|
|
}
|
|
}
|
|
|
|
private registerListeners() {
|
|
this._Main.TabController.registerListener('cameralogs', (visible) => {
|
|
if (!visible) return;
|
|
|
|
setTimeout(() => {
|
|
this.cameraLogsContainer.scrollTop =
|
|
this.cameraLogsContainer.scrollHeight;
|
|
}, 10);
|
|
});
|
|
|
|
this._Main.TabController.registerListener('unitylogs', (visible) => {
|
|
if (!visible) return;
|
|
|
|
setTimeout(() => {
|
|
this.unityLogsContainer.scrollTop =
|
|
this.unityLogsContainer.scrollHeight;
|
|
}, 10);
|
|
});
|
|
}
|
|
}
|