git.lucas.co / cce-system-interface
system settings
git clone https://git.lucas.co/cce-system-interface.git

commitfe94a1e303e21ae1e6e35761dbd54e894292ba14
parentf1ccb6bdbf
authorLucas Galante <[email protected]>
date2026-06-15 22:04
Add Breadcrumb section to Controls settings and introduce dynamic Background color selector

 src/main.rs            |  9 +++++++++
 src/pages/interface.rs | 36 ++++++++++++++++++++++++++++++++++--
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 670d3d3..45719eb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -949,6 +949,9 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                 // (ScrollingList child widgets)
                 link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[14], &mut self.ui_context);
 
+                // (Breadcrumb child widgets)
+                link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[15], &mut self.ui_context);
+
                 // (Spinbox child widgets)
                 link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.spinbox_height_spinbox, &mut self.ui_context);
                 
@@ -1484,6 +1487,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                 12 => self.app.interface.toggle_enabled_color,
                 13 => self.app.interface.toggle_disabled_color,
                 14 => self.app.interface.scrollinglist_bg_color,
+                15 => self.app.interface.breadcrumb_bg_color,
                 _ => self.app.interface.low_color,
             };
             if cp.color != state_color {
@@ -1503,6 +1507,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                     12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
                     13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                     14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+                    15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
                     _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                 }));
                 color_changed = true;
@@ -2634,6 +2639,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                         12 => pages::interface::InterfaceMessage::PickToggleEnabledColor,
                         13 => pages::interface::InterfaceMessage::PickToggleDisabledColor,
                         14 => pages::interface::InterfaceMessage::PickScrollingListBgColor,
+                        15 => pages::interface::InterfaceMessage::PickBreadcrumbBgColor,
                         _ => pages::interface::InterfaceMessage::PickLowColor,
                     }));
                 }
@@ -2654,6 +2660,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                         12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
                         13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                         14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+                        15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
                         _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                     }));
                 }
@@ -3531,6 +3538,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                             12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
                             13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                             14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+                            15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
                             _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                         }));
                     }
@@ -4228,6 +4236,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                             12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
                             13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                             14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+                            15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
                             _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                         }));
                     }
diff --git a/src/pages/interface.rs b/src/pages/interface.rs
index b2ab726..0e4d47f 100644
--- a/src/pages/interface.rs
+++ b/src/pages/interface.rs
@@ -32,6 +32,7 @@ pub struct InterfaceState {
     pub toggle_enabled_color: [u8; 3],
     pub toggle_disabled_color: [u8; 3],
     pub scrollinglist_bg_color: [u8; 3],
+    pub breadcrumb_bg_color: [u8; 3],
     pub color_selectors: Vec<ColorSelector>,
     pub menubar_opacity: f32,
     pub menubar_opacity_spinbox: Spinbox,
@@ -145,6 +146,7 @@ impl Default for InterfaceState {
             toggle_enabled_color: [104, 217, 165],
             toggle_disabled_color: [135, 135, 148],
             scrollinglist_bg_color: [81, 81, 97],
+            breadcrumb_bg_color: [81, 81, 97],
             color_selectors: vec![
                 ColorSelector::new([71, 71, 81]).with_label("Low Color"), // 0: Plate - Low Color
                 ColorSelector::new([0x3e, 0x3e, 0x3e]).with_label("High Color"), // 1: Layout - High Color
@@ -161,6 +163,7 @@ impl Default for InterfaceState {
                 ColorSelector::new([104, 217, 165]).with_label("Enabled"), // 12: Toggles - Enabled
                 ColorSelector::new([135, 135, 148]).with_label("Disabled"), // 13: Toggles - Disabled
                 ColorSelector::new([81, 81, 97]).with_label("Background"), // 14: ScrollingList - Background
+                ColorSelector::new([81, 81, 97]).with_label("Background"), // 15: Breadcrumb - Background
             ],
             paginator_tab_margin_x: 5,
             paginator_tab_margin_y: 10,
@@ -276,6 +279,7 @@ pub enum InterfaceMessage {
     SetToggleEnabledColor([u8; 3]),
     SetToggleDisabledColor([u8; 3]),
     SetScrollingListBgColor([u8; 3]),
+    SetBreadcrumbBgColor([u8; 3]),
     SetTabMarginX(u16),
     SetTabMarginY(u16),
     SetTabPaddingX(u16),
@@ -323,6 +327,7 @@ pub enum InterfaceMessage {
     PickToggleEnabledColor,
     PickToggleDisabledColor,
     PickScrollingListBgColor,
+    PickBreadcrumbBgColor,
     Refreshed(InterfaceState),
     TypefaceRefreshed(InterfaceState),
     SetSans(String),
@@ -385,6 +390,8 @@ pub fn read_interface_config() -> InterfaceState {
     let toggle_disabled = parse_color_from_key(&content, "toggle_disabled_color", [135, 135, 148]);
 
     let scrollinglist_bg = parse_color_from_key(&content, "scrollinglist_bg_color", [81, 81, 97]);
+
+    let breadcrumb_bg = parse_color_from_key(&content, "breadcrumb_bg_color", scrollinglist_bg);
     
     let paginator_tab_margin_general = parse_u16_from(&content, "paginator_tab_margin", 999);
     let paginator_tab_margin_x = parse_u16_from(&content, "paginator_tab_margin_x", if paginator_tab_margin_general != 999 { paginator_tab_margin_general } else { 5 });
@@ -437,6 +444,7 @@ pub fn read_interface_config() -> InterfaceState {
         toggle_enabled_color: toggle_enabled,
         toggle_disabled_color: toggle_disabled,
         scrollinglist_bg_color: scrollinglist_bg,
+        breadcrumb_bg_color: breadcrumb_bg,
         color_selectors: vec![
             ColorSelector::new(page_low).with_label("Low Color").with_font_family(&color_selector_font), // 0: Plate - Low Color
             ColorSelector::new(border).with_label("High Color").with_font_family(&color_selector_font), // 1: Layout - High Color
@@ -453,6 +461,7 @@ pub fn read_interface_config() -> InterfaceState {
             ColorSelector::new(toggle_enabled).with_label("Enabled").with_font_family(&color_selector_font), // 12: Toggles - Enabled
             ColorSelector::new(toggle_disabled).with_label("Disabled").with_font_family(&color_selector_font), // 13: Toggles - Disabled
             ColorSelector::new(scrollinglist_bg).with_label("Background").with_font_family(&color_selector_font), // 14: ScrollingList - Background
+            ColorSelector::new(breadcrumb_bg).with_label("Background").with_font_family(&color_selector_font), // 15: Breadcrumb - Background
         ],
         paginator_tab_margin_x,
         paginator_tab_margin_y,
@@ -781,6 +790,15 @@ fn apply_scrollinglist_bg_color(rgb: [u8; 3]) {
     clear_ui::color::set_scrollinglist_bg_color([r, g, b, 0.3]);
 }
 
+fn apply_breadcrumb_bg_color(rgb: [u8; 3]) {
+    let hex = format!("\"#{:02x}{:02x}{:02x}\"", rgb[0], rgb[1], rgb[2]);
+    write_config_value("breadcrumb_bg_color", &hex);
+    let r = clear_ui::color::srgb_to_linear(rgb[0] as f32 / 255.0);
+    let g = clear_ui::color::srgb_to_linear(rgb[1] as f32 / 255.0);
+    let b = clear_ui::color::srgb_to_linear(rgb[2] as f32 / 255.0);
+    clear_ui::color::set_breadcrumb_bg_color([r, g, b, 1.0]);
+}
+
 fn apply_paginator_tab_margin_x(margin: u16) {
     write_config_value("paginator_tab_margin_x", &margin.to_string());
     send_ipc_command(&format!("layout paginator_tab_margin_x {}", margin));
@@ -1492,6 +1510,15 @@ pub fn view(state: &mut InterfaceState, cx: f32, cy: f32, cw: f32, ch: f32, sec_
         });
         sec.spacing(12.0);
 
+        // Breadcrumb Section
+        sec.add_section("Breadcrumb", false, |subsec| {
+            subsec.spacing(8.0);
+            state.color_selectors[15].color = state.breadcrumb_bg_color;
+            subsec.widget_full(&mut state.color_selectors[15], 40.0, ctx);
+            subsec.spacing(8.0);
+        });
+        sec.spacing(12.0);
+
         // Spinbox Section
         sec.add_section("Spinbox", false, |subsec| {
             subsec.spacing(8.0);
@@ -1741,6 +1768,10 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
             state.scrollinglist_bg_color = rgb;
             apply_scrollinglist_bg_color(rgb);
         }
+        InterfaceMessage::SetBreadcrumbBgColor(rgb) => {
+            state.breadcrumb_bg_color = rgb;
+            apply_breadcrumb_bg_color(rgb);
+        }
         InterfaceMessage::SetTabMarginX(margin) => {
             state.paginator_tab_margin_x = margin;
             apply_paginator_tab_margin_x(margin);
@@ -1894,7 +1925,7 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
             send_ipc_command("reload");
             status_interface_reload();
         }
-        InterfaceMessage::PickLowColor | InterfaceMessage::PickHighColor | InterfaceMessage::PickDisabledColor | InterfaceMessage::PickSeparatorColor | InterfaceMessage::PickVisualGuides | InterfaceMessage::PickSliderTrackColor | InterfaceMessage::PickPageLowColor | InterfaceMessage::PickColorBordersColor | InterfaceMessage::PickNormalColor | InterfaceMessage::PickPaginatorSidebarColor | InterfaceMessage::PickPrimaryHighlightColor | InterfaceMessage::PickMenubarTabLabelColor | InterfaceMessage::PickToggleEnabledColor | InterfaceMessage::PickToggleDisabledColor | InterfaceMessage::PickScrollingListBgColor => {}
+        InterfaceMessage::PickLowColor | InterfaceMessage::PickHighColor | InterfaceMessage::PickDisabledColor | InterfaceMessage::PickSeparatorColor | InterfaceMessage::PickVisualGuides | InterfaceMessage::PickSliderTrackColor | InterfaceMessage::PickPageLowColor | InterfaceMessage::PickColorBordersColor | InterfaceMessage::PickNormalColor | InterfaceMessage::PickPaginatorSidebarColor | InterfaceMessage::PickPrimaryHighlightColor | InterfaceMessage::PickMenubarTabLabelColor | InterfaceMessage::PickToggleEnabledColor | InterfaceMessage::PickToggleDisabledColor | InterfaceMessage::PickScrollingListBgColor | InterfaceMessage::PickBreadcrumbBgColor => {}
         InterfaceMessage::Refreshed(new) => {
             let was_mx_hovered = state.tab_margin_spinbox_x.hovered();
             let was_my_hovered = state.tab_margin_spinbox_y.hovered();
@@ -2404,7 +2435,7 @@ mod tests {
 
     #[test]
     fn test_parse_color_from_key() {
-        let content = "\n[layout]\nlow_color = \"#112233\"\nhigh_color = \"#445566\"\ndisabled_color = \"#778899\"\nstatus_separator_color = \"#aabbcc\"\nvisual_guides_color = \"#ddeeff\"\nslider_track_color = \"#123456\"\npage_low_color = \"#474751\"\ncolor_borders_color = \"#abcdef\"\nstatus_normal_color = \"#ccccd8\"\npaginator_sidebar_color = \"#5a5a65\"\nprimary_highlight_color = \"#ffffff\"\nmenubar_tab_label_color = \"#e6e6f2\"\ntoggle_enabled_color = \"#68d8a5\"\ntoggle_disabled_color = \"#878794\"\nscrollinglist_bg_color = \"#515161\"\n";
+        let content = "\n[layout]\nlow_color = \"#112233\"\nhigh_color = \"#445566\"\ndisabled_color = \"#778899\"\nstatus_separator_color = \"#aabbcc\"\nvisual_guides_color = \"#ddeeff\"\nslider_track_color = \"#123456\"\npage_low_color = \"#474751\"\ncolor_borders_color = \"#abcdef\"\nstatus_normal_color = \"#ccccd8\"\npaginator_sidebar_color = \"#5a5a65\"\nprimary_highlight_color = \"#ffffff\"\nmenubar_tab_label_color = \"#e6e6f2\"\ntoggle_enabled_color = \"#68d8a5\"\ntoggle_disabled_color = \"#878794\"\nscrollinglist_bg_color = \"#515161\"\nbreadcrumb_bg_color = \"#515161\"\n";
         assert_eq!(parse_color_from_key(content, "low_color", [0, 0, 0]), [17, 34, 51]);
         assert_eq!(parse_color_from_key(content, "high_color", [0, 0, 0]), [68, 85, 102]);
         assert_eq!(parse_color_from_key(content, "disabled_color", [0, 0, 0]), [119, 136, 153]);
@@ -2420,6 +2451,7 @@ mod tests {
         assert_eq!(parse_color_from_key(content, "toggle_enabled_color", [0, 0, 0]), [104, 216, 165]);
         assert_eq!(parse_color_from_key(content, "toggle_disabled_color", [0, 0, 0]), [135, 135, 148]);
         assert_eq!(parse_color_from_key(content, "scrollinglist_bg_color", [0, 0, 0]), [81, 81, 97]);
+        assert_eq!(parse_color_from_key(content, "breadcrumb_bg_color", [0, 0, 0]), [81, 81, 97]);
         assert_eq!(parse_color_from_key(content, "non_existent", [1, 2, 3]), [1, 2, 3]);
     }