From 4f68898f96f88bcede5204e42f9165543759918e Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 20 Jan 2026 21:12:47 +0100 Subject: [PATCH] refactor: create a split when moving a tab past the last right split --- src/tui/mainview.zig | 2 +- src/tui/status/tabs.zig | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index b5650ac..6e0c3ae 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -1833,7 +1833,7 @@ fn create_home(self: *Self) !void { tui.resize(); } -fn create_home_split(self: *Self) !void { +pub fn create_home_split(self: *Self) !void { tui.reset_drag_context(); try self.add_and_activate_view(try home.create(self.allocator, Widget.to(self))); _ = try self.widgets_widget.msg(.{"splits_updated"}); diff --git a/src/tui/status/tabs.zig b/src/tui/status/tabs.zig index cd7de54..7f1566e 100644 --- a/src/tui/status/tabs.zig +++ b/src/tui/status/tabs.zig @@ -462,7 +462,7 @@ pub const TabBar = struct { fn move_tab_next(self: *Self) void { tp.trace(tp.channel.debug, .{"move_tab_next"}); const this_idx = self.find_buffer_tab(self.active_focused_buffer_ref orelse return) orelse return; - const other_buffer_ref = self.find_next_tab_buffer() orelse return; + const other_buffer_ref = self.find_next_tab_buffer() orelse return self.move_tab_to_new_split(this_idx); const other_idx = self.find_buffer_tab(other_buffer_ref) orelse return; self.move_tab_to(other_idx, this_idx); } @@ -537,6 +537,21 @@ pub const TabBar = struct { navigate_to_buffer(src_tab.buffer_ref); } + fn move_tab_to_new_split(self: *Self, src_idx: usize) void { + const mv = tui.mainview() orelse return; + const src_tab = &self.tabs[src_idx]; + var tabs_in_view: usize = 0; + for (self.tabs) |*tab| if (tab.view) |view| { + if (view == src_tab.view) + tabs_in_view += 1; + }; + if (tabs_in_view > 1) { + const view = mv.get_view_count(); + mv.create_home_split() catch return; + self.move_tab_to_view(view, src_idx); + } + } + fn place_next_tab(self: *Self, position: enum { before, after }, buffer_ref: usize) void { tp.trace(tp.channel.debug, .{ "place_next_tab", position, buffer_ref }); const tab_idx = for (self.tabs, 0..) |*tab, idx| if (tab.buffer_ref == buffer_ref) break idx else continue else {