Compare commits

..

No commits in common. "d07ef96f44298dcb65ac7534cb0aa9f4537ea23b" and "fbed6c648aed0ebeeac567ec965762bb6b177096" have entirely different histories.

View file

@ -66,7 +66,7 @@ const TabBar = struct {
widget_list_widget: Widget, widget_list_widget: Widget,
event_handler: ?EventHandler, event_handler: ?EventHandler,
tabs: []TabBarTab = &[_]TabBarTab{}, tabs: []TabBarTab = &[_]TabBarTab{},
active_buffer_ref: ?usize = null, active_buffer: ?*Buffer = null,
tab_style: Style, tab_style: Style,
tab_style_bufs: [][]const u8, tab_style_bufs: [][]const u8,
@ -74,7 +74,7 @@ const TabBar = struct {
const Self = @This(); const Self = @This();
const TabBarTab = struct { const TabBarTab = struct {
buffer_ref: usize, buffer: *Buffer,
widget: Widget, widget: Widget,
}; };
@ -131,12 +131,9 @@ const TabBar = struct {
} else if (try m.match(.{"previous_tab"})) { } else if (try m.match(.{"previous_tab"})) {
self.select_previous_tab(); self.select_previous_tab();
} else if (try m.match(.{ "E", "open", tp.extract(&file_path), tp.more })) { } else if (try m.match(.{ "E", "open", tp.extract(&file_path), tp.more })) {
self.active_buffer_ref = if (buffer_manager.get_buffer_for_file(file_path)) |buffer| self.active_buffer = buffer_manager.get_buffer_for_file(file_path);
buffer_manager.buffer_to_ref(buffer)
else
null;
} else if (try m.match(.{ "E", "close" })) { } else if (try m.match(.{ "E", "close" })) {
self.active_buffer_ref = null; self.active_buffer = null;
} }
return false; return false;
} }
@ -159,7 +156,6 @@ const TabBar = struct {
} }
fn update_tabs(self: *Self) !void { fn update_tabs(self: *Self) !void {
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager");
try self.update_tab_buffers(); try self.update_tab_buffers();
const prev_widget_count = self.widget_list.widgets.items.len; const prev_widget_count = self.widget_list.widgets.items.len;
while (self.widget_list.pop()) |widget| if (widget.dynamic_cast(Button.State(Tab)) == null) while (self.widget_list.pop()) |widget| if (widget.dynamic_cast(Button.State(Tab)) == null)
@ -172,10 +168,8 @@ const TabBar = struct {
try self.widget_list.add(try self.make_spacer()); try self.widget_list.add(try self.make_spacer());
} }
try self.widget_list.add(tab.widget); try self.widget_list.add(tab.widget);
if (tab.widget.dynamic_cast(Button.State(Tab))) |btn| { if (tab.widget.dynamic_cast(Button.State(Tab))) |btn|
if (buffer_manager.buffer_from_ref(tab.buffer_ref)) |buffer| try btn.update_label(Tab.name_from_buffer(tab.buffer));
try btn.update_label(Tab.name_from_buffer(buffer));
}
} }
if (prev_widget_count != self.widget_list.widgets.items.len) if (prev_widget_count != self.widget_list.widgets.items.len)
tui.refresh_hover(); tui.refresh_hover();
@ -192,7 +186,7 @@ const TabBar = struct {
// add existing tabs in original order if they still exist // add existing tabs in original order if they still exist
outer: for (existing_tabs) |existing_tab| outer: for (existing_tabs) |existing_tab|
for (buffers) |buffer| if (existing_tab.buffer_ref == buffer_manager.buffer_to_ref(buffer)) { for (buffers) |buffer| if (existing_tab.buffer == buffer) {
if (!buffer.hidden) if (!buffer.hidden)
(try result.addOne(self.allocator)).* = existing_tab; (try result.addOne(self.allocator)).* = existing_tab;
continue :outer; continue :outer;
@ -200,15 +194,13 @@ const TabBar = struct {
// add new tabs // add new tabs
outer: for (buffers) |buffer| { outer: for (buffers) |buffer| {
for (result.items) |result_tab| if (result_tab.buffer_ref == buffer_manager.buffer_to_ref(buffer)) for (result.items) |result_tab| if (result_tab.buffer == buffer)
continue :outer; continue :outer;
if (!buffer.hidden) { if (!buffer.hidden)
const buffer_ref = buffer_manager.buffer_to_ref(buffer);
(try result.addOne(self.allocator)).* = .{ (try result.addOne(self.allocator)).* = .{
.buffer_ref = buffer_ref, .buffer = buffer,
.widget = try Tab.create(self, buffer_ref, &self.tab_style, self.event_handler), .widget = try Tab.create(self, buffer, &self.tab_style, self.event_handler),
}; };
}
} }
self.tabs = try result.toOwnedSlice(self.allocator); self.tabs = try result.toOwnedSlice(self.allocator);
@ -234,7 +226,7 @@ const TabBar = struct {
first = tab; first = tab;
if (activate_next) if (activate_next)
return navigate_to_tab(tab); return navigate_to_tab(tab);
if (tab.buffer_ref == self.active_buffer_ref) if (tab.buffer == self.active_buffer)
activate_next = true; activate_next = true;
} }
if (first) |tab| if (first) |tab|
@ -245,7 +237,7 @@ const TabBar = struct {
tp.trace(tp.channel.debug, .{"select_previous_tab"}); tp.trace(tp.channel.debug, .{"select_previous_tab"});
var goto: ?*const TabBarTab = if (self.tabs.len > 0) &self.tabs[self.tabs.len - 1] else null; var goto: ?*const TabBarTab = if (self.tabs.len > 0) &self.tabs[self.tabs.len - 1] else null;
for (self.tabs) |*tab| { for (self.tabs) |*tab| {
if (tab.buffer_ref == self.active_buffer_ref) if (tab.buffer == self.active_buffer)
break; break;
goto = tab; goto = tab;
} }
@ -253,30 +245,26 @@ const TabBar = struct {
} }
fn navigate_to_tab(tab: *const TabBarTab) void { fn navigate_to_tab(tab: *const TabBarTab) void {
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager"); tp.self_pid().send(.{ "cmd", "navigate", .{ .file = tab.buffer.file_path } }) catch {};
if (buffer_manager.buffer_from_ref(tab.buffer_ref)) |buffer|
tp.self_pid().send(.{ "cmd", "navigate", .{ .file = buffer.file_path } }) catch {};
} }
}; };
const Tab = struct { const Tab = struct {
tabbar: *TabBar, tabbar: *TabBar,
buffer_ref: usize, buffer: *Buffer,
tab_style: *const Style, tab_style: *const Style,
const Mode = enum { active, inactive, selected }; const Mode = enum { active, inactive, selected };
fn create( fn create(
tabbar: *TabBar, tabbar: *TabBar,
buffer_ref: usize, buffer: *Buffer,
tab_style: *const Style, tab_style: *const Style,
event_handler: ?EventHandler, event_handler: ?EventHandler,
) !Widget { ) !Widget {
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager");
const buffer = buffer_manager.buffer_from_ref(buffer_ref);
return Button.create_widget(Tab, tabbar.allocator, tabbar.widget_list.plane, .{ return Button.create_widget(Tab, tabbar.allocator, tabbar.widget_list.plane, .{
.ctx = .{ .tabbar = tabbar, .buffer_ref = buffer_ref, .tab_style = tab_style }, .ctx = .{ .tabbar = tabbar, .buffer = buffer, .tab_style = tab_style },
.label = if (buffer) |buf| name_from_buffer(buf) else "???", .label = name_from_buffer(buffer),
.on_click = Tab.on_click, .on_click = Tab.on_click,
.on_click2 = Tab.on_click2, .on_click2 = Tab.on_click2,
.on_layout = Tab.layout, .on_layout = Tab.layout,
@ -286,19 +274,15 @@ const Tab = struct {
} }
fn on_click(self: *@This(), _: *Button.State(@This())) void { fn on_click(self: *@This(), _: *Button.State(@This())) void {
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager"); tp.self_pid().send(.{ "cmd", "navigate", .{ .file = self.buffer.file_path } }) catch {};
if (buffer_manager.buffer_from_ref(self.buffer_ref)) |buffer|
tp.self_pid().send(.{ "cmd", "navigate", .{ .file = buffer.file_path } }) catch {};
} }
fn on_click2(self: *@This(), _: *Button.State(@This())) void { fn on_click2(self: *@This(), _: *Button.State(@This())) void {
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager"); tp.self_pid().send(.{ "cmd", "close_buffer", .{self.buffer.file_path} }) catch {};
if (buffer_manager.buffer_from_ref(self.buffer_ref)) |buffer|
tp.self_pid().send(.{ "cmd", "close_buffer", .{buffer.file_path} }) catch {};
} }
fn render(self: *@This(), btn: *Button.State(@This()), theme: *const Widget.Theme) bool { fn render(self: *@This(), btn: *Button.State(@This()), theme: *const Widget.Theme) bool {
const active = self.tabbar.active_buffer_ref == self.buffer_ref; const active = self.tabbar.active_buffer == self.buffer;
const mode: Mode = if (btn.hover) .selected else if (active) .active else .inactive; const mode: Mode = if (btn.hover) .selected else if (active) .active else .inactive;
switch (mode) { switch (mode) {
.selected => self.render_selected(btn, theme, active), .selected => self.render_selected(btn, theme, active),
@ -413,19 +397,15 @@ const Tab = struct {
} }
fn render_content(self: *@This(), btn: *Button.State(@This())) void { fn render_content(self: *@This(), btn: *Button.State(@This())) void {
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager"); if (self.buffer.is_dirty())
const is_dirty = if (buffer_manager.buffer_from_ref(self.buffer_ref)) |buffer| buffer.is_dirty() else false;
if (is_dirty)
_ = btn.plane.putstr(self.tabbar.tab_style.dirty_indicator) catch {}; _ = btn.plane.putstr(self.tabbar.tab_style.dirty_indicator) catch {};
_ = btn.plane.putstr(btn.opts.label) catch {}; _ = btn.plane.putstr(btn.opts.label) catch {};
} }
fn layout(self: *@This(), btn: *Button.State(@This())) Widget.Layout { fn layout(self: *@This(), btn: *Button.State(@This())) Widget.Layout {
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager"); const active = self.tabbar.active_buffer == self.buffer;
const is_dirty = if (buffer_manager.buffer_from_ref(self.buffer_ref)) |buffer| buffer.is_dirty() else false;
const active = self.tabbar.active_buffer_ref == self.buffer_ref;
const len = btn.plane.egc_chunk_width(btn.opts.label, 0, 1); const len = btn.plane.egc_chunk_width(btn.opts.label, 0, 1);
const len_padding = padding_len(btn.plane, self.tabbar.tab_style, active, is_dirty); const len_padding = padding_len(btn.plane, self.tabbar.tab_style, active, self.buffer.is_dirty());
return .{ .static = len + len_padding }; return .{ .static = len + len_padding };
} }