diff cmd/hg-wolp.ha @ 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 8376aa48453d
children
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