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

commit3c881cfb965e0df96bb9b3df1be17a140fc3a229
parent73367dd7be
authorLucas Galante <[email protected]>
date2026-07-05 15:30
feat: add support for checkbox styling config keys

 src/color.rs                 | 45 ++++++++++++++++++++++++++++++++++++++++++++
 src/widget/input/checkbox.rs | 12 ++++++------
 2 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/src/color.rs b/src/color.rs
index e20c40b..5897384 100644
--- a/src/color.rs
+++ b/src/color.rs
@@ -76,6 +76,9 @@ static SPINBOX_DISPLAY_COLOR: RwLock<[f32; 4]> = RwLock::new(SPINBOX_DISPLAY);
 static SPINBOX_BUTTON_COLOR: RwLock<[f32; 4]> = RwLock::new(SPINBOX_BUTTON);
 static SPINBOX_BUTTON_HOVER_COLOR: RwLock<[f32; 4]> = RwLock::new(SPINBOX_BUTTON_HOVER);
 static SPINBOX_TEXT_COLOR: RwLock<[f32; 4]> = RwLock::new([0.8, 0.8, 0.83, 1.0]);
+static CHECKBOX_BG_COLOR: RwLock<[f32; 4]> = RwLock::new(CHECKBOX_BG);
+static CHECKBOX_CHECKED_COLOR: RwLock<[f32; 4]> = RwLock::new(CHECKBOX_CHECKED);
+static CHECKBOX_HOVER_COLOR: RwLock<[f32; 4]> = RwLock::new(CHECKBOX_HOVER);
 
 static TREE_BACKGROUND_COLOR: RwLock<[f32; 4]> = RwLock::new([0.08, 0.08, 0.12, 0.3]);
 static TREE_BORDER_COLOR: RwLock<[f32; 4]> = RwLock::new([0.18, 0.18, 0.24, 1.0]);
@@ -373,6 +376,15 @@ fn parse_and_set_colors(content: &str) {
     if let Some(c) = get_color("/style/control/spinbox/text_color") {
         if let Ok(mut lock) = SPINBOX_TEXT_COLOR.write() { *lock = c; }
     }
+    if let Some(c) = get_color("/style/control/checkbox/background_color").or_else(|| get_color("/style/checkbox/background_color")) {
+        if let Ok(mut lock) = CHECKBOX_BG_COLOR.write() { *lock = c; }
+    }
+    if let Some(c) = get_color("/style/control/checkbox/checked_color").or_else(|| get_color("/style/checkbox/checked_color")) {
+        if let Ok(mut lock) = CHECKBOX_CHECKED_COLOR.write() { *lock = c; }
+    }
+    if let Some(c) = get_color("/style/control/checkbox/hover_color").or_else(|| get_color("/style/checkbox/hover_color")) {
+        if let Ok(mut lock) = CHECKBOX_HOVER_COLOR.write() { *lock = c; }
+    }
     if let Some(c) = get_color("/style/control/progressbar/background") {
         if let Ok(mut lock) = PROGRESS_BG_COLOR.write() { *lock = c; }
     }
@@ -1153,6 +1165,39 @@ pub fn set_spinbox_text_color(color: [f32; 4]) {
     }
 }
 
+pub fn checkbox_bg() -> [f32; 4] {
+    load_colors_once();
+    *CHECKBOX_BG_COLOR.read().unwrap()
+}
+
+pub fn set_checkbox_bg(color: [f32; 4]) {
+    if let Ok(mut lock) = CHECKBOX_BG_COLOR.write() {
+        *lock = color;
+    }
+}
+
+pub fn checkbox_checked() -> [f32; 4] {
+    load_colors_once();
+    *CHECKBOX_CHECKED_COLOR.read().unwrap()
+}
+
+pub fn set_checkbox_checked(color: [f32; 4]) {
+    if let Ok(mut lock) = CHECKBOX_CHECKED_COLOR.write() {
+        *lock = color;
+    }
+}
+
+pub fn checkbox_hover() -> [f32; 4] {
+    load_colors_once();
+    *CHECKBOX_HOVER_COLOR.read().unwrap()
+}
+
+pub fn set_checkbox_hover(color: [f32; 4]) {
+    if let Ok(mut lock) = CHECKBOX_HOVER_COLOR.write() {
+        *lock = color;
+    }
+}
+
 pub fn set_backplate_corner_radius(radius: f32) {
     if let Ok(mut lock) = BACKPLATE_CORNER_RADIUS.write() {
         *lock = radius;
diff --git a/src/widget/input/checkbox.rs b/src/widget/input/checkbox.rs
index 626b5e8..b3f390c 100644
--- a/src/widget/input/checkbox.rs
+++ b/src/widget/input/checkbox.rs
@@ -76,11 +76,11 @@ impl Element for Checkbox {
         } else {
             // Standalone mode -> colored widget background
             if self.checked {
-                colors::CHECKBOX_CHECKED
+                colors::checkbox_checked()
             } else if self.base.hovered {
-                colors::CHECKBOX_HOVER
+                colors::checkbox_hover()
             } else {
-                colors::CHECKBOX_BG
+                colors::checkbox_bg()
             }
         }
     }
@@ -118,11 +118,11 @@ impl Element for Checkbox {
 
             // Box background
             let bg_color = if self.checked {
-                colors::CHECKBOX_CHECKED
+                colors::checkbox_checked()
             } else if self.base.hovered {
-                colors::CHECKBOX_HOVER
+                colors::checkbox_hover()
             } else {
-                colors::CHECKBOX_BG
+                colors::checkbox_bg()
             };
             quads.push((box_x, box_y, box_size, box_size, bg_color));