From 4d2c7d8a8ced46ff49dd9d9fb21a2b45ae1261ac Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 13 Aug 2025 17:33:58 +0200 Subject: [PATCH] refactor: unify list pointer rendering --- src/tui/filelist_view.zig | 4 ++-- src/tui/home.zig | 6 +++--- src/tui/mode/overlay/file_type_palette.zig | 3 +-- src/tui/mode/overlay/open_recent.zig | 2 +- src/tui/mode/overlay/palette.zig | 7 +++---- src/tui/mode/overlay/task_palette.zig | 3 +-- src/tui/tui.zig | 10 +++++++--- 7 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/tui/filelist_view.zig b/src/tui/filelist_view.zig index 2e65a0c..4108be0 100644 --- a/src/tui/filelist_view.zig +++ b/src/tui/filelist_view.zig @@ -166,8 +166,8 @@ fn handle_render_menu(self: *Self, button: *Button.State(*Menu.State(*Self)), th button.plane.home(); } const entry = &self.entries.items[idx]; - const pointer = if (selected) "⏵" else " "; - _ = button.plane.print("{s} ", .{pointer}) catch {}; + button.plane.set_style(style_label); + tui.render_pointer(&button.plane, selected); var buf: [std.fs.max_path_bytes]u8 = undefined; var removed_prefix: usize = 0; const max_len = self.view_cols / path_column_ratio; diff --git a/src/tui/home.zig b/src/tui/home.zig index ba47db3..6fd3c3d 100644 --- a/src/tui/home.zig +++ b/src/tui/home.zig @@ -154,7 +154,7 @@ fn add_menu_command(self: *Self, command_name: []const u8, description: []const try writer.print(" :{s}", .{hint}); const label = fis.getWritten(); const padding = Widget.Style.from_type(widget_style_type).padding; - self.menu_w = @max(self.menu_w, label.len + 1 + padding.left + padding.right); + self.menu_w = @max(self.menu_w, label.len + 2 + padding.left + padding.right); } var value = std.ArrayList(u8).init(self.allocator); @@ -237,8 +237,8 @@ fn menu_on_render(self: *Self, button: *Button.State(*Menu.State(*Self)), theme: } else { button.plane.set_style_bg_transparent(style_text); } - const pointer = if (selected) "⏵" else " "; - _ = button.plane.print("{s}{s}", .{ pointer, description }) catch {}; + tui.render_pointer(&button.plane, selected); + _ = button.plane.print("{s}", .{description}) catch {}; if (button.active or button.hover or selected) { button.plane.set_style(style_leader); } else { diff --git a/src/tui/mode/overlay/file_type_palette.zig b/src/tui/mode/overlay/file_type_palette.zig index 20e3983..7236b4c 100644 --- a/src/tui/mode/overlay/file_type_palette.zig +++ b/src/tui/mode/overlay/file_type_palette.zig @@ -84,8 +84,7 @@ pub fn Variant(comptime command: []const u8, comptime label_: []const u8, allow_ } button.plane.set_style(style_hint); - const pointer = if (selected) "⏵" else " "; - _ = button.plane.print("{s}", .{pointer}) catch {}; + tui.render_pointer(&button.plane, selected); var iter = button.opts.label; var description_: []const u8 = undefined; diff --git a/src/tui/mode/overlay/open_recent.zig b/src/tui/mode/overlay/open_recent.zig index 58675e4..8fe352a 100644 --- a/src/tui/mode/overlay/open_recent.zig +++ b/src/tui/mode/overlay/open_recent.zig @@ -88,7 +88,7 @@ pub fn deinit(self: *Self) void { } inline fn menu_width(self: *Self) usize { - return @max(@min(self.longest + 1, max_menu_width()) + 5, inputbox_label.len + 2); + return @max(@min(self.longest + 3, max_menu_width()) + 5, inputbox_label.len + 2); } inline fn menu_pos_x(self: *Self) usize { diff --git a/src/tui/mode/overlay/palette.zig b/src/tui/mode/overlay/palette.zig index caa79c1..845a365 100644 --- a/src/tui/mode/overlay/palette.zig +++ b/src/tui/mode/overlay/palette.zig @@ -133,8 +133,7 @@ pub fn Create(options: type) type { if (!(cbor.matchString(&iter, &hint) catch false)) hint = ""; button.plane.set_style(style_hint); - const pointer = if (selected) "⏵" else " "; - _ = button.plane.print("{s}", .{pointer}) catch {}; + tui.render_pointer(&button.plane, selected); button.plane.set_style(style_label); _ = button.plane.print("{s} ", .{label}) catch {}; button.plane.set_style(style_hint); @@ -143,7 +142,7 @@ pub fn Create(options: type) type { var len = cbor.decodeArrayHeader(&iter) catch return false; while (len > 0) : (len -= 1) { if (cbor.matchValue(&iter, cbor.extract(&index)) catch break) { - tui.render_match_cell(&button.plane, 0, index + 1, theme) catch break; + tui.render_match_cell(&button.plane, 0, index + 2, theme) catch break; } else break; } return false; @@ -155,7 +154,7 @@ pub fn Create(options: type) type { fn prepare_resize(self: *Self) Widget.Box { const screen = tui.screen(); - const w = @max(@min(self.longest, max_menu_width) + 2 + 1 + self.longest_hint, options.label.len + 2); + const w = @max(@min(self.longest + 3, max_menu_width) + 2 + self.longest_hint, options.label.len + 2); const x = if (screen.w > w) (screen.w - w) / 2 else 0; self.view_rows = get_view_rows(screen); const h = @min(self.items + self.menu.header_count, self.view_rows + self.menu.header_count); diff --git a/src/tui/mode/overlay/task_palette.zig b/src/tui/mode/overlay/task_palette.zig index 0baae7b..949ca5c 100644 --- a/src/tui/mode/overlay/task_palette.zig +++ b/src/tui/mode/overlay/task_palette.zig @@ -85,8 +85,7 @@ pub fn on_render_menu(_: *Type, button: *Type.ButtonState, theme: *const Widget. button.plane.fill(" "); button.plane.home(); button.plane.set_style(style_hint); - const pointer = if (selected) "⏵" else " "; - _ = button.plane.print("{s}", .{pointer}) catch {}; + tui.render_pointer(&button.plane, selected); button.plane.set_style(style_label); _ = button.plane.print("{s} ", .{entry.label}) catch {}; var index: usize = 0; diff --git a/src/tui/tui.zig b/src/tui/tui.zig index e699767..439880d 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -1460,6 +1460,11 @@ pub fn render_match_cell(self: *renderer.Plane, y: usize, x: usize, theme_: *con _ = self.putc(&cell) catch {}; } +pub fn render_pointer(self: *renderer.Plane, selected: bool) void { + const pointer = if (selected) "⏵ " else " "; + _ = self.print("{s}", .{pointer}) catch {}; +} + pub fn render_file_item_cbor(self: *renderer.Plane, file_item_cbor: []const u8, active: bool, selected: bool, hover: bool, theme_: *const Widget.Theme) bool { const style_base = theme_.editor_widget; const style_label = if (active) theme_.editor_cursor else if (hover or selected) theme_.editor_selection else theme_.editor_widget; @@ -1474,8 +1479,7 @@ pub fn render_file_item_cbor(self: *renderer.Plane, file_item_cbor: []const u8, } self.set_style(style_hint); - const pointer = if (selected) "⏵" else " "; - _ = self.print("{s}", .{pointer}) catch {}; + render_pointer(self, selected); var iter = file_item_cbor; var file_path_: []const u8 = undefined; @@ -1500,7 +1504,7 @@ pub fn render_file_item_cbor(self: *renderer.Plane, file_item_cbor: []const u8, var len = cbor.decodeArrayHeader(&iter) catch return false; while (len > 0) : (len -= 1) { if (cbor.matchValue(&iter, cbor.extract(&index)) catch break) { - render_match_cell(self, 0, index + 4, theme_) catch break; + render_match_cell(self, 0, index + 5, theme_) catch break; } else break; } return false;