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

commitffd4464e78cff79077ade3159d944397707151e7
parente6af8157da
authorLucas Galante <[email protected]>
date2026-07-03 02:00
Added style.control.dropdown.color key to the dropdown domain

 src/color.rs                 | 16 ++++++++++++++++
 src/config.rs                |  6 ++++++
 src/layout.rs                |  1 +
 src/widget/input/dropdown.rs |  2 +-
 4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/color.rs b/src/color.rs
index b7873ee..05b2302 100644
--- a/src/color.rs
+++ b/src/color.rs
@@ -48,6 +48,8 @@ static PAGE_COLOR: RwLock<[f32; 4]> = RwLock::new([0.0, 0.0, 0.0, 0.0]);
 static LAYER_COLOR: RwLock<[f32; 4]> = RwLock::new([0.0, 0.0, 0.0, 0.0]);
 static BACKPLATE_CORNER_RADIUS: RwLock<f32> = RwLock::new(12.0);
 
+static DROPDOWN_BACKGROUND_COLOR: RwLock<[f32; 4]> = RwLock::new([0.08, 0.08, 0.12, 1.0]);
+
 static BACKPLATE_MENUBAR_COLOR: RwLock<[f32; 4]> = RwLock::new([0.08, 0.08, 0.12, 1.0]);
 static BACKPLATE_MENUBAR_TEXT_COLOR: RwLock<[f32; 4]> = RwLock::new([0.90196, 0.90196, 0.94902, 1.0]);
 static BACKPLATE_MENUBAR_BLUR: RwLock<bool> = RwLock::new(false);
@@ -266,6 +268,9 @@ fn parse_and_set_colors(content: &str) {
     if let Some(c) = get_color("/style/control/button/background").or_else(|| get_color("/layout/button_background_color")) {
         if let Ok(mut lock) = BUTTON_BACKGROUND_COLOR.write() { *lock = c; }
     }
+    if let Some(c) = get_color("/style/control/dropdown/color") {
+        if let Ok(mut lock) = DROPDOWN_BACKGROUND_COLOR.write() { *lock = c; }
+    }
     if let Some(c) = get_color("/layout/menubar_tab_label_color").or_else(|| get_color("/layout/paginator_tab_label_color")) {
         if let Ok(mut lock) = MENUBAR_TAB_LABEL_COLOR.write() { *lock = c; }
     }
@@ -430,6 +435,17 @@ pub fn reload_colors(content: &str) {
     parse_and_set_colors(content);
 }
 
+pub fn dropdown_background_color() -> [f32; 4] {
+    load_colors_once();
+    *DROPDOWN_BACKGROUND_COLOR.read().unwrap()
+}
+
+pub fn set_dropdown_background_color(color: [f32; 4]) {
+    if let Ok(mut lock) = DROPDOWN_BACKGROUND_COLOR.write() {
+        *lock = color;
+    }
+}
+
 pub fn graph_wire_color() -> [f32; 4] {
     load_colors_once();
     *GRAPH_WIRE_COLOR.read().unwrap()
diff --git a/src/config.rs b/src/config.rs
index 58f8f23..a2170e7 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -598,6 +598,9 @@ mod tests {
                         statusbar blur=(bool)false color=(rgba)"#12141cd0" text_color=(rgba)"#b5b9c8ff"
                     }
                 }
+                control {
+                    dropdown color=(rgba)"#08080cff"
+                }
             }
         "##;
         
@@ -606,6 +609,9 @@ mod tests {
 
         // Verify values are parsed correctly
         assert_eq!(crate::color::backplate_menubar_blur(), true);
+        
+        let dd_color = crate::color::dropdown_background_color();
+        assert!(dd_color[0] > 0.0);
         assert_eq!(crate::color::backplate_statusbar_blur(), false);
 
         // Colors are in sRGB converted to linear, let's verify text colors
diff --git a/src/layout.rs b/src/layout.rs
index 4c1c355..f4e67d5 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -72,6 +72,7 @@ fn flatten_json_to_flat_props(val: &serde_json::Value, prefix: &str, flat_props:
                 "style.list.corner_radius" | "style.data.list.corner_radius" => "list_corner_radius",
                 "style.textbox.corner_radius" | "style.data.textbox.corner_radius" => "textbox_corner_radius",
                 "style.control.dropdown.font" => "dropdown_font",
+                "style.control.dropdown.color" => "dropdown_color",
                 "style.control.font_selector.font" => "font_selector_font",
                 "style.control.slider.font" => "slider_font",
                 "style.control.spinbox.font" => "spinbox_font",
diff --git a/src/widget/input/dropdown.rs b/src/widget/input/dropdown.rs
index 70c22ba..3920423 100644
--- a/src/widget/input/dropdown.rs
+++ b/src/widget/input/dropdown.rs
@@ -392,7 +392,7 @@ impl Element for Dropdown {
         let top = self.base.label_offset();
         let visual_h = self.base.h - top;
 
-        let bg_color = [0.08, 0.08, 0.12, 1.0];
+        let bg_color = colors::dropdown_background_color();
         let border_color = if self.open {
             [0.30, 0.50, 0.32, 1.0]
         } else if self.base.hovered {