From 25a719382f2ef90d84d44e0c014f056285267a03 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Fri, 10 Oct 2025 16:05:50 +0200 Subject: [PATCH] fix: store button click locations as signed values --- src/tui/Button.zig | 11 +++++------ src/tui/Menu.zig | 2 +- src/tui/Widget.zig | 1 + src/tui/filelist_view.zig | 6 +++--- src/tui/home.zig | 2 +- src/tui/mode/overlay/buffer_palette.zig | 2 +- src/tui/mode/overlay/command_palette.zig | 2 +- src/tui/mode/overlay/completion_palette.zig | 2 +- src/tui/mode/overlay/file_type_palette.zig | 2 +- src/tui/mode/overlay/fontface_palette.zig | 2 +- src/tui/mode/overlay/list_all_commands_palette.zig | 2 +- src/tui/mode/overlay/open_recent.zig | 2 +- src/tui/mode/overlay/open_recent_project.zig | 2 +- src/tui/mode/overlay/palette.zig | 6 +++--- src/tui/mode/overlay/task_palette.zig | 2 +- src/tui/mode/overlay/theme_palette.zig | 2 +- src/tui/status/branch.zig | 2 +- src/tui/status/diagstate.zig | 2 +- src/tui/status/filestate.zig | 6 +++--- src/tui/status/linenumstate.zig | 2 +- src/tui/status/modestate.zig | 4 ++-- src/tui/status/tabs.zig | 8 ++++---- 22 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/tui/Button.zig b/src/tui/Button.zig index be81a00..04356d7 100644 --- a/src/tui/Button.zig +++ b/src/tui/Button.zig @@ -4,7 +4,6 @@ const tp = @import("thespian"); const EventHandler = @import("EventHandler"); const Plane = @import("renderer").Plane; const input = @import("input"); -pub const Cursor = @import("Buffer").Cursor; const Widget = @import("Widget.zig"); const tui = @import("tui.zig"); @@ -27,9 +26,9 @@ pub fn Options(context: type) type { pub const ButtonType = State(Context); pub const Context = context; - pub const ClickHandler = *const fn (ctx: *context, button: *ButtonType, pos: Cursor) void; + pub const ClickHandler = *const fn (ctx: *context, button: *ButtonType, pos: Widget.Pos) void; - pub fn do_nothing(_: *context, _: *ButtonType, _: Cursor) void {} + pub fn do_nothing(_: *context, _: *ButtonType, _: Widget.Pos) void {} pub fn on_render_default(_: *context, self: *ButtonType, theme: *const Widget.Theme) bool { self.plane.set_base_style(if (self.active) theme.scrollbar_active else if (self.hover) theme.scrollbar_hover else theme.scrollbar); @@ -156,12 +155,12 @@ fn State(ctx_type: type) type { return self.opts.on_receive(&self.opts.ctx, self, from, m); } - fn to_rel_cursor(self: *const Self, abs_x: c_int, abs_y: c_int) Cursor { + fn to_rel_cursor(self: *const Self, abs_x: c_int, abs_y: c_int) Widget.Pos { const rel_y, const rel_x = self.plane.abs_yx_to_rel(abs_y, abs_x); - return .{ .row = @intCast(rel_y), .col = @intCast(rel_x) }; + return .{ .y = @intCast(rel_y), .x = @intCast(rel_x) }; } - fn call_click_handler(self: *Self, btn: input.Mouse, pos: Cursor) void { + fn call_click_handler(self: *Self, btn: input.Mouse, pos: Widget.Pos) void { if (btn == input.mouse.BUTTON1) { if (!self.active) return; self.active = false; diff --git a/src/tui/Menu.zig b/src/tui/Menu.zig index 701291a..331c293 100644 --- a/src/tui/Menu.zig +++ b/src/tui/Menu.zig @@ -31,7 +31,7 @@ pub fn Options(context: type) type { pub const ButtonClickHandler = Button.Options(*MenuType).ClickHandler; pub const ClickHandler = *const fn (ctx: context, button: *ButtonType) void; pub fn do_nothing(_: context, _: *ButtonType) void {} - pub fn do_nothing_click(_: **MenuType, _: *ButtonType, _: Button.Cursor) void {} + pub fn do_nothing_click(_: **MenuType, _: *ButtonType, _: Widget.Pos) void {} pub fn on_render_default(_: context, button: *ButtonType, theme: *const Widget.Theme, selected: bool) bool { const style_base = theme.editor; diff --git a/src/tui/Widget.zig b/src/tui/Widget.zig index 2195259..d6a41ce 100644 --- a/src/tui/Widget.zig +++ b/src/tui/Widget.zig @@ -7,6 +7,7 @@ const EventHandler = @import("EventHandler"); const tui = @import("tui.zig"); pub const Box = @import("Box.zig"); +pub const Pos = struct { y: i32 = 0, x: i32 = 0 }; pub const Theme = @import("theme"); pub const themes = @import("themes").themes; pub const scopes = @import("themes").scopes; diff --git a/src/tui/filelist_view.zig b/src/tui/filelist_view.zig index 15c2e1f..180e6ef 100644 --- a/src/tui/filelist_view.zig +++ b/src/tui/filelist_view.zig @@ -197,7 +197,7 @@ fn update_scrollbar(self: *Self) void { scrollbar.set(@intCast(self.entries.items.len), @intCast(self.view_rows), @intCast(self.view_pos)); } -fn mouse_click_button4(menu: **MenuType, _: *ButtonType, _: Button.Cursor) void { +fn mouse_click_button4(menu: **MenuType, _: *ButtonType, _: Widget.Pos) void { const self = &menu.*.opts.ctx.*; self.selected = if (self.menu.selected) |sel_| sel_ + self.view_pos else self.selected; if (self.view_pos < Menu.scroll_lines) { @@ -209,7 +209,7 @@ fn mouse_click_button4(menu: **MenuType, _: *ButtonType, _: Button.Cursor) void self.update_scrollbar(); } -fn mouse_click_button5(menu: **MenuType, _: *ButtonType, _: Button.Cursor) void { +fn mouse_click_button5(menu: **MenuType, _: *ButtonType, _: Widget.Pos) void { const self = &menu.*.opts.ctx.*; self.selected = if (self.menu.selected) |sel_| sel_ + self.view_pos else self.selected; if (self.view_pos < @max(self.entries.items.len, self.view_rows) - self.view_rows) @@ -228,7 +228,7 @@ fn update_selected(self: *Self) void { } } -fn handle_menu_action(menu: **MenuType, button: *ButtonType, _: Button.Cursor) void { +fn handle_menu_action(menu: **MenuType, button: *ButtonType, _: Widget.Pos) void { const self = menu.*.opts.ctx; var idx: usize = undefined; var iter = button.opts.label; diff --git a/src/tui/home.zig b/src/tui/home.zig index e516d1c..e2617b4 100644 --- a/src/tui/home.zig +++ b/src/tui/home.zig @@ -259,7 +259,7 @@ fn menu_on_render(self: *Self, button: *ButtonType, theme: *const Widget.Theme, return false; } -fn menu_action(_: **Menu.State(*Self), button: *ButtonType, _: Button.Cursor) void { +fn menu_action(_: **Menu.State(*Self), button: *ButtonType, _: Widget.Pos) void { var description: []const u8 = undefined; var hint: []const u8 = undefined; var command_name: []const u8 = undefined; diff --git a/src/tui/mode/overlay/buffer_palette.zig b/src/tui/mode/overlay/buffer_palette.zig index 9e97f81..f561c0b 100644 --- a/src/tui/mode/overlay/buffer_palette.zig +++ b/src/tui/mode/overlay/buffer_palette.zig @@ -58,7 +58,7 @@ pub fn on_render_menu(_: *Type, button: *Type.ButtonType, theme: *const Widget.T return tui.render_file_item_cbor(&button.plane, button.opts.label, button.active, selected, button.hover, theme); } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var file_path: []const u8 = undefined; var iter = button.opts.label; if (!(cbor.matchString(&iter, &file_path) catch false)) return; diff --git a/src/tui/mode/overlay/command_palette.zig b/src/tui/mode/overlay/command_palette.zig index 24b26d1..cd1ef34 100644 --- a/src/tui/mode/overlay/command_palette.zig +++ b/src/tui/mode/overlay/command_palette.zig @@ -52,7 +52,7 @@ pub fn add_menu_entry(palette: *Type, entry: *Entry, matches: ?[]const usize) !v palette.items += 1; } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var unused: []const u8 = undefined; var command_id: command.ID = undefined; var iter = button.opts.label; diff --git a/src/tui/mode/overlay/completion_palette.zig b/src/tui/mode/overlay/completion_palette.zig index 4985446..d345315 100644 --- a/src/tui/mode/overlay/completion_palette.zig +++ b/src/tui/mode/overlay/completion_palette.zig @@ -146,7 +146,7 @@ fn get_replace_selection(replace: Buffer.Selection) ?Buffer.Selection { replace; } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { const label_, _, _, _, _ = get_values(button.opts.label); tp.self_pid().send(.{ "cmd", "exit_overlay_mode" }) catch |e| menu.*.opts.ctx.logger.err(module_name, e); tp.self_pid().send(.{ "cmd", "insert_chars", .{label_} }) catch |e| menu.*.opts.ctx.logger.err(module_name, e); diff --git a/src/tui/mode/overlay/file_type_palette.zig b/src/tui/mode/overlay/file_type_palette.zig index 1bc112a..9079d03 100644 --- a/src/tui/mode/overlay/file_type_palette.zig +++ b/src/tui/mode/overlay/file_type_palette.zig @@ -116,7 +116,7 @@ pub fn Variant(comptime command: []const u8, comptime label_: []const u8, allow_ return false; } - fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { + fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var description_: []const u8 = undefined; var icon_: []const u8 = undefined; var color: u24 = undefined; diff --git a/src/tui/mode/overlay/fontface_palette.zig b/src/tui/mode/overlay/fontface_palette.zig index 743996a..5a0f2f0 100644 --- a/src/tui/mode/overlay/fontface_palette.zig +++ b/src/tui/mode/overlay/fontface_palette.zig @@ -56,7 +56,7 @@ pub fn add_menu_entry(palette: *Type, entry: *Entry, matches: ?[]const usize) !v palette.items += 1; } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var label_: []const u8 = undefined; var iter = button.opts.label; if (!(cbor.matchString(&iter, &label_) catch false)) return; diff --git a/src/tui/mode/overlay/list_all_commands_palette.zig b/src/tui/mode/overlay/list_all_commands_palette.zig index 8966e55..9052685 100644 --- a/src/tui/mode/overlay/list_all_commands_palette.zig +++ b/src/tui/mode/overlay/list_all_commands_palette.zig @@ -69,7 +69,7 @@ pub fn add_menu_entry(palette: *Type, entry: *Entry, matches: ?[]const usize) !v palette.items += 1; } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var unused: []const u8 = undefined; var command_id: command.ID = undefined; var iter = button.opts.label; diff --git a/src/tui/mode/overlay/open_recent.zig b/src/tui/mode/overlay/open_recent.zig index 4b7d96c..ba0066e 100644 --- a/src/tui/mode/overlay/open_recent.zig +++ b/src/tui/mode/overlay/open_recent.zig @@ -125,7 +125,7 @@ fn do_resize(self: *Self) void { self.menu.resize(self.prepare_resize()); } -fn menu_action_open_file(menu: **MenuType, button: *ButtonType, _: Button.Cursor) void { +fn menu_action_open_file(menu: **MenuType, button: *ButtonType, _: Widget.Pos) void { var file_path: []const u8 = undefined; var iter = button.opts.label; if (!(cbor.matchString(&iter, &file_path) catch false)) return; diff --git a/src/tui/mode/overlay/open_recent_project.zig b/src/tui/mode/overlay/open_recent_project.zig index c6c91d4..408c8ca 100644 --- a/src/tui/mode/overlay/open_recent_project.zig +++ b/src/tui/mode/overlay/open_recent_project.zig @@ -63,7 +63,7 @@ pub fn add_menu_entry(palette: *Type, entry: *Entry, matches: ?[]const usize) !v palette.items += 1; } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var name_: []const u8 = undefined; var iter = button.opts.label; if (!(cbor.matchString(&iter, &name_) catch false)) return; diff --git a/src/tui/mode/overlay/palette.zig b/src/tui/mode/overlay/palette.zig index a749b11..01f8fa1 100644 --- a/src/tui/mode/overlay/palette.zig +++ b/src/tui/mode/overlay/palette.zig @@ -48,7 +48,7 @@ pub fn Create(options: type) type { pub const MenuType = Menu.Options(*Self).MenuType; pub const ButtonType = MenuType.ButtonType; - pub const Cursor = Button.Cursor; + pub const Pos = Widget.Pos; pub fn create(allocator: std.mem.Allocator) !tui.Mode { return create_with_args(allocator, .{}); @@ -212,7 +212,7 @@ pub fn Create(options: type) type { scrollbar.set(@intCast(@max(self.total_items, 1) - 1), @intCast(self.view_rows), @intCast(self.view_pos)); } - fn mouse_click_button4(menu: **Menu.State(*Self), _: *ButtonType, _: Button.Cursor) void { + fn mouse_click_button4(menu: **Menu.State(*Self), _: *ButtonType, _: Widget.Pos) void { const self = &menu.*.opts.ctx.*; if (self.view_pos < Menu.scroll_lines) { self.view_pos = 0; @@ -223,7 +223,7 @@ pub fn Create(options: type) type { self.start_query(0) catch {}; } - fn mouse_click_button5(menu: **Menu.State(*Self), _: *ButtonType, _: Button.Cursor) void { + fn mouse_click_button5(menu: **Menu.State(*Self), _: *ButtonType, _: Widget.Pos) void { const self = &menu.*.opts.ctx.*; if (self.view_pos < @max(self.total_items, self.view_rows) - self.view_rows) self.view_pos += Menu.scroll_lines; diff --git a/src/tui/mode/overlay/task_palette.zig b/src/tui/mode/overlay/task_palette.zig index aedd7a2..cb78b99 100644 --- a/src/tui/mode/overlay/task_palette.zig +++ b/src/tui/mode/overlay/task_palette.zig @@ -116,7 +116,7 @@ pub fn on_render_menu(palette: *Type, button: *Type.ButtonType, theme: *const Wi return false; } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var entry: Entry = undefined; var iter = button.opts.label; if (!(cbor.matchValue(&iter, cbor.extract(&entry)) catch false)) return; diff --git a/src/tui/mode/overlay/theme_palette.zig b/src/tui/mode/overlay/theme_palette.zig index 3aaa695..4f454b2 100644 --- a/src/tui/mode/overlay/theme_palette.zig +++ b/src/tui/mode/overlay/theme_palette.zig @@ -53,7 +53,7 @@ pub fn add_menu_entry(palette: *Type, entry: *Entry, matches: ?[]const usize) !v palette.items += 1; } -fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Cursor) void { +fn select(menu: **Type.MenuType, button: *Type.ButtonType, _: Type.Pos) void { var description_: []const u8 = undefined; var name_: []const u8 = undefined; var iter = button.opts.label; diff --git a/src/tui/status/branch.zig b/src/tui/status/branch.zig index af433a5..b723997 100644 --- a/src/tui/status/branch.zig +++ b/src/tui/status/branch.zig @@ -62,7 +62,7 @@ pub fn ctx_deinit(self: *Self) void { if (self.behind) |p| self.allocator.free(p); } -fn on_click(self: *Self, _: *ButtonType, _: Button.Cursor) void { +fn on_click(self: *Self, _: *ButtonType, _: Widget.Pos) void { self.refresh_git_status(); command.executeName("show_git_status", .{}) catch {}; } diff --git a/src/tui/status/diagstate.zig b/src/tui/status/diagstate.zig index 37a81b0..d508218 100644 --- a/src/tui/status/diagstate.zig +++ b/src/tui/status/diagstate.zig @@ -31,7 +31,7 @@ pub fn create(allocator: Allocator, parent: Plane, event_handler: ?EventHandler, }); } -fn on_click(_: *Self, _: *ButtonType, _: Button.Cursor) void { +fn on_click(_: *Self, _: *ButtonType, _: Widget.Pos) void { command.executeName("show_diagnostics", .{}) catch {}; } diff --git a/src/tui/status/filestate.zig b/src/tui/status/filestate.zig index f9e39ac..e6c66a3 100644 --- a/src/tui/status/filestate.zig +++ b/src/tui/status/filestate.zig @@ -65,15 +65,15 @@ pub fn create(allocator: Allocator, parent: Plane, event_handler: ?EventHandler, return Widget.to(btn); } -fn on_click(_: *Self, _: *ButtonType, _: Button.Cursor) void { +fn on_click(_: *Self, _: *ButtonType, _: Widget.Pos) void { command.executeName("open_recent", .{}) catch {}; } -fn on_click2(_: *Self, _: *ButtonType, _: Button.Cursor) void { +fn on_click2(_: *Self, _: *ButtonType, _: Widget.Pos) void { command.executeName("close_file", .{}) catch {}; } -fn on_click3(self: *Self, _: *ButtonType, _: Button.Cursor) void { +fn on_click3(self: *Self, _: *ButtonType, _: Widget.Pos) void { self.detailed = !self.detailed; } diff --git a/src/tui/status/linenumstate.zig b/src/tui/status/linenumstate.zig index 1339db2..7ba1683 100644 --- a/src/tui/status/linenumstate.zig +++ b/src/tui/status/linenumstate.zig @@ -60,7 +60,7 @@ pub fn create(allocator: Allocator, parent: Plane, event_handler: ?EventHandler, }); } -fn on_click(_: *Self, _: *ButtonType, _: Button.Cursor) void { +fn on_click(_: *Self, _: *ButtonType, _: Widget.Pos) void { command.executeName("goto", .{}) catch {}; } diff --git a/src/tui/status/modestate.zig b/src/tui/status/modestate.zig index be8f9f8..f95f632 100644 --- a/src/tui/status/modestate.zig +++ b/src/tui/status/modestate.zig @@ -105,7 +105,7 @@ fn render_logo(self: *ButtonType, theme: *const Widget.Theme, style_label: Widge } } -fn on_click(_: *Style, _: *ButtonType, _: Button.Cursor) void { +fn on_click(_: *Style, _: *ButtonType, _: Widget.Pos) void { if (is_mini_mode()) { command.executeName("exit_mini_mode", .{}) catch {}; } else if (is_overlay_mode()) { @@ -115,6 +115,6 @@ fn on_click(_: *Style, _: *ButtonType, _: Button.Cursor) void { } } -fn toggle_panel(_: *Style, _: *ButtonType, _: Button.Cursor) void { +fn toggle_panel(_: *Style, _: *ButtonType, _: Widget.Pos) void { command.executeName("toggle_panel", .{}) catch {}; } diff --git a/src/tui/status/tabs.zig b/src/tui/status/tabs.zig index f498108..2072c73 100644 --- a/src/tui/status/tabs.zig +++ b/src/tui/status/tabs.zig @@ -353,14 +353,14 @@ const Tab = struct { }); } - fn on_click(self: *@This(), _: *ButtonType, pos: Button.Cursor) void { + fn on_click(self: *@This(), _: *ButtonType, pos: Widget.Pos) void { const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager"); if (buffer_manager.buffer_from_ref(self.buffer_ref)) |buffer| { - if (self.close_pos) |close_pos| if (pos.col == close_pos) { + if (self.close_pos) |close_pos| if (pos.x == close_pos) { tp.self_pid().send(.{ "cmd", "close_buffer", .{buffer.get_file_path()} }) catch {}; return; }; - if (self.save_pos) |save_pos| if (pos.col == save_pos) { + if (self.save_pos) |save_pos| if (pos.x == save_pos) { tp.self_pid().send(.{ "cmd", "save_buffer", .{buffer.get_file_path()} }) catch {}; return; }; @@ -368,7 +368,7 @@ const Tab = struct { } } - fn on_click2(self: *@This(), _: *ButtonType, _: Button.Cursor) void { + fn on_click2(self: *@This(), _: *ButtonType, _: Widget.Pos) void { const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager"); if (buffer_manager.buffer_from_ref(self.buffer_ref)) |buffer| tp.self_pid().send(.{ "cmd", "close_buffer", .{buffer.get_file_path()} }) catch {};