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

commit5abe1b62d38db2e3585171f49c90cdb1f598b41b
parent1375fd36fd
authorLucas Galante <[email protected]>
date2026-06-16 17:35
Add ButtonStrip section and Button Padding spinbox, remove old padding spinboxes

 src/main.rs            | 48 ++++++-------------------
 src/pages/interface.rs | 96 +++++++++++++++++---------------------------------
 2 files changed, 43 insertions(+), 101 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 337004f..e72a813 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -659,10 +659,8 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
         self.app.interface.menubar_opacity_spinbox.set_parent(None, &mut self.ui_context);
         self.app.interface.tab_margin_spinbox_y.clear_children(&mut self.ui_context);
         self.app.interface.tab_margin_spinbox_y.set_parent(None, &mut self.ui_context);
-        self.app.interface.tab_padding_spinbox_x.clear_children(&mut self.ui_context);
-        self.app.interface.tab_padding_spinbox_x.set_parent(None, &mut self.ui_context);
-        self.app.interface.tab_padding_spinbox_y.clear_children(&mut self.ui_context);
-        self.app.interface.tab_padding_spinbox_y.set_parent(None, &mut self.ui_context);
+        self.app.interface.button_padding_spinbox.clear_children(&mut self.ui_context);
+        self.app.interface.button_padding_spinbox.set_parent(None, &mut self.ui_context);
         self.app.interface.section_padding_spinbox.clear_children(&mut self.ui_context);
         self.app.interface.section_padding_spinbox.set_parent(None, &mut self.ui_context);
         self.app.interface.label_alignment_menu.clear_children(&mut self.ui_context);
@@ -940,8 +938,7 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
                 link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[11], &mut self.ui_context);
                 link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.tab_margin_spinbox_x, &mut self.ui_context);
                 link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.tab_margin_spinbox_y, &mut self.ui_context);
-                link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.tab_padding_spinbox_x, &mut self.ui_context);
-                link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.tab_padding_spinbox_y, &mut self.ui_context);
+                link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.button_padding_spinbox, &mut self.ui_context);
                 link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.menubar_opacity_spinbox, &mut self.ui_context);
                 
                 // (Toggles child widgets)
@@ -1881,10 +1878,7 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
             if self.app.interface.tab_margin_spinbox_y.cursor_moved(lx, ly, &mut self.ui_context) {
                 changed = true;
             }
-            if self.app.interface.tab_padding_spinbox_x.cursor_moved(lx, ly, &mut self.ui_context) {
-                changed = true;
-            }
-            if self.app.interface.tab_padding_spinbox_y.cursor_moved(lx, ly, &mut self.ui_context) {
+            if self.app.interface.button_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
                 changed = true;
             }
             if self.app.interface.section_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
@@ -2423,8 +2417,7 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
                     if self.app.interface.tab_margin_spinbox_x.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.menubar_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.tab_margin_spinbox_y.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
-                    if self.app.interface.tab_padding_spinbox_x.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
-                    if self.app.interface.tab_padding_spinbox_y.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+                    if self.app.interface.button_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.section_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.label_alignment_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.label_offset_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
@@ -2744,17 +2737,11 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
             if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
                 actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(sb.value as u16)));
             }
-            let sb = &mut self.app.interface.tab_padding_spinbox_x;
-            if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
-            let old = sb.value;
-            if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
-                actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabPaddingX(sb.value as u16)));
-            }
-            let sb = &mut self.app.interface.tab_padding_spinbox_y;
+            let sb = &mut self.app.interface.button_padding_spinbox;
             if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
             let old = sb.value;
             if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
-                actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabPaddingY(sb.value as u16)));
+                actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(sb.value as u16)));
             }
             let sb = &mut self.app.interface.section_padding_spinbox;
             if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
@@ -3624,11 +3611,8 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
                 if self.app.interface.tab_margin_spinbox_y.take_change() {
                     actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(self.app.interface.tab_margin_spinbox_y.value as u16)));
                 }
-                if self.app.interface.tab_padding_spinbox_x.take_change() {
-                    actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabPaddingX(self.app.interface.tab_padding_spinbox_x.value as u16)));
-                }
-                if self.app.interface.tab_padding_spinbox_y.take_change() {
-                    actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabPaddingY(self.app.interface.tab_padding_spinbox_y.value as u16)));
+                if self.app.interface.button_padding_spinbox.take_change() {
+                    actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(self.app.interface.button_padding_spinbox.value as u16)));
                 }
                 if self.app.interface.section_padding_spinbox.take_change() {
                     actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionPadding(self.app.interface.section_padding_spinbox.value as u16)));
@@ -4379,22 +4363,12 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
                 self.needs_rebuild = true;
                 return true;
             }
-            let sb = &mut self.app.interface.tab_padding_spinbox_x;
-            let old = sb.value;
-            if sb.keyboard_input(event, &mut self.ui_context) {
-                let new_val = sb.value;
-                if new_val != old {
-                    self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTabPaddingX(new_val as u16)));
-                }
-                self.needs_rebuild = true;
-                return true;
-            }
-            let sb = &mut self.app.interface.tab_padding_spinbox_y;
+            let sb = &mut self.app.interface.button_padding_spinbox;
             let old = sb.value;
             if sb.keyboard_input(event, &mut self.ui_context) {
                 let new_val = sb.value;
                 if new_val != old {
-                    self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTabPaddingY(new_val as u16)));
+                    self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(new_val as u16)));
                 }
                 self.needs_rebuild = true;
                 return true;
diff --git a/src/pages/interface.rs b/src/pages/interface.rs
index 9b39ba7..bd7b703 100644
--- a/src/pages/interface.rs
+++ b/src/pages/interface.rs
@@ -46,8 +46,8 @@ pub struct InterfaceState {
     pub tab_margin_spinbox_y: Spinbox,
     pub paginator_tab_padding_x: u16,
     pub paginator_tab_padding_y: u16,
-    pub tab_padding_spinbox_x: Spinbox,
-    pub tab_padding_spinbox_y: Spinbox,
+    pub button_padding: u16,
+    pub button_padding_spinbox: Spinbox,
     pub section_padding: u16,
     pub section_padding_spinbox: Spinbox,
     pub plate_padding: u16,
@@ -180,8 +180,8 @@ impl Default for InterfaceState {
             tab_margin_spinbox_y: Spinbox::new(10, 0, 100, 1).with_label("Tab Margin Y").with_unit("px"),
             paginator_tab_padding_x: 10,
             paginator_tab_padding_y: 14,
-            tab_padding_spinbox_x: Spinbox::new(10, 0, 100, 1).with_label("Tab Padding X").with_unit("px"),
-            tab_padding_spinbox_y: Spinbox::new(14, 0, 100, 1).with_label("Tab Padding Y").with_unit("px"),
+            button_padding: 14,
+            button_padding_spinbox: Spinbox::new(14, 0, 100, 1).with_label("Button Padding").with_unit("px"),
             section_padding: 8,
             section_padding_spinbox: Spinbox::new(8, 0, 100, 1).with_label("Padding").with_unit("px"),
             plate_padding: 20,
@@ -299,8 +299,7 @@ pub enum InterfaceMessage {
     SetNotificationOpacity(f32),
     SetTabMarginX(u16),
     SetTabMarginY(u16),
-    SetTabPaddingX(u16),
-    SetTabPaddingY(u16),
+    SetButtonPadding(u16),
     SetSectionPadding(u16),
     SetPlatePadding(u16),
     SetPageMargin(u16),
@@ -420,6 +419,7 @@ pub fn read_interface_config() -> InterfaceState {
     let paginator_tab_margin_y = parse_u16_from(&content, "paginator_tab_margin_y", if paginator_tab_margin_general != 999 { paginator_tab_margin_general } else { 10 });
     let paginator_tab_padding_x = parse_u16_from(&content, "paginator_tab_padding_x", 10);
     let paginator_tab_padding_y = parse_u16_from(&content, "paginator_tab_padding_y", 14);
+    let button_padding = parse_u16_from(&content, "button_padding", paginator_tab_padding_y);
     let section_padding = parse_u16_from(&content, "section_padding", 8);
     let plate_padding = parse_u16_from(&content, "plate_padding", 20);
     let page_margin = parse_u16_from(&content, "page_margin", 20);
@@ -497,8 +497,8 @@ pub fn read_interface_config() -> InterfaceState {
         tab_margin_spinbox_y: Spinbox::new(paginator_tab_margin_y as i32, 0, 100, 1).with_label("Tab Margin Y").with_unit("px"),
         paginator_tab_padding_x,
         paginator_tab_padding_y,
-        tab_padding_spinbox_x: Spinbox::new(paginator_tab_padding_x as i32, 0, 100, 1).with_label("Tab Padding X").with_unit("px"),
-        tab_padding_spinbox_y: Spinbox::new(paginator_tab_padding_y as i32, 0, 100, 1).with_label("Tab Padding Y").with_unit("px"),
+        button_padding,
+        button_padding_spinbox: Spinbox::new(button_padding as i32, 0, 100, 1).with_label("Button Padding").with_unit("px"),
         section_padding,
         section_padding_spinbox: Spinbox::new(section_padding as i32, 0, 100, 1).with_label("Padding").with_unit("px"),
         plate_padding,
@@ -864,16 +864,10 @@ fn apply_paginator_tab_margin_y(margin: u16) {
     cce_ui::layout::set_paginator_tab_margin_y(margin as f32);
 }
 
-fn apply_paginator_tab_padding_x(padding: u16) {
-    write_config_value("paginator_tab_padding_x", &padding.to_string());
-    send_ipc_command(&format!("layout paginator_tab_padding_x {}", padding));
-    cce_ui::layout::set_paginator_tab_padding_x(padding as f32);
-}
-
-fn apply_paginator_tab_padding_y(padding: u16) {
-    write_config_value("paginator_tab_padding_y", &padding.to_string());
-    send_ipc_command(&format!("layout paginator_tab_padding_y {}", padding));
-    cce_ui::layout::set_paginator_tab_padding_y(padding as f32);
+fn apply_button_padding(padding: u16) {
+    write_config_value("button_padding", &padding.to_string());
+    send_ipc_command(&format!("layout button_padding {}", padding));
+    cce_ui::layout::set_button_padding(padding as f32);
 }
 
 fn apply_plate_padding(padding: u16) {
@@ -1529,12 +1523,6 @@ pub fn view(state: &mut InterfaceState, cx: f32, cy: f32, cw: f32, ch: f32, sec_
             state.tab_margin_spinbox_y.value = state.paginator_tab_margin_y as i32;
             subsec.widget_full(&mut state.tab_margin_spinbox_y, 44.0, ctx);
             subsec.spacing(8.0);
-            state.tab_padding_spinbox_x.value = state.paginator_tab_padding_x as i32;
-            subsec.widget_full(&mut state.tab_padding_spinbox_x, 44.0, ctx);
-            subsec.spacing(8.0);
-            state.tab_padding_spinbox_y.value = state.paginator_tab_padding_y as i32;
-            subsec.widget_full(&mut state.tab_padding_spinbox_y, 44.0, ctx);
-            subsec.spacing(8.0);
             state.menubar_font_selector.font_family = state.menubar_font.clone();
             subsec.widget_full(&mut state.menubar_font_selector, 44.0, ctx);
             subsec.spacing(8.0);
@@ -1656,6 +1644,15 @@ pub fn view(state: &mut InterfaceState, cx: f32, cy: f32, cw: f32, ch: f32, sec_
         });
         sec.spacing(12.0);
 
+        // ButtonStrip Section
+        sec.add_section("ButtonStrip", false, |subsec| {
+            subsec.spacing(8.0);
+            state.button_padding_spinbox.value = state.button_padding as i32;
+            subsec.widget_full(&mut state.button_padding_spinbox, 44.0, ctx);
+            subsec.spacing(8.0);
+        });
+        sec.spacing(12.0);
+
         // Labels Section
         sec.add_section("Labels", false, |subsec| {
             subsec.spacing(8.0);
@@ -1874,13 +1871,9 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
             state.paginator_tab_margin_y = margin;
             apply_paginator_tab_margin_y(margin);
         }
-        InterfaceMessage::SetTabPaddingX(padding) => {
-            state.paginator_tab_padding_x = padding;
-            apply_paginator_tab_padding_x(padding);
-        }
-        InterfaceMessage::SetTabPaddingY(padding) => {
-            state.paginator_tab_padding_y = padding;
-            apply_paginator_tab_padding_y(padding);
+        InterfaceMessage::SetButtonPadding(padding) => {
+            state.button_padding = padding;
+            apply_button_padding(padding);
         }
         InterfaceMessage::SetSectionPadding(padding) => {
             state.section_padding = padding;
@@ -2027,8 +2020,7 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
         InterfaceMessage::Refreshed(new) => {
             let was_mx_hovered = state.tab_margin_spinbox_x.hovered();
             let was_my_hovered = state.tab_margin_spinbox_y.hovered();
-            let was_px_hovered = state.tab_padding_spinbox_x.hovered();
-            let was_py_hovered = state.tab_padding_spinbox_y.hovered();
+            let was_bp_hovered = state.button_padding_spinbox.hovered();
             let was_sp_hovered = state.section_padding_spinbox.hovered();
             let was_pp_hovered = state.plate_padding_spinbox.hovered();
             let was_pm_hovered = state.page_margin_spinbox.hovered();
@@ -2080,8 +2072,7 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
 
             state.tab_margin_spinbox_x.set_hovered(was_mx_hovered);
             state.tab_margin_spinbox_y.set_hovered(was_my_hovered);
-            state.tab_padding_spinbox_x.set_hovered(was_px_hovered);
-            state.tab_padding_spinbox_y.set_hovered(was_py_hovered);
+            state.button_padding_spinbox.set_hovered(was_bp_hovered);
             state.section_padding_spinbox.set_hovered(was_sp_hovered);
             state.plate_padding_spinbox.set_hovered(was_pp_hovered);
             state.page_margin_spinbox.set_hovered(was_pm_hovered);
@@ -3175,46 +3166,23 @@ mod tests {
     }
 
     #[test]
-    fn test_read_write_paginator_tab_padding_x() {
-        let dir = std::env::temp_dir();
-        let path = dir.join("test_paginator_tab_padding_x_config.toml");
-        let path_str = path.to_str().unwrap();
-
-        let initial_content = "[layout]\ngap = 18\nborder_color = \"#374673\"\n";
-        fs::write(path_str, initial_content).unwrap();
-
-        let content = fs::read_to_string(path_str).unwrap();
-        let val = parse_u16_from(&content, "paginator_tab_padding_x", 10);
-        assert_eq!(val, 10);
-
-        assert!(write_config_value_path(path_str, "paginator_tab_padding_x", "15"));
-        let updated = fs::read_to_string(path_str).unwrap();
-        assert!(updated.contains("paginator_tab_padding_x = 15"));
-
-        let val2 = parse_u16_from(&updated, "paginator_tab_padding_x", 10);
-        assert_eq!(val2, 15);
-
-        let _ = fs::remove_file(path_str);
-    }
-
-    #[test]
-    fn test_read_write_paginator_tab_padding_y() {
+    fn test_read_write_button_padding() {
         let dir = std::env::temp_dir();
-        let path = dir.join("test_paginator_tab_padding_y_config.toml");
+        let path = dir.join("test_button_padding_config.toml");
         let path_str = path.to_str().unwrap();
 
         let initial_content = "[layout]\ngap = 18\nborder_color = \"#374673\"\n";
         fs::write(path_str, initial_content).unwrap();
 
         let content = fs::read_to_string(path_str).unwrap();
-        let val = parse_u16_from(&content, "paginator_tab_padding_y", 14);
+        let val = parse_u16_from(&content, "button_padding", 14);
         assert_eq!(val, 14);
 
-        assert!(write_config_value_path(path_str, "paginator_tab_padding_y", "20"));
+        assert!(write_config_value_path(path_str, "button_padding", "20"));
         let updated = fs::read_to_string(path_str).unwrap();
-        assert!(updated.contains("paginator_tab_padding_y = 20"));
+        assert!(updated.contains("button_padding = 20"));
 
-        let val2 = parse_u16_from(&updated, "paginator_tab_padding_y", 14);
+        let val2 = parse_u16_from(&updated, "button_padding", 14);
         assert_eq!(val2, 20);
 
         let _ = fs::remove_file(path_str);