hadean-old/src/ui/UI.ts

133 lines
2.4 KiB
TypeScript
Raw Normal View History

2021-06-14 22:03:55 -04:00
import blessed from 'neo-blessed';
import ansi from 'sisteransi';
2021-06-22 19:25:41 -04:00
import { getTheme } from '../registries/Themes.js';
2021-06-14 22:03:55 -04:00
export interface Renderable {
2021-06-18 21:29:45 -04:00
render(): void
2021-06-14 22:03:55 -04:00
}
2021-06-18 21:29:45 -04:00
// TODO move this to theme
2021-06-15 19:15:49 -04:00
export const boxStyle = () => {
return {
style: {
border: {
2021-06-18 02:02:50 -04:00
fg: getTheme().border.normal
2021-06-15 19:15:49 -04:00
},
focus: {
border: {
2021-06-18 02:02:50 -04:00
fg: getTheme().border.focused
2021-06-15 19:15:49 -04:00
}
}
},
border: {
type: 'line'
}
};
};
2021-06-14 22:03:55 -04:00
2021-06-22 19:25:41 -04:00
let leftPanel: any;
let rightPanel: any;
let titleBar: any;
let screen: any;
let currentRenderable: Renderable = null;
let started = false;
2021-06-14 22:03:55 -04:00
2021-06-22 19:25:41 -04:00
function assertStarted() {
if(!started) throw new Error('Attempted accessing UI before starting it!');
2021-06-15 21:53:00 -04:00
}
2021-06-22 19:25:41 -04:00
function assertNotStarted() {
if(started) throw new Error('Attempted starting UI when already started!');
}
2021-06-15 21:53:00 -04:00
2021-06-22 19:25:41 -04:00
export function isStarted() {
return started;
}
2021-06-14 22:03:55 -04:00
2021-06-22 19:25:41 -04:00
export const panels = {
get left() {
assertStarted()
return leftPanel;
},
get right() {
assertStarted()
return rightPanel;
},
get screen() {
assertStarted()
return screen;
}
}
2021-06-14 22:03:55 -04:00
2021-06-22 19:25:41 -04:00
export function setTitle(title: string) {
assertStarted();
titleBar.setContent(` ${getTheme().header(title)}{|}${getTheme().subheader('v0.1.0')} {/}`);
}
2021-06-14 22:03:55 -04:00
2021-06-22 19:25:41 -04:00
export function render(thing?: Renderable) {
assertStarted();
if(!!thing) currentRenderable = thing;
2021-06-16 15:26:42 -04:00
2021-06-22 19:25:41 -04:00
currentRenderable.render();
screen.render();
}
2021-06-16 15:26:42 -04:00
2021-06-22 19:25:41 -04:00
export function start() {
assertNotStarted();
screen = blessed.screen({
smartCSR: true,
terminal: 'xterm-256color'
});
leftPanel = blessed.box({
top: 1,
left: 0,
width: '50%',
height: '100%-1',
...boxStyle(),
tags: true
});
rightPanel = blessed.box({
top: 1,
right: 0,
width: '50%',
height: '100%-1',
...boxStyle(),
tags: true
});
titleBar = blessed.box({
top: 0,
left: 0,
width: '100%',
height: 1,
tags: true,
});
screen.append(leftPanel);
screen.append(rightPanel);
screen.append(titleBar);
rightPanel.focus();
process.stdout.write(ansi.cursor.hide);
screen.key(['C-c'], function(ch, key) {
process.stdout.write(ansi.cursor.show);
setTimeout(_ => {
process.exit(0);
})
});
screen.key('f2', () => {
rightPanel.focus();
});
screen.key('f1', () => {
leftPanel.focus();
});
started = true;
setTitle('');
}