From 4f912cebebdb40ea81f98381572bdecd5ebd2362 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 13 Aug 2025 22:32:31 +0200 Subject: [PATCH] feat: add basic widget style switching support --- src/tui/WidgetStyle.zig | 87 ++++++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 14 deletions(-) diff --git a/src/tui/WidgetStyle.zig b/src/tui/WidgetStyle.zig index 557be81..8b28e8a 100644 --- a/src/tui/WidgetStyle.zig +++ b/src/tui/WidgetStyle.zig @@ -59,39 +59,98 @@ pub const Border = struct { const @"round thick box": Border = .{ .nw = "█", .n = "▀", .ne = "█", .e = "█", .se = "█", .s = "▄", .sw = "█", .w = "█" }; }; -pub const default_static: @This() = .{}; -pub const default = &default_static; +const compact: @This() = .{}; -pub const boxed_static: @This() = .{ +const boxed: @This() = .{ .padding = Margin.@"1", .border = Border.box, }; -pub const boxed = &boxed_static; -pub const thick_boxed_static: @This() = .{ +const thick_boxed: @This() = .{ .padding = Margin.@"1/2", .border = Border.@"thick box (octant)", }; -pub const thick_boxed = &thick_boxed_static; -pub const bars_top_bottom_static: @This() = .{ +const bars_top_bottom: @This() = .{ .padding = Margin.@"top/bottom/1", .border = Border.@"thick box (octant)", }; -pub const bars_top_bottom = &bars_top_bottom_static; -pub const bars_left_right_static: @This() = .{ +const bars_left_right: @This() = .{ .padding = Margin.@"left/right/1", .border = Border.@"thick box (octant)", }; -pub const bars_left_right = &bars_left_right_static; pub fn from_type(style_type: Type) *const @This() { return switch (style_type) { - .none => default, - .palette => bars_top_bottom, - .panel => default, - .home => bars_left_right, + .none => none_style, + .palette => palette_style, + .panel => panel_style, + .home => home_style, + }; +} + +pub const Styles = enum { + compact, + boxed, + thick_boxed, + bars_top_bottom, + bars_left_right, +}; + +pub fn from_tag(tag: Styles) *const @This() { + return switch (tag) { + .compact => &compact, + .boxed => &boxed, + .thick_boxed => &thick_boxed, + .bars_top_bottom => &bars_top_bottom, + .bars_left_right => &bars_left_right, + }; +} + +pub fn next_tag(tag: Styles) Styles { + const new_value = @intFromEnum(tag) + 1; + return if (new_value > @intFromEnum(Styles.bars_left_right)) .compact else @enumFromInt(new_value); +} + +pub fn set_type_style(style_type: Type, tag: Styles) void { + const ref = type_style(style_type); + ref.* = from_tag(tag); +} + +pub fn set_next_style(style_type: Type) void { + const tag_ref = type_tag(style_type); + const new_tag = next_tag(tag_ref.*); + const style_ref = type_style(style_type); + tag_ref.* = new_tag; + style_ref.* = from_tag(new_tag); +} + +var none_style: *const @This() = &compact; +var palette_style: *const @This() = &bars_top_bottom; +var panel_style: *const @This() = &compact; +var home_style: *const @This() = &bars_left_right; + +fn type_style(style_type: Type) **const @This() { + return switch (style_type) { + .none => &none_style, + .palette => &palette_style, + .panel => &panel_style, + .home => &home_style, + }; +} + +var none_tag: Styles = .compact; +var palette_tag: Styles = .bars_top_bottom; +var panel_tag: Styles = .compact; +var home_tag: Styles = .bars_left_right; + +fn type_tag(style_type: Type) *Styles { + return switch (style_type) { + .none => &none_tag, + .palette => &palette_tag, + .panel => &panel_tag, + .home => &home_tag, }; }