Mercurial
changeset 4:4016ab04414d main tip
Implemented simple titlebar with repo and branch name
| author | luxanna <l.lux@magenta.de> |
|---|---|
| date | Mon, 18 May 2026 23:45:48 +0200 |
| parents | 7e3c01987454 |
| children | |
| files | cmd/hg-wolp.ha |
| diffstat | 1 files changed, 87 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/cmd/hg-wolp.ha Mon May 18 23:44:11 2026 +0200 +++ b/cmd/hg-wolp.ha Mon May 18 23:45:48 2026 +0200 @@ -1,14 +1,97 @@ use termbox; -use os; use types::c; use fmt; +use time; +use strings; +use fs; +use io; +use path; +use os; +use encoding::utf8; //use hg; +fn branch_name() (str | utf8::invalid) = { + let cwd = path::init(strings::dup(os::getcwd())!)!; + let branch_filep = path::push(&cwd, ".hg", "branch")!; + let buf: [32]u8 = [0...]; + let fp = fs::open(os::cwd, branch_filep)!; + let sz: size = 0; + match(io::readall(fp, buf)){ + case let e: io::error => { + if(e is io::underread) + sz = e: size; + }; + case => none(); + }; + return strings::fromutf8(buf[..sz-1]); +}; + +// Helper fn to draw a string within a line and return the next position +fn draw_str(x: u16, y: u16, text: str) u16 = { + let iter = strings::iter(text); + for(let r => strings::next(&iter)){ + termbox::change_cell(x, y, r); + //Assume ascii width of 1 for now + x+=1; + }; + return x; +}; + +fn draw_title_bar(ts: termbox::resize_event) void = { + let title = path::basename(strings::dup(os::getcwd())!); + let branch = branch_name()!; + let x: u16 = ((ts.w: size - (len(title) + len(branch) + 3))/2): u16; + x = draw_str(x, 0, title); + termbox::change_cell(x+1, 0, '['); + x+=2; + x = draw_str(x, 0, branch); + termbox::change_cell(x, 0, ']'); +}; + +fn draw_ui(ts: termbox::resize_event) void = { + draw_title_bar(ts); + + termbox::present(); +}; + +fn none() void = { + return; +}; export fn main() void = { - //termbox::init()!; + termbox::init()!; + + draw_ui(termbox::resize_event{ w = termbox::width(), h = termbox::height() }); + + for(true){ + match(termbox::poll_event()){ + case let ev: termbox::event => { + match(ev){ + case let key: termbox::key_event => { + match(key.key){ + case let keytype: termbox::key_type => { + if(keytype == termbox::key_type::ESC){ + break; + }; + }; + case let ch: rune => { + if(ch == 'q'){ + break; + }; + }; + }; + }; + case let ev: termbox::resize_event => { + termbox::clear(); + draw_ui(ev); + }; + case => none(); + }; + }; + case => none(); + }; + }; //TODO - fmt::println("Hello")!; - //termbox::shutdown(); + termbox::shutdown(); }; \ No newline at end of file
