git.lucas.co / cce-graph
node-based graph editor
git clone https://git.lucas.co/cce-graph.git

commit5f381b2a90ee5b3d73f5e4d519ba4fef30b6fc90
parent9e9218da42
authorLucas Galante <[email protected]>
date2026-07-03 15:55
fix: resolve missing labels on Dropdowns in cce-graph

 src/main.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 69 insertions(+), 6 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 00caad9..9b9b3d0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -99,6 +99,51 @@ impl GraphApp {
         self.dropdown_view.options = get_view_options(self.show_grid, self.uniform_background, self.opacity);
     }
 
+    fn add_element_labels(
+        element: &dyn Element,
+        ui_context: &cce_ui::context::UiContext,
+        font_system: &mut FontSystem,
+        text_items: &mut Vec<TextItem>,
+        scale: f32,
+    ) {
+        for (label, font_family, bounds) in element.text_labels_with_font_and_bounds(ui_context) {
+            let mut font_size = label.font_size;
+            let mut family_name = None;
+            if let Some(ref font_str) = font_family {
+                let (parsed_family, parsed_size) = cce_ui::layout::parse_font_string(font_str);
+                if let Some(ps) = parsed_size {
+                    font_size = ps;
+                }
+                family_name = Some(parsed_family);
+            }
+
+            let physical_size = font_size * scale;
+            let metrics = Metrics::new(physical_size, physical_size * 1.4);
+            let mut buf = Buffer::new(font_system, metrics);
+            let mut attrs = Attrs::new();
+            
+            let family_str = family_name.clone();
+            if let Some(ref family) = family_str {
+                let family_val = match family.as_str() {
+                    "monospace" => glyphon::Family::Name(cce_ui::layout::get_system_monospace_font()),
+                    "sans-serif" => glyphon::Family::SansSerif,
+                    "serif" => glyphon::Family::Serif,
+                    _ => glyphon::Family::Name(family),
+                };
+                attrs = attrs.family(family_val);
+            }
+            buf.set_text(font_system, &label.text, attrs, glyphon::Shaping::Advanced);
+            buf.shape_until_scroll(font_system, true);
+            text_items.push(TextItem {
+                buffer: buf,
+                x: label.x,
+                y: label.y,
+                color: glyphon::Color::rgb(label.color[0], label.color[1], label.color[2]),
+                bounds,
+            });
+        }
+    }
+
     fn rebuild_text_items(&mut self) {
         self.text_items.clear();
         
@@ -108,11 +153,6 @@ impl GraphApp {
         // 2. Collect labels from MenuBar widget
         labels.extend(self.menu_bar.text_labels_with_bounds(&self.ui_context));
         
-        // 3. Collect labels from Dropdown widgets
-        labels.extend(self.dropdown_file.text_labels_with_bounds(&self.ui_context));
-        labels.extend(self.dropdown_edit.text_labels_with_bounds(&self.ui_context));
-        labels.extend(self.dropdown_view.text_labels_with_bounds(&self.ui_context));
-        
         let scale = cce_ui::scale::scale_factor();
         for (label, bounds) in labels {
             let physical_size = label.font_size * scale;
@@ -128,6 +168,29 @@ impl GraphApp {
                 bounds,
             });
         }
+
+        // 3. Add Dropdown labels using our font-aware helper
+        Self::add_element_labels(
+            &self.dropdown_file,
+            &self.ui_context,
+            &mut self.font_system,
+            &mut self.text_items,
+            scale,
+        );
+        Self::add_element_labels(
+            &self.dropdown_edit,
+            &self.ui_context,
+            &mut self.font_system,
+            &mut self.text_items,
+            scale,
+        );
+        Self::add_element_labels(
+            &self.dropdown_view,
+            &self.ui_context,
+            &mut self.font_system,
+            &mut self.text_items,
+            scale,
+        );
     }
 
     fn new_project(&mut self) {
@@ -365,7 +428,7 @@ impl Application for GraphApp {
             graph,
             graph_id,
             text_items: Vec::new(),
-            font_system: FontSystem::new(),
+            font_system: cce_ui::create_font_system(),
             needs_rebuild: true,
             width: 1024,
             height: 768,