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

commita4413c379b2994b66dfead0f34874b2352284f9e
parent36fff316e6
authorLucas Galante <[email protected]>
date2026-06-19 11:51
Add breadcrumb font selector to Breadcrumb settings section

 src/main.rs            | 16 ++++++++++++++++
 src/pages/interface.rs | 23 +++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/src/main.rs b/src/main.rs
index 45a4c21..ab68391 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -767,6 +767,8 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
         self.app.interface.color_selector_font_selector.set_parent(None, &mut self.ui_context);
         self.app.interface.menubar_font_selector.clear_children(&mut self.ui_context);
         self.app.interface.menubar_font_selector.set_parent(None, &mut self.ui_context);
+        self.app.interface.breadcrumb_font_selector.clear_children(&mut self.ui_context);
+        self.app.interface.breadcrumb_font_selector.set_parent(None, &mut self.ui_context);
         self.app.interface.section_label_font_selector.clear_children(&mut self.ui_context);
         self.app.interface.section_label_font_selector.set_parent(None, &mut self.ui_context);
         self.app.interface.nested_section_label_font_selector.clear_children(&mut self.ui_context);
@@ -1007,6 +1009,7 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
                 
                 // (Breadcrumb child widgets)
                 link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[15], &mut self.ui_context);
+                link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.breadcrumb_font_selector, &mut self.ui_context);
  
                 // (Spinbox child widgets)
                 link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.spinbox_height_spinbox, &mut self.ui_context);
@@ -1990,6 +1993,9 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
             if self.app.interface.menubar_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
                 changed = true;
             }
+            if self.app.interface.breadcrumb_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
+                changed = true;
+            }
             if self.app.interface.section_label_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
                 changed = true;
             }
@@ -2541,6 +2547,7 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
                     if self.app.interface.color_selector_preview_margin_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.color_selector_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.menubar_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+                    if self.app.interface.breadcrumb_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.section_label_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.nested_section_label_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
                     if self.app.interface.textbox_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
@@ -3554,6 +3561,15 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
                 actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarFont(fs.font_family.clone())));
             }
 
+            let fs = &mut self.app.interface.breadcrumb_font_selector;
+            if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
+            if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+                self.needs_rebuild = true;
+            }
+            if fs.take_change() {
+                actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBreadcrumbFont(fs.font_family.clone())));
+            }
+
             let fs = &mut self.app.interface.section_label_font_selector;
             if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
             if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
diff --git a/src/pages/interface.rs b/src/pages/interface.rs
index f2ef1e8..91b7e9c 100644
--- a/src/pages/interface.rs
+++ b/src/pages/interface.rs
@@ -147,6 +147,8 @@ pub struct InterfaceState {
     pub section_label_font_selector: FontSelector,
     pub nested_section_label_font: String,
     pub nested_section_label_font_selector: FontSelector,
+    pub breadcrumb_font: String,
+    pub breadcrumb_font_selector: FontSelector,
     // Graph configuration fields
     pub graph_show_grid: bool,
     pub graph_show_grid_toggle: Toggle,
@@ -309,6 +311,8 @@ impl Default for InterfaceState {
             section_label_font_selector: FontSelector::new("Outfit".to_string()).with_label("Label"),
             nested_section_label_font: "Outfit".to_string(),
             nested_section_label_font_selector: FontSelector::new("Outfit".to_string()).with_label("Label"),
+            breadcrumb_font: "Outfit".to_string(),
+            breadcrumb_font_selector: FontSelector::new("Outfit".to_string()).with_label("Font"),
             graph_show_grid: true,
             graph_show_grid_toggle: Toggle::new().with_label("Show Grid"),
             graph_snap_enabled: true,
@@ -393,6 +397,7 @@ pub enum InterfaceMessage {
     SetButtonCornerRadius(u16),
     SetColorSelectorFont(String),
     SetMenubarFont(String),
+    SetBreadcrumbFont(String),
     SetSectionLabelFont(String),
     SetNestedSectionLabelFont(String),
     SetNestedSectionLabelAlignment(usize),
@@ -531,6 +536,7 @@ pub fn read_interface_config() -> InterfaceState {
     let menubar_font = parse_string_from(&content, "menubar_font", "Outfit");
     let section_label_font = parse_string_from(&content, "section_label_font", "Outfit");
     let nested_section_label_font = parse_string_from(&content, "nested_section_label_font", "Outfit");
+    let breadcrumb_font = parse_string_from(&content, "breadcrumb_font", "Outfit");
     let nested_section_label_alignment = parse_u16_from(&content, "nested_section_label_alignment", 0) as u8;
     let nested_section_label_offset = parse_i16_from(&content, "nested_section_label_offset", 0);
     let label_margin = parse_u16_from(&content, "label_margin", 6);
@@ -692,6 +698,8 @@ pub fn read_interface_config() -> InterfaceState {
         section_label_font_selector: FontSelector::new(section_label_font.clone()).with_label("Label"),
         nested_section_label_font: nested_section_label_font.clone(),
         nested_section_label_font_selector: FontSelector::new(nested_section_label_font.clone()).with_label("Label"),
+        breadcrumb_font: breadcrumb_font.clone(),
+        breadcrumb_font_selector: FontSelector::new(breadcrumb_font.clone()).with_label("Font"),
         graph_show_grid,
         graph_show_grid_toggle: Toggle::new().with_label("Show Grid"),
         graph_snap_enabled,
@@ -1500,6 +1508,11 @@ fn apply_menubar_font(font: &str) {
     cce_ui::layout::set_menubar_font(font);
 }
 
+fn apply_breadcrumb_font(font: &str) {
+    write_config_value("breadcrumb_font", &format!("\"{}\"", font));
+    cce_ui::layout::set_breadcrumb_font(font);
+}
+
 fn apply_section_label_font(font: &str) {
     write_config_value("section_label_font", &format!("\"{}\"", font));
     cce_ui::layout::set_section_label_font(font);
@@ -2028,6 +2041,9 @@ pub fn view(state: &mut InterfaceState, cx: f32, cy: f32, cw: f32, ch: f32, sec_
             state.color_selectors[15].color = state.breadcrumb_bg_color;
             subsec.widget_full(&mut state.color_selectors[15], 40.0, ctx);
             subsec.spacing(8.0);
+            state.breadcrumb_font_selector.font_family = state.breadcrumb_font.clone();
+            subsec.widget_full(&mut state.breadcrumb_font_selector, 44.0, ctx);
+            subsec.spacing(8.0);
         });
         sec.spacing(12.0);
 
@@ -2649,6 +2665,11 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
             state.menubar_font_selector.font_family = font.clone();
             apply_menubar_font(&font);
         }
+        InterfaceMessage::SetBreadcrumbFont(font) => {
+            state.breadcrumb_font = font.clone();
+            state.breadcrumb_font_selector.font_family = font.clone();
+            apply_breadcrumb_font(&font);
+        }
         InterfaceMessage::SetSectionLabelFont(font) => {
             state.section_label_font = font.clone();
             state.section_label_font_selector.font_family = font.clone();
@@ -2756,6 +2777,7 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
             let was_tcr_hovered = state.textbox_corner_radius_spinbox.hovered();
             let was_fsh_hovered = state.font_selector_height_spinbox.hovered();
             let was_fscr_hovered = state.font_selector_corner_radius_spinbox.hovered();
+            let was_bfs_hovered = state.breadcrumb_font_selector.hovered();
             let was_lm_hovered = state.label_margin_spinbox.hovered();
             let was_mo_hovered = state.menubar_opacity_spinbox.hovered();
             let was_no_hovered = state.notification_opacity_spinbox.hovered();
@@ -2822,6 +2844,7 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
             state.textbox_corner_radius_spinbox.set_hovered(was_tcr_hovered);
             state.font_selector_height_spinbox.set_hovered(was_fsh_hovered);
             state.font_selector_corner_radius_spinbox.set_hovered(was_fscr_hovered);
+            state.breadcrumb_font_selector.set_hovered(was_bfs_hovered);
             state.label_margin_spinbox.set_hovered(was_lm_hovered);
             state.menubar_opacity_spinbox.set_hovered(was_mo_hovered);
             state.notification_opacity_spinbox.set_hovered(was_no_hovered);