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

commitf7ff2aea5cc9cc8ef06426d6dd635214f11e9be8
parent1555555e4b
authorLucas Galante <[email protected]>
date2026-06-13 21:29
Update graph interface rendering and node structure

 src/main.rs | 68 +++++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 48 insertions(+), 20 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 4609320..721e543 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -25,7 +25,8 @@ struct GraphApp {
     scale_factor: f64,
     show_grid: bool,
     uniform_background: bool,
-    network_opacity: f32,
+    cell_opacity: f32,
+    gap_opacity: f32,
     ui_context: clear_ui::context::UiContext,
 }
 
@@ -39,8 +40,10 @@ impl GraphApp {
         // 2. Collect labels from MenuBar widget
         labels.extend(self.menu_bar.text_labels_with_bounds(&self.ui_context));
         
+        let scale = clear_ui::scale::scale_factor();
         for (label, bounds) in labels {
-            let metrics = Metrics::new(label.font_size, label.font_size * 1.4);
+            let physical_size = label.font_size * scale;
+            let metrics = Metrics::new(physical_size, physical_size * 1.4);
             let mut buf = Buffer::new(&mut self.font_system, metrics);
             buf.set_text(&mut self.font_system, &label.text, Attrs::new(), glyphon::Shaping::Advanced);
             buf.shape_until_scroll(&mut self.font_system, true);
@@ -69,6 +72,9 @@ impl Application for GraphApp {
                 position: (1.0, 1.0),
                 parameters: vec![],
                 geom_visible: true,
+                node_type: String::new(),
+                inputs: 0,
+                outputs: 1,
             },
             GraphNode {
                 id: String::new(),
@@ -76,6 +82,9 @@ impl Application for GraphApp {
                 position: (3.0, 1.0),
                 parameters: vec![("input".to_string(), "Data Source".to_string(), "string".to_string())],
                 geom_visible: true,
+                node_type: String::new(),
+                inputs: 1,
+                outputs: 1,
             },
             GraphNode {
                 id: String::new(),
@@ -83,11 +92,14 @@ impl Application for GraphApp {
                 position: (5.0, 2.0),
                 parameters: vec![("input".to_string(), "Filter".to_string(), "string".to_string())],
                 geom_visible: true,
+                node_type: String::new(),
+                inputs: 1,
+                outputs: 1,
             },
         ];
         graph.set_nodes(&nodes);
         
-        let (show_grid, snap_enabled, uniform_background, network_opacity, gap_width) = load_config();
+        let (show_grid, snap_enabled, uniform_background, cell_opacity, gap_opacity, gap_width) = load_config();
 
         // Configure initial grid settings on the graph
         graph.set_show_network_grid(show_grid);
@@ -96,7 +108,8 @@ impl Application for GraphApp {
         graph.set_grid_origin(60.0, 60.0);
         graph.set_grid_snap_enabled(snap_enabled);
         graph.set_uniform_background(uniform_background);
-        graph.set_network_opacity(network_opacity);
+        graph.set_cell_opacity(cell_opacity);
+        graph.set_gap_opacity(gap_opacity);
 
         // Build Menu Bar with options to toggle new features
         let mut menu_bar = MenuBar::new(0.0, 0.0, 1024.0, 26.0)
@@ -113,9 +126,9 @@ impl Application for GraphApp {
             
         menu_bar.set_item_checked(2, 0, show_grid);  // Show Grid checked
         menu_bar.set_item_checked(2, 1, uniform_background); // Uniform Background unchecked
-        menu_bar.set_item_checked(2, 2, (network_opacity - 0.95).abs() < 0.05);  // Opacity 95% checked
-        menu_bar.set_item_checked(2, 3, (network_opacity - 0.75).abs() < 0.05);  // Opacity 75% checked
-        menu_bar.set_item_checked(2, 4, (network_opacity - 0.50).abs() < 0.05);  // Opacity 50% checked
+        menu_bar.set_item_checked(2, 2, (cell_opacity - 0.95).abs() < 0.05);  // Opacity 95% checked
+        menu_bar.set_item_checked(2, 3, (cell_opacity - 0.75).abs() < 0.05);  // Opacity 75% checked
+        menu_bar.set_item_checked(2, 4, (cell_opacity - 0.50).abs() < 0.05);  // Opacity 50% checked
 
         let mut app = Self {
             menu_bar,
@@ -128,7 +141,8 @@ impl Application for GraphApp {
             scale_factor: 1.0,
             show_grid,
             uniform_background,
-            network_opacity,
+            cell_opacity,
+            gap_opacity,
             ui_context: clear_ui::context::UiContext::new(),
         };
         
@@ -171,32 +185,41 @@ impl Application for GraphApp {
                 self.needs_rebuild = true;
             }
             AppMessage::SetOpacity95 => {
-                self.network_opacity = 0.95;
-                self.graph.set_network_opacity(self.network_opacity);
+                self.cell_opacity = 0.95;
+                self.gap_opacity = 0.95;
+                self.graph.set_cell_opacity(0.95);
+                self.graph.set_gap_opacity(0.95);
                 self.menu_bar.set_item_checked(2, 2, true);
                 self.menu_bar.set_item_checked(2, 3, false);
                 self.menu_bar.set_item_checked(2, 4, false);
-                write_config_value("graph_network_opacity", "0.95");
+                write_config_value("graph_cell_opacity", "0.95");
+                write_config_value("graph_gap_opacity", "0.95");
                 *needs_rebuild = true;
                 self.needs_rebuild = true;
             }
             AppMessage::SetOpacity75 => {
-                self.network_opacity = 0.75;
-                self.graph.set_network_opacity(self.network_opacity);
+                self.cell_opacity = 0.75;
+                self.gap_opacity = 0.75;
+                self.graph.set_cell_opacity(0.75);
+                self.graph.set_gap_opacity(0.75);
                 self.menu_bar.set_item_checked(2, 2, false);
                 self.menu_bar.set_item_checked(2, 3, true);
                 self.menu_bar.set_item_checked(2, 4, false);
-                write_config_value("graph_network_opacity", "0.75");
+                write_config_value("graph_cell_opacity", "0.75");
+                write_config_value("graph_gap_opacity", "0.75");
                 *needs_rebuild = true;
                 self.needs_rebuild = true;
             }
             AppMessage::SetOpacity50 => {
-                self.network_opacity = 0.50;
-                self.graph.set_network_opacity(self.network_opacity);
+                self.cell_opacity = 0.50;
+                self.gap_opacity = 0.50;
+                self.graph.set_cell_opacity(0.50);
+                self.graph.set_gap_opacity(0.50);
                 self.menu_bar.set_item_checked(2, 2, false);
                 self.menu_bar.set_item_checked(2, 3, false);
                 self.menu_bar.set_item_checked(2, 4, true);
-                write_config_value("graph_network_opacity", "0.50");
+                write_config_value("graph_cell_opacity", "0.50");
+                write_config_value("graph_gap_opacity", "0.50");
                 *needs_rebuild = true;
                 self.needs_rebuild = true;
             }
@@ -209,6 +232,9 @@ impl Application for GraphApp {
                     position: (2.0 + (next_id % 3) as f32, 2.0 + (next_id / 3) as f32),
                     parameters: vec![],
                     geom_visible: true,
+                    node_type: String::new(),
+                    inputs: 1,
+                    outputs: 1,
                 });
                 self.graph.set_nodes(&nodes);
                 *needs_rebuild = true;
@@ -372,14 +398,16 @@ impl Application for GraphApp {
     }
 }
 
-fn load_config() -> (bool, bool, bool, f32, f32) {
+fn load_config() -> (bool, bool, bool, f32, f32, f32) {
     let content = std::fs::read_to_string("/home/lsgalante/.config/cce/config.toml").unwrap_or_default();
     let show_grid = parse_bool_from(&content, "graph_show_grid", true);
     let snap_enabled = parse_bool_from(&content, "graph_snap_enabled", true);
     let uniform_background = parse_bool_from(&content, "graph_uniform_background", false);
-    let network_opacity = parse_f32_from(&content, "graph_network_opacity", 0.95);
+    let legacy_opacity = parse_f32_from(&content, "graph_network_opacity", 0.95);
+    let cell_opacity = parse_f32_from(&content, "graph_cell_opacity", legacy_opacity);
+    let gap_opacity = parse_f32_from(&content, "graph_gap_opacity", legacy_opacity);
     let gap_width = parse_f32_from(&content, "graph_gap_width", 35.0);
-    (show_grid, snap_enabled, uniform_background, network_opacity, gap_width)
+    (show_grid, snap_enabled, uniform_background, cell_opacity, gap_opacity, gap_width)
 }
 
 fn parse_bool_from(content: &str, key: &str, default: bool) -> bool {