diff --git a/src/main.zig b/src/main.zig index 21b07d6..2aa8517 100644 --- a/src/main.zig +++ b/src/main.zig @@ -996,57 +996,67 @@ pub fn main() !void { } } - // TODO: Layer system where we can put widgets in specific layers (to - // allow certain widgets to be below or above others, like animations) const info_line_widget = state.info_line.widget(); const session_widget = state.session.widget(); const login_widget = state.login.widget(); - var widgets: std.ArrayList(Widget) = .empty; + var widgets: std.ArrayList([]Widget) = .empty; defer widgets.deinit(state.allocator); + // Layer 1 if (animation) |a| { - try widgets.append(state.allocator, a); + var layer1 = [_]Widget{a}; + try widgets.append(state.allocator, &layer1); } + + // Layer 2 + var layer2: std.ArrayList(Widget) = .empty; + defer layer2.deinit(state.allocator); + if (!state.config.hide_key_hints) { - try widgets.append(state.allocator, state.shutdown_label.widget()); - try widgets.append(state.allocator, state.restart_label.widget()); + try layer2.append(state.allocator, state.shutdown_label.widget()); + try layer2.append(state.allocator, state.restart_label.widget()); if (state.config.sleep_cmd != null) { - try widgets.append(state.allocator, state.sleep_label.widget()); + try layer2.append(state.allocator, state.sleep_label.widget()); } if (state.config.brightness_down_key != null) { - try widgets.append(state.allocator, state.brightness_down_label.widget()); + try layer2.append(state.allocator, state.brightness_down_label.widget()); } if (state.config.brightness_up_key != null) { - try widgets.append(state.allocator, state.brightness_up_label.widget()); + try layer2.append(state.allocator, state.brightness_up_label.widget()); } } if (state.config.battery_id != null) { - try widgets.append(state.allocator, state.battery_label.widget()); + try layer2.append(state.allocator, state.battery_label.widget()); } if (state.config.clock != null) { - try widgets.append(state.allocator, state.clock_label.widget()); + try layer2.append(state.allocator, state.clock_label.widget()); } if (state.config.bigclock != .none) { - try widgets.append(state.allocator, state.bigclock_label.widget()); + try layer2.append(state.allocator, state.bigclock_label.widget()); } if (!state.config.hide_keyboard_locks) { - try widgets.append(state.allocator, state.numlock_label.widget()); - try widgets.append(state.allocator, state.capslock_label.widget()); + try layer2.append(state.allocator, state.numlock_label.widget()); + try layer2.append(state.allocator, state.capslock_label.widget()); } - try widgets.append(state.allocator, state.box.widget()); - try widgets.append(state.allocator, info_line_widget); - try widgets.append(state.allocator, state.session_specifier_label.widget()); - try widgets.append(state.allocator, session_widget); - try widgets.append(state.allocator, state.login_label.widget()); - try widgets.append(state.allocator, login_widget); - try widgets.append(state.allocator, state.password_label.widget()); - try widgets.append(state.allocator, state.password_widget); + try layer2.append(state.allocator, state.box.widget()); + try layer2.append(state.allocator, info_line_widget); + try layer2.append(state.allocator, state.session_specifier_label.widget()); + try layer2.append(state.allocator, session_widget); + try layer2.append(state.allocator, state.login_label.widget()); + try layer2.append(state.allocator, login_widget); + try layer2.append(state.allocator, state.password_label.widget()); + try layer2.append(state.allocator, state.password_widget); if (!state.config.hide_version_string) { - try widgets.append(state.allocator, state.version_label.widget()); + try layer2.append(state.allocator, state.version_label.widget()); } + + try widgets.append(state.allocator, layer2.items); + + // Layer 3 if (state.config.auth_fails > 0) { - try widgets.append(state.allocator, cascade.widget()); + var layer3 = [_]Widget{cascade.widget()}; + try widgets.append(state.allocator, &layer3); } try state.buffer.registerKeybind("Esc", &disableInsertMode, &state); diff --git a/src/tui/TerminalBuffer.zig b/src/tui/TerminalBuffer.zig index e203669..ec5c6dc 100644 --- a/src/tui/TerminalBuffer.zig +++ b/src/tui/TerminalBuffer.zig @@ -169,7 +169,7 @@ pub fn runEventLoop( self: *TerminalBuffer, allocator: Allocator, shared_error: SharedError, - widgets: []Widget, + layers: [][]Widget, active_widget: Widget, inactivity_delay: u16, insert_mode: *bool, @@ -189,16 +189,22 @@ pub fn runEventLoop( defer self.handlable_widgets.deinit(allocator); var i: usize = 0; - for (widgets) |*widget| { - if (widget.vtable.handle_fn != null) { - try self.handlable_widgets.append(allocator, widget); + for (layers) |layer| { + for (layer) |*widget| { + if (widget.vtable.handle_fn != null) { + try self.handlable_widgets.append(allocator, widget); - if (widget.id == active_widget.id) self.active_widget_index = i; - i += 1; + if (widget.id == active_widget.id) self.active_widget_index = i; + i += 1; + } } } - for (widgets) |*widget| try widget.update(context); + for (layers) |layer| { + for (layer) |*widget| { + try widget.update(context); + } + } try @call(.auto, position_widgets_fn, .{context}); var event: termbox.tb_event = undefined; @@ -207,7 +213,11 @@ pub fn runEventLoop( while (self.run) { if (self.update) { - for (widgets) |*widget| try widget.update(context); + for (layers) |layer| { + for (layer) |*widget| { + try widget.update(context); + } + } // Reset cursor const current_widget = self.getActiveWidget(); @@ -222,15 +232,21 @@ pub fn runEventLoop( try TerminalBuffer.clearScreen(false); - for (widgets) |*widget| widget.draw(); + for (layers) |layer| { + for (layer) |*widget| { + widget.draw(); + } + } TerminalBuffer.presentBuffer(); } var maybe_timeout: ?usize = null; - for (widgets) |*widget| { - if (try widget.calculateTimeout(context)) |widget_timeout| { - if (maybe_timeout == null or widget_timeout < maybe_timeout.?) maybe_timeout = widget_timeout; + for (layers) |layer| { + for (layer) |*widget| { + if (try widget.calculateTimeout(context)) |widget_timeout| { + if (maybe_timeout == null or widget_timeout < maybe_timeout.?) maybe_timeout = widget_timeout; + } } } @@ -262,15 +278,17 @@ pub fn runEventLoop( .{ self.width, self.height }, ); - for (widgets) |*widget| { - widget.realloc() catch |err| { - shared_error.writeError(error.WidgetReallocationFailed); - try self.log_file.err( - "tui", - "failed to reallocate widget '{s}': {s}", - .{ widget.display_name, @errorName(err) }, - ); - }; + for (layers) |layer| { + for (layer) |*widget| { + widget.realloc() catch |err| { + shared_error.writeError(error.WidgetReallocationFailed); + try self.log_file.err( + "tui", + "failed to reallocate widget '{s}': {s}", + .{ widget.display_name, @errorName(err) }, + ); + }; + } } try @call(.auto, position_widgets_fn, .{context});