Sean Cross ceb2d55543 refactor everything to typescript
We don't need React -- we'll reinvent it ourselves!

Signed-off-by: Sean Cross <sean@xobs.io>
2023-12-02 11:17:23 +08:00

77 lines
2.7 KiB
TypeScript

import { FarpatchWidget, makeNavView } from "../interfaces";
import { Terminal } from '@xterm/xterm';
import { FitAddon } from '@xterm/addon-fit';
import { SerializeAddon } from '@xterm/addon-serialize';
export class DebugWidget implements FarpatchWidget {
name: string;
icon: string = "scroll";
title: string = "Debug";
index: number = 0;
view: HTMLElement;
navItem: HTMLElement;
terminal: Terminal;
fitAddon: FitAddon;
serializeAddon: SerializeAddon;
resizeFunction: () => void;
initialized: boolean = false;
constructor(name: string) {
this.name = name;
this.navItem = makeNavView(name, this.icon, this.title);
this.view = document.createElement("div");
this.view.classList.add("terminal");
this.terminal = new Terminal({ theme: { background: "#000000" } });
this.fitAddon = new FitAddon();
this.serializeAddon = new SerializeAddon();
this.resizeFunction = this.resizeTerminal.bind(this);
}
updateIndex(index: number): void {
this.index = index;
}
onInit(): void {
console.log("Initialized Debug Widget");
}
onFocus(element: HTMLElement): void {
console.log("Displaying Debug Widget");
if (!this.initialized) {
// Ensure the parent frame doesn't get any scrollbars, since we're taking up the whole view
element.style.overflow = "hidden";
console.log("Initializing xterm.js");
// var terminalContainer = document.createElement("div");
// this.view.appendChild(terminalContainer);
this.terminal.loadAddon(this.fitAddon);
this.terminal.loadAddon(this.serializeAddon);
this.terminal.onKey((e) => {
console.log("Key pressed: " + e.key);
this.terminal.write(e.key);
if (e.key === '\r') {
this.terminal.write('\n');
}
});
this.terminal.open(this.view);
this.terminal.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n');
this.initialized = true;
}
element.appendChild(this.view);
window.addEventListener('resize', this.resizeFunction);
window.setTimeout(() => {
this.terminal.focus();
this.resizeFunction();
}, 10);
}
onBlur(element: HTMLElement): void {
console.log("Archiving UART Widget");
element.removeChild(this.view);
window.removeEventListener('resize', this.resizeFunction);
}
// Whenever the window is resized, update the size of the terminal
resizeTerminal() {
this.fitAddon.fit();
}
}