Add status bar
This commit is contained in:
parent
4df0c70c32
commit
e5988c173d
@ -28,6 +28,8 @@ export const Ansi = {
|
|||||||
HideCursor: ANSI_PREFIX + '?25l',
|
HideCursor: ANSI_PREFIX + '?25l',
|
||||||
ShowCursor: ANSI_PREFIX + '?25h',
|
ShowCursor: ANSI_PREFIX + '?25h',
|
||||||
GetCursorLocation: ANSI_PREFIX + '6n',
|
GetCursorLocation: ANSI_PREFIX + '6n',
|
||||||
|
InvertColor: ANSI_PREFIX + '7m',
|
||||||
|
ResetFormatting: ANSI_PREFIX + 'm',
|
||||||
moveCursor: function moveCursor(row: number, col: number): string {
|
moveCursor: function moveCursor(row: number, col: number): string {
|
||||||
// Convert to 1-based counting
|
// Convert to 1-based counting
|
||||||
row++;
|
row++;
|
||||||
|
@ -1,7 +1,14 @@
|
|||||||
import Ansi, { KeyCommand } from './ansi.ts';
|
import Ansi, { KeyCommand } from './ansi.ts';
|
||||||
import Buffer from './buffer.ts';
|
import Buffer from './buffer.ts';
|
||||||
import Document, { Row } from './document.ts';
|
import Document, { Row } from './document.ts';
|
||||||
import { IPoint, ITerminalSize, logToFile, maxAdd, VERSION } from './mod.ts';
|
import {
|
||||||
|
IPoint,
|
||||||
|
ITerminalSize,
|
||||||
|
logToFile,
|
||||||
|
maxAdd,
|
||||||
|
truncate,
|
||||||
|
VERSION,
|
||||||
|
} from './mod.ts';
|
||||||
import { ctrlKey, posSub } from './utils.ts';
|
import { ctrlKey, posSub } from './utils.ts';
|
||||||
|
|
||||||
export class Editor {
|
export class Editor {
|
||||||
@ -34,10 +41,16 @@ export class Editor {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
#render: IPoint;
|
#render: IPoint;
|
||||||
|
/**
|
||||||
|
* The name of the currently open file
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
#filename: string;
|
||||||
|
|
||||||
constructor(terminalSize: ITerminalSize) {
|
constructor(terminalSize: ITerminalSize) {
|
||||||
this.#buffer = new Buffer();
|
this.#buffer = new Buffer();
|
||||||
this.#screen = terminalSize;
|
this.#screen = terminalSize;
|
||||||
|
this.#screen.rows -= 1;
|
||||||
this.#cursor = {
|
this.#cursor = {
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
@ -52,6 +65,7 @@ export class Editor {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.#document = Document.empty();
|
this.#document = Document.empty();
|
||||||
|
this.#filename = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
private get currentRow(): Row | null {
|
private get currentRow(): Row | null {
|
||||||
@ -60,6 +74,7 @@ export class Editor {
|
|||||||
|
|
||||||
public async open(filename: string): Promise<Editor> {
|
public async open(filename: string): Promise<Editor> {
|
||||||
await this.#document.open(filename);
|
await this.#document.open(filename);
|
||||||
|
this.#filename = filename;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -198,6 +213,7 @@ export class Editor {
|
|||||||
this.#buffer.append(Ansi.HideCursor);
|
this.#buffer.append(Ansi.HideCursor);
|
||||||
this.#buffer.append(Ansi.ResetCursor);
|
this.#buffer.append(Ansi.ResetCursor);
|
||||||
this.drawRows();
|
this.drawRows();
|
||||||
|
this.drawStatusBar();
|
||||||
this.#buffer.append(
|
this.#buffer.append(
|
||||||
Ansi.moveCursor(
|
Ansi.moveCursor(
|
||||||
this.#cursor.y - this.#offset.y,
|
this.#cursor.y - this.#offset.y,
|
||||||
@ -226,11 +242,9 @@ export class Editor {
|
|||||||
this.drawFileRow(filerow);
|
this.drawFileRow(filerow);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y < this.#screen.rows - 1) {
|
|
||||||
this.#buffer.appendLine();
|
this.#buffer.appendLine();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private drawFileRow(y: number): void {
|
private drawFileRow(y: number): void {
|
||||||
const row = this.#document.row(y);
|
const row = this.#document.row(y);
|
||||||
@ -266,4 +280,24 @@ export class Editor {
|
|||||||
this.#buffer.append('~');
|
this.#buffer.append('~');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private drawStatusBar(): void {
|
||||||
|
this.#buffer.append(Ansi.InvertColor);
|
||||||
|
const name = (this.#filename !== '') ? this.#filename : '[No Name]';
|
||||||
|
const status = `${truncate(name, 20)} - ${this.#document.numRows} lines`;
|
||||||
|
const rstatus = `${this.#cursor.y + 1}/${this.#document.numRows}`;
|
||||||
|
let len = Math.min(status.length, this.#screen.cols);
|
||||||
|
this.#buffer.append(status, len);
|
||||||
|
|
||||||
|
while (len < this.#screen.cols) {
|
||||||
|
if (this.#screen.cols - len === rstatus.length) {
|
||||||
|
this.#buffer.append(rstatus);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
this.#buffer.append(' ');
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.#buffer.append(Ansi.ResetFormatting);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user