refactor: reduce code duplication in close_split/view functions

This commit is contained in:
CJ van den Berg 2026-01-21 23:22:50 +01:00
parent c85d52dac0
commit faecc90159
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -952,48 +952,20 @@ const cmds = struct {
pub fn close_split(self: *Self, _: Ctx) Result { pub fn close_split(self: *Self, _: Ctx) Result {
if (self.views.widgets.items.len == 1 and self.views.widgets.items[0].widget.dynamic_cast(home) != null) if (self.views.widgets.items.len == 1 and self.views.widgets.items[0].widget.dynamic_cast(home) != null)
return command.executeName("quit", .{}); return command.executeName("quit", .{});
try self.remove_active_view(); self.remove_view(self.active_view);
if (self.closing_project) return;
const buffers = try self.buffer_manager.list_unordered(self.allocator);
defer self.allocator.free(buffers);
for (buffers) |buffer| if (buffer.get_last_view()) |view|
if (view >= self.views.widgets.items.len)
buffer.set_last_view(null);
_ = try self.widgets_widget.msg(.{"splits_updated"});
} }
pub const close_split_meta: Meta = .{ .description = "Close split view" }; pub const close_split_meta: Meta = .{ .description = "Close split view" };
pub fn close_view(self: *Self, ctx: Ctx) Result { pub fn close_view(self: *Self, ctx: Ctx) Result {
var view: usize = undefined; var view: usize = undefined;
if (!try ctx.args.match(.{tp.extract(&view)})) return error.InvalidCloseViewArgument; if (!try ctx.args.match(.{tp.extract(&view)})) return error.InvalidCloseViewArgument;
self.remove_view(view);
if (view >= self.views.widgets.items.len) return;
self.remove_view(view) catch return;
const buffers = self.buffer_manager.list_unordered(self.allocator) catch @panic("OOM close_view");
defer self.allocator.free(buffers);
for (buffers) |buffer| if (buffer.get_last_view()) |buffer_view|
if (buffer_view >= view)
buffer.set_last_view(buffer_view - 1);
_ = self.widgets_widget.msg(.{"splits_updated"}) catch {};
} }
pub const close_view_meta: Meta = .{ .arguments = &.{.integer} }; pub const close_view_meta: Meta = .{ .arguments = &.{.integer} };
pub fn close_splits(self: *Self, _: Ctx) Result { pub fn close_splits(self: *Self, _: Ctx) Result {
while (self.views.widgets.items.len > 1) while (self.views.widgets.items.len > 1)
try self.remove_view(1); self.remove_view(1);
if (self.closing_project) return;
const buffers = try self.buffer_manager.list_unordered(self.allocator);
defer self.allocator.free(buffers);
for (buffers) |buffer| buffer.set_last_view(0);
_ = try self.widgets_widget.msg(.{"splits_updated"});
} }
pub const close_splits_meta: Meta = .{ .description = "Close all split views" }; pub const close_splits_meta: Meta = .{ .description = "Close all split views" };
@ -1773,18 +1745,24 @@ pub fn focus_view(self: *Self, n: usize) !void {
if (self.views.get_at(self.active_view)) |view| view.focus(); if (self.views.get_at(self.active_view)) |view| view.focus();
} }
fn remove_view(self: *Self, view: usize) !void { fn remove_view(self: *Self, view: usize) void {
if (self.views.widgets.items.len == 1) return; // can't delete last view if (self.views.widgets.items.len == 1) return; // can't delete last view
if (view >= self.views.widgets.items.len) return; if (view >= self.views.widgets.items.len) return;
defer {
_ = self.widgets_widget.msg(.{"splits_updated"}) catch {};
tui.resize();
}
self.views.delete(view); self.views.delete(view);
if (self.active_view >= self.views.widgets.items.len) if (self.active_view >= self.views.widgets.items.len)
self.active_view = self.views.widgets.items.len - 1; self.active_view = self.views.widgets.items.len - 1;
if (self.views.get_at(self.active_view)) |active_view| active_view.focus(); if (self.views.get_at(self.active_view)) |active_view| active_view.focus();
tui.resize();
}
fn remove_active_view(self: *Self) !void { if (self.closing_project) return;
return self.remove_view(self.active_view); const buffers = self.buffer_manager.list_unordered(self.allocator) catch @panic("OOM remove_view");
defer self.allocator.free(buffers);
for (buffers) |buffer| if (buffer.get_last_view()) |buffer_view|
if (buffer_view >= view)
buffer.set_last_view(buffer_view - 1);
} }
fn replace_active_view(self: *Self, widget: Widget) !void { fn replace_active_view(self: *Self, widget: Widget) !void {