2021-06-14 22:03:55 -04:00
|
|
|
|
2021-06-22 22:38:49 -04:00
|
|
|
import chalk from 'chalk';
|
2021-06-14 22:03:55 -04:00
|
|
|
import blessed from 'neo-blessed';
|
|
|
|
|
import ansi from 'sisteransi';
|
2021-06-26 03:11:18 -04:00
|
|
|
import { boxStyle, getTheme } from '@themes';
|
|
|
|
|
export { Popup } from './Popup.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-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();
|
2021-06-26 03:11:18 -04:00
|
|
|
|
|
|
|
|
process.stdout.write('\x1b[?1049h');
|
|
|
|
|
|
2021-06-22 19:25:41 -04:00
|
|
|
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);
|
|
|
|
|
|
2021-06-26 13:07:11 -04:00
|
|
|
screen.key(['C-c'], function() {
|
2021-06-22 19:25:41 -04:00
|
|
|
process.stdout.write(ansi.cursor.show);
|
|
|
|
|
setTimeout(_ => {
|
|
|
|
|
process.exit(0);
|
|
|
|
|
})
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
screen.key('f2', () => {
|
|
|
|
|
rightPanel.focus();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
screen.key('f1', () => {
|
|
|
|
|
leftPanel.focus();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
started = true;
|
|
|
|
|
setTitle('');
|
2021-06-22 22:38:49 -04:00
|
|
|
}
|
|
|
|
|
|
2021-06-26 03:11:18 -04:00
|
|
|
export function stop() {
|
|
|
|
|
screen.destroy();
|
|
|
|
|
process.stdout.write('\x1b[?1049l');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// move to some debugging shit, idk
|
2021-06-22 22:38:49 -04:00
|
|
|
let ansiTestCard = '{center}';
|
|
|
|
|
for(let i = 16; i < 34; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 52; i < 70; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 88; i < 106; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 124; i < 142; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 160; i < 178; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 196; i < 214; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
ansiTestCard += '\n';
|
|
|
|
|
for(let i = 34; i < 52; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 70; i < 88; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 106; i < 124; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 142; i < 160; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 178; i < 196; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
for(let i = 214; i < 232; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} ${(i-15)%6===0?chalk.reset(' '):''}`); ansiTestCard += '\n';
|
|
|
|
|
ansiTestCard += '\n';
|
|
|
|
|
for(let i = 232; i < 256; i ++) ansiTestCard += chalk.bgAnsi256(i).black(` ${i.toString().padStart(3, ' ')} `)
|
|
|
|
|
ansiTestCard += '{/center}';
|
|
|
|
|
|
|
|
|
|
export {
|
|
|
|
|
ansiTestCard
|
|
|
|
|
};
|