Merge branch 'master' into zig-0.15.0
This commit is contained in:
commit
d07ef96f44
1 changed files with 44 additions and 24 deletions
|
@ -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: ?*Buffer = null,
|
active_buffer_ref: ?usize = 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: *Buffer,
|
buffer_ref: usize,
|
||||||
widget: Widget,
|
widget: Widget,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -131,9 +131,12 @@ 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 = buffer_manager.get_buffer_for_file(file_path);
|
self.active_buffer_ref = if (buffer_manager.get_buffer_for_file(file_path)) |buffer|
|
||||||
|
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 = null;
|
self.active_buffer_ref = null;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -156,6 +159,7 @@ 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)
|
||||||
|
@ -168,8 +172,10 @@ 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| {
|
||||||
try btn.update_label(Tab.name_from_buffer(tab.buffer));
|
if (buffer_manager.buffer_from_ref(tab.buffer_ref)) |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();
|
||||||
|
@ -186,7 +192,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 == buffer) {
|
for (buffers) |buffer| if (existing_tab.buffer_ref == buffer_manager.buffer_to_ref(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;
|
||||||
|
@ -194,13 +200,15 @@ 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 == buffer)
|
for (result.items) |result_tab| if (result_tab.buffer_ref == buffer_manager.buffer_to_ref(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 = buffer,
|
.buffer_ref = buffer_ref,
|
||||||
.widget = try Tab.create(self, buffer, &self.tab_style, self.event_handler),
|
.widget = try Tab.create(self, buffer_ref, &self.tab_style, self.event_handler),
|
||||||
};
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.tabs = try result.toOwnedSlice(self.allocator);
|
self.tabs = try result.toOwnedSlice(self.allocator);
|
||||||
|
@ -226,7 +234,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 == self.active_buffer)
|
if (tab.buffer_ref == self.active_buffer_ref)
|
||||||
activate_next = true;
|
activate_next = true;
|
||||||
}
|
}
|
||||||
if (first) |tab|
|
if (first) |tab|
|
||||||
|
@ -237,7 +245,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 == self.active_buffer)
|
if (tab.buffer_ref == self.active_buffer_ref)
|
||||||
break;
|
break;
|
||||||
goto = tab;
|
goto = tab;
|
||||||
}
|
}
|
||||||
|
@ -245,26 +253,30 @@ const TabBar = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn navigate_to_tab(tab: *const TabBarTab) void {
|
fn navigate_to_tab(tab: *const TabBarTab) void {
|
||||||
tp.self_pid().send(.{ "cmd", "navigate", .{ .file = tab.buffer.file_path } }) catch {};
|
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager");
|
||||||
|
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: *Buffer,
|
buffer_ref: usize,
|
||||||
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: *Buffer,
|
buffer_ref: usize,
|
||||||
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 = buffer, .tab_style = tab_style },
|
.ctx = .{ .tabbar = tabbar, .buffer_ref = buffer_ref, .tab_style = tab_style },
|
||||||
.label = name_from_buffer(buffer),
|
.label = if (buffer) |buf| name_from_buffer(buf) else "???",
|
||||||
.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,
|
||||||
|
@ -274,15 +286,19 @@ const Tab = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_click(self: *@This(), _: *Button.State(@This())) void {
|
fn on_click(self: *@This(), _: *Button.State(@This())) void {
|
||||||
tp.self_pid().send(.{ "cmd", "navigate", .{ .file = self.buffer.file_path } }) catch {};
|
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", "navigate", .{ .file = buffer.file_path } }) catch {};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_click2(self: *@This(), _: *Button.State(@This())) void {
|
fn on_click2(self: *@This(), _: *Button.State(@This())) void {
|
||||||
tp.self_pid().send(.{ "cmd", "close_buffer", .{self.buffer.file_path} }) catch {};
|
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.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 == self.buffer;
|
const active = self.tabbar.active_buffer_ref == self.buffer_ref;
|
||||||
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),
|
||||||
|
@ -397,15 +413,19 @@ const Tab = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_content(self: *@This(), btn: *Button.State(@This())) void {
|
fn render_content(self: *@This(), btn: *Button.State(@This())) void {
|
||||||
if (self.buffer.is_dirty())
|
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager");
|
||||||
|
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 active = self.tabbar.active_buffer == self.buffer;
|
const buffer_manager = tui.get_buffer_manager() orelse @panic("tabs no buffer manager");
|
||||||
|
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, self.buffer.is_dirty());
|
const len_padding = padding_len(btn.plane, self.tabbar.tab_style, active, is_dirty);
|
||||||
return .{ .static = len + len_padding };
|
return .{ .static = len + len_padding };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue