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

commit1a03ce252b416042fa241776f1dd43936814cbf0
parentfe94a1e303
authorLucas Galante <[email protected]>
date2026-06-15 22:19
Add Popover section to Controls section of cce-system-interface

 src/main.rs            |  9 +++++++++
 src/pages/interface.rs | 33 ++++++++++++++++++++++++++++++++-
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/main.rs b/src/main.rs
index 45719eb..40b2147 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -952,6 +952,9 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                 // (Breadcrumb child widgets)
                 link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[15], &mut self.ui_context);
 
+                // (Popover child widgets)
+                link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[16], &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);
                 
@@ -1488,6 +1491,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                 13 => self.app.interface.toggle_disabled_color,
                 14 => self.app.interface.scrollinglist_bg_color,
                 15 => self.app.interface.breadcrumb_bg_color,
+                16 => self.app.interface.popover_bg_color,
                 _ => self.app.interface.low_color,
             };
             if cp.color != state_color {
@@ -1508,6 +1512,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                     13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                     14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
                     15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
+                    16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
                     _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                 }));
                 color_changed = true;
@@ -2640,6 +2645,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                         13 => pages::interface::InterfaceMessage::PickToggleDisabledColor,
                         14 => pages::interface::InterfaceMessage::PickScrollingListBgColor,
                         15 => pages::interface::InterfaceMessage::PickBreadcrumbBgColor,
+                        16 => pages::interface::InterfaceMessage::PickPopoverBgColor,
                         _ => pages::interface::InterfaceMessage::PickLowColor,
                     }));
                 }
@@ -2661,6 +2667,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                         13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                         14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
                         15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
+                        16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
                         _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                     }));
                 }
@@ -3539,6 +3546,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                             13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                             14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
                             15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
+                            16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
                             _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                         }));
                     }
@@ -4237,6 +4245,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
                             13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
                             14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
                             15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
+                            16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
                             _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
                         }));
                     }
diff --git a/src/pages/interface.rs b/src/pages/interface.rs
index 0e4d47f..8a60f22 100644
--- a/src/pages/interface.rs
+++ b/src/pages/interface.rs
@@ -33,6 +33,7 @@ pub struct InterfaceState {
     pub toggle_disabled_color: [u8; 3],
     pub scrollinglist_bg_color: [u8; 3],
     pub breadcrumb_bg_color: [u8; 3],
+    pub popover_bg_color: [u8; 3],
     pub color_selectors: Vec<ColorSelector>,
     pub menubar_opacity: f32,
     pub menubar_opacity_spinbox: Spinbox,
@@ -147,6 +148,7 @@ impl Default for InterfaceState {
             toggle_disabled_color: [135, 135, 148],
             scrollinglist_bg_color: [81, 81, 97],
             breadcrumb_bg_color: [81, 81, 97],
+            popover_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
@@ -164,6 +166,7 @@ impl Default for InterfaceState {
                 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
+                ColorSelector::new([81, 81, 97]).with_label("Background"), // 16: Popover - Background
             ],
             paginator_tab_margin_x: 5,
             paginator_tab_margin_y: 10,
@@ -280,6 +283,7 @@ pub enum InterfaceMessage {
     SetToggleDisabledColor([u8; 3]),
     SetScrollingListBgColor([u8; 3]),
     SetBreadcrumbBgColor([u8; 3]),
+    SetPopoverBgColor([u8; 3]),
     SetTabMarginX(u16),
     SetTabMarginY(u16),
     SetTabPaddingX(u16),
@@ -328,6 +332,7 @@ pub enum InterfaceMessage {
     PickToggleDisabledColor,
     PickScrollingListBgColor,
     PickBreadcrumbBgColor,
+    PickPopoverBgColor,
     Refreshed(InterfaceState),
     TypefaceRefreshed(InterfaceState),
     SetSans(String),
@@ -392,6 +397,8 @@ pub fn read_interface_config() -> InterfaceState {
     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 popover_bg = parse_color_from_key(&content, "popover_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 });
@@ -445,6 +452,7 @@ pub fn read_interface_config() -> InterfaceState {
         toggle_disabled_color: toggle_disabled,
         scrollinglist_bg_color: scrollinglist_bg,
         breadcrumb_bg_color: breadcrumb_bg,
+        popover_bg_color: popover_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
@@ -462,6 +470,7 @@ pub fn read_interface_config() -> InterfaceState {
             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
+            ColorSelector::new(popover_bg).with_label("Background").with_font_family(&color_selector_font), // 16: Popover - Background
         ],
         paginator_tab_margin_x,
         paginator_tab_margin_y,
@@ -799,6 +808,15 @@ fn apply_breadcrumb_bg_color(rgb: [u8; 3]) {
     clear_ui::color::set_breadcrumb_bg_color([r, g, b, 1.0]);
 }
 
+fn apply_popover_bg_color(rgb: [u8; 3]) {
+    let hex = format!("\"#{:02x}{:02x}{:02x}\"", rgb[0], rgb[1], rgb[2]);
+    write_config_value("popover_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_popover_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));
@@ -1519,6 +1537,15 @@ pub fn view(state: &mut InterfaceState, cx: f32, cy: f32, cw: f32, ch: f32, sec_
         });
         sec.spacing(12.0);
 
+        // Popover Section
+        sec.add_section("Popover", false, |subsec| {
+            subsec.spacing(8.0);
+            state.color_selectors[16].color = state.popover_bg_color;
+            subsec.widget_full(&mut state.color_selectors[16], 40.0, ctx);
+            subsec.spacing(8.0);
+        });
+        sec.spacing(12.0);
+
         // Spinbox Section
         sec.add_section("Spinbox", false, |subsec| {
             subsec.spacing(8.0);
@@ -1772,6 +1799,10 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
             state.breadcrumb_bg_color = rgb;
             apply_breadcrumb_bg_color(rgb);
         }
+        InterfaceMessage::SetPopoverBgColor(rgb) => {
+            state.popover_bg_color = rgb;
+            apply_popover_bg_color(rgb);
+        }
         InterfaceMessage::SetTabMarginX(margin) => {
             state.paginator_tab_margin_x = margin;
             apply_paginator_tab_margin_x(margin);
@@ -1925,7 +1956,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::PickBreadcrumbBgColor => {}
+        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::PickPopoverBgColor => {}
         InterfaceMessage::Refreshed(new) => {
             let was_mx_hovered = state.tab_margin_spinbox_x.hovered();
             let was_my_hovered = state.tab_margin_spinbox_y.hovered();