From 8d98d3226aa4910e2a61c32caee50dd8f8e14e94 Mon Sep 17 00:00:00 2001 From: Yves Biener Date: Thu, 8 Jan 2026 23:19:44 +0100 Subject: [PATCH] feat(tree): make left side of the tree only take as much space as necessary --- build.zig.zon | 4 ++-- src/elements.zig | 16 +++++++++++++++- src/main.zig | 2 +- src/root.zig | 6 +++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index a039487..944fc49 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -3,8 +3,8 @@ .version = "0.0.1", .dependencies = .{ .zterm = .{ - .url = "git+https://gitea.yves-biener.de/yves-biener/zterm#e972a2ea0f7a9f8caffd439ef206474b46475f91", - .hash = "zterm-0.3.0-1xmmENkhHAB2rmNJFH-9rRqiRLnT673xwuMrqLwOnlT_", + .url = "git+https://gitea.yves-biener.de/yves-biener/zterm#b1a0d60ae379bb91b862d7c4a8a2210cd74c4387", + .hash = "zterm-0.3.0-1xmmEMotHACXUXNtsX1P2iz3XQgabNz1PfF7oazYtNam", }, }, .minimum_zig_version = "0.16.0-dev.1254+bf15c791f", diff --git a/src/elements.zig b/src/elements.zig index c0225ae..3db04a1 100644 --- a/src/elements.zig +++ b/src/elements.zig @@ -59,6 +59,7 @@ pub fn Tree(App: type) type { .ptr = this, .vtable = &.{ .resize = resize, + .minSize = minSize, .handle = handle, .content = content, }, @@ -70,6 +71,19 @@ pub fn Tree(App: type) type { this.size = size; } + fn minSize(ctx: *anyopaque, model: *const App.Model, _: Point) Point { + // NOTE as we assume the model contents do not change we could calculate the + // maximum width required for this `Element` and return that, instead of + // calculating the width every time anew. For now this works fine. + const this: *@This() = @ptrCast(@alignCast(ctx)); + const changes: []const Model.Index = model.changes.keys(); + const files = changes[this.scrollback..]; + var width: u16 = 0; + for (files) |file| width = @max(@as(u16, @intCast(file.len)), width); + return .{ .x = width }; + } + + fn handle(ctx: *anyopaque, model: *App.Model, event: App.Event) !void { const this: *@This() = @ptrCast(@alignCast(ctx)); switch (event) { @@ -112,7 +126,6 @@ pub fn Tree(App: type) type { const row_color: zterm.Color = if (this.idx == idx) .blue else .default; cell_idx = row * size.x; for (0..size.x) |_| { - cell_idx += 1; if (value_idx >= value.len) break; const cp = value[value_idx]; defer value_idx += 1; @@ -128,6 +141,7 @@ pub fn Tree(App: type) type { else => cp, }; cells[cell_idx].style.fg = row_color; + cell_idx += 1; } } } diff --git a/src/main.zig b/src/main.zig index 8e13d68..0bc3986 100644 --- a/src/main.zig +++ b/src/main.zig @@ -33,7 +33,7 @@ pub fn main() !void { // tui creation errdefer |err| log.err("Application Error: {any}", .{err}); - var threaded_io: std.Io.Threaded = .init(allocator); + var threaded_io: std.Io.Threaded = .init(allocator, .{}); errdefer threaded_io.deinit(); const io = threaded_io.io(); diff --git a/src/root.zig b/src/root.zig index 29aa832..54d3631 100644 --- a/src/root.zig +++ b/src/root.zig @@ -17,7 +17,11 @@ pub fn Container(App: type, gpa: Allocator, element: *elements.Root(App), tree: }, }, }, element.element()); - try root.append(try .init(gpa, .{}, tree.element())); + try root.append(try .init(gpa, .{ + .size = .{ + .grow = .vertical, + }, + }, tree.element())); try root.append(try .init(gpa, .{}, .{})); // empty container holding the scrollable element for the diff of each file return root; }