git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

commit212b568577c61eafde04c40e5bc00b8da44e4f5e
parent728d4f4247
authorLucas Galante <[email protected]>
date2026-06-28 06:00
Support global font_selector_font configuration and render FontSelector widgets using it

 src/layout.rs                     | 76 +++++++++++++++++++++++++++++++++++++++
 src/widget/input/font_selector.rs |  2 +-
 2 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/src/layout.rs b/src/layout.rs
index c8d899a..fffb09b 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -106,6 +106,8 @@ static SLIDER_CORNER_RADIUS: RwLock<f32> = RwLock::new(4.0);
 static TOGGLE_BORDER_WIDTH: RwLock<f32> = RwLock::new(1.0);
 static TOGGLE_FONT: RwLock<String> = RwLock::new(String::new());
 static TOGGLE_FONT_CACHED: RwLock<Option<(String, f32)>> = RwLock::new(None);
+static FONT_SELECTOR_FONT: RwLock<String> = RwLock::new(String::new());
+static FONT_SELECTOR_FONT_CACHED: RwLock<Option<(String, f32)>> = RwLock::new(None);
 static PLATE_CORNER_RADIUS: RwLock<f32> = RwLock::new(12.0);
 static PLATE_OPACITY: RwLock<f32> = RwLock::new(1.0);
 static PAGE_OPACITY: RwLock<f32> = RwLock::new(1.0);
@@ -137,6 +139,7 @@ pub fn reload_config() {
     if let Some(content) = read_config() {
         let mut menubar_font_changed = false;
         let mut toggle_font_changed = false;
+        let mut font_selector_font_changed = false;
         for line in content.lines() {
             let trimmed = line.trim();
             if let Some(rest) = trimmed.strip_prefix("label_margin") {
@@ -519,6 +522,21 @@ pub fn reload_config() {
                     toggle_font_changed = true;
                 }
             }
+            if let Some(rest) = trimmed.strip_prefix("font_selector_font") {
+                let rest = rest.trim_start_matches(|c: char| c == ' ' || c == '=');
+                let rest = mod_rest(rest);
+                let font = rest.trim().to_string();
+                let mut changed = false;
+                if let Ok(mut lock) = FONT_SELECTOR_FONT.write() {
+                    if *lock != font {
+                        *lock = font;
+                        changed = true;
+                    }
+                }
+                if changed {
+                    font_selector_font_changed = true;
+                }
+            }
         }
         if menubar_font_changed {
             if let Ok(mut lock) = MENUBAR_FONT_CACHED.write() {
@@ -530,6 +548,11 @@ pub fn reload_config() {
                 *lock = None;
             }
         }
+        if font_selector_font_changed {
+            if let Ok(mut lock) = FONT_SELECTOR_FONT_CACHED.write() {
+                *lock = None;
+            }
+        }
         crate::color::reload_colors(&content);
     }
 }
@@ -1234,6 +1257,59 @@ pub fn set_toggle_font(font: &str) {
     }
 }
 
+pub fn font_selector_font() -> String {
+    use std::sync::Once;
+    static INIT: Once = Once::new();
+    INIT.call_once(|| {
+        let mut font = "Outfit".to_string();
+        if let Some(content) = read_config() {
+            for line in content.lines() {
+                let trimmed = line.trim();
+                if let Some(rest) = trimmed.strip_prefix("font_selector_font") {
+                    let rest = rest.trim_start_matches(|c: char| c == ' ' || c == '=');
+                    let rest = mod_rest(rest);
+                    font = rest.trim().to_string();
+                }
+            }
+        }
+        if let Ok(mut lock) = FONT_SELECTOR_FONT.write() {
+            *lock = font;
+        }
+    });
+    let lock = FONT_SELECTOR_FONT.read().unwrap();
+    if lock.is_empty() {
+        "Outfit".to_string()
+    } else {
+        lock.clone()
+    }
+}
+
+pub fn font_selector_font_parsed() -> (String, f32) {
+    if let Ok(lock) = FONT_SELECTOR_FONT_CACHED.read() {
+        if let Some(ref val) = *lock {
+            return val.clone();
+        }
+    }
+    let font_str = font_selector_font();
+    let parsed = parse_font_string(&font_str);
+    let size = parsed.1.unwrap_or(12.0);
+    let val = (parsed.0, size);
+    if let Ok(mut lock) = FONT_SELECTOR_FONT_CACHED.write() {
+        *lock = Some(val.clone());
+    }
+    val
+}
+
+pub fn set_font_selector_font(font: &str) {
+    if let Ok(mut lock) = FONT_SELECTOR_FONT.write() {
+        *lock = font.to_string();
+    }
+    if let Ok(mut lock) = FONT_SELECTOR_FONT_CACHED.write() {
+        *lock = None;
+    }
+}
+
+
 pub fn section_label_font() -> String {
     use std::sync::Once;
     static INIT: Once = Once::new();
diff --git a/src/widget/input/font_selector.rs b/src/widget/input/font_selector.rs
index b436d8a..c54d12d 100644
--- a/src/widget/input/font_selector.rs
+++ b/src/widget/input/font_selector.rs
@@ -48,7 +48,7 @@ impl Element for FontSelector {
     }
 
     fn widget_font(&self) -> Option<String> {
-        Some(self.font_family.clone())
+        Some(crate::layout::font_selector_font())
     }
 
     fn color(&self) -> [f32; 4] {