git.lucas.co / cce-designer
graphic design tool
git clone https://git.lucas.co/cce-designer.git

commitb7d02b0e87deaf6e46f88b9d0bafadfed27a221e
parent366c70a150
authorLucas Galante <[email protected]>
date2026-07-06 11:58
Consolidate all utility subnets (Network, Viewport, Parameters, Spreadsheet) into the single Main utility subnet

 src/project.rs | 134 ++++++++++++++++-----------------------------------------
 1 file changed, 38 insertions(+), 96 deletions(-)

diff --git a/src/project.rs b/src/project.rs
index 983c198..8c41032 100644
--- a/src/project.rs
+++ b/src/project.rs
@@ -278,6 +278,13 @@ impl State {
     }
 
     pub(crate) fn ensure_menubar_subnets(&mut self) {
+        let vp_show_grid = self.viewport().show_grid;
+        let vp_show_cube = self.viewport().show_cube;
+        let vp_show_origin = self.viewport().show_origin;
+        let vp_show_camera_pivot = self.viewport().show_camera_pivot;
+        let vp_bg_color = self.viewport().bg_color;
+        let vp_grid_color = self.viewport().grid_color;
+
         let camera_nodes: Vec<String> = self.current_dir().children.iter()
             .filter(|c| c.node_type == "camera")
             .map(|c| c.name.clone())
@@ -334,6 +341,9 @@ impl State {
             }
         }
 
+        // Retain only the Main utility subnet, removing the rest
+        self.fs_root.children.retain(|c| c.name != "Network" && c.name != "Viewport" && c.name != "Parameters" && c.name != "Spreadsheet");
+
         // 1. Main subnet
         let main_node = find_or_create_subnet(&mut self.fs_root, "Main", "utility", (0.0, 0.0));
         main_node.children.clear();
@@ -368,121 +378,53 @@ impl State {
         ensure_param(main_node, "Show Parameters Pane", "button", "", &[], None, None, None);
         ensure_param(main_node, "Show Spreadsheet Pane", "button", "", &[], None, None, None);
 
-        ensure_param(main_node, "Help", "section", "", &[], None, None, None);
-        ensure_param(main_node, "About", "button", "", &[], None, None, None);
+        // Network Settings
+        ensure_param(main_node, "Network Settings", "section", "", &[], None, None, None);
+        ensure_param(main_node, "Circular Pane", "choice", if self.circular_network_pane { "true" } else { "false" }, &["false", "true"], None, None, None);
+        ensure_param(main_node, "Node Color R", "spinbox", &((self.node_color[0] * 255.0) as i32).to_string(), &[], Some(0.0), Some(255.0), Some(1.0));
+        ensure_param(main_node, "Node Color G", "spinbox", &((self.node_color[1] * 255.0) as i32).to_string(), &[], Some(0.0), Some(255.0), Some(1.0));
+        ensure_param(main_node, "Node Color B", "spinbox", &((self.node_color[2] * 255.0) as i32).to_string(), &[], Some(0.0), Some(255.0), Some(1.0));
 
-        // 2. Network subnet
-        let net_node = find_or_create_subnet(&mut self.fs_root, "Network", "utility", (2.0, 0.0));
-        net_node.children.clear();
-
-        ensure_param(net_node, "File", "section", "", &[], None, None, None);
-        ensure_param(net_node, "New", "button", "", &[], None, None, None);
-        ensure_param(net_node, "Open", "button", "", &[], None, None, None);
-        ensure_param(net_node, "Save", "button", "", &[], None, None, None);
-        ensure_param(net_node, "Save As", "button", "", &[], None, None, None);
-
-        ensure_param(net_node, "Edit", "section", "", &[], None, None, None);
-        ensure_param(net_node, "Undo", "button", "", &[], None, None, None);
-        ensure_param(net_node, "Redo", "button", "", &[], None, None, None);
-
-        ensure_param(net_node, "View", "section", "", &[], None, None, None);
-        ensure_param(net_node, "Zoom In", "button", "", &[], None, None, None);
-        ensure_param(net_node, "Zoom Out", "button", "", &[], None, None, None);
-        ensure_param(net_node, "Circular Pane", "choice", if self.circular_network_pane { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(net_node, "Detach Pane", "button", "", &[], None, None, None);
-        ensure_param(net_node, "Close Pane", "button", "", &[], None, None, None);
-
-        ensure_param(net_node, "Settings", "section", "", &[], None, None, None);
-        ensure_param(net_node, "Node Color R", "spinbox", &((self.node_color[0] * 255.0) as i32).to_string(), &[], Some(0.0), Some(255.0), Some(1.0));
-        ensure_param(net_node, "Node Color G", "spinbox", &((self.node_color[1] * 255.0) as i32).to_string(), &[], Some(0.0), Some(255.0), Some(1.0));
-        ensure_param(net_node, "Node Color B", "spinbox", &((self.node_color[2] * 255.0) as i32).to_string(), &[], Some(0.0), Some(255.0), Some(1.0));
-
-        // 3. Viewport subnet
-        let vp_show_grid = self.viewport().show_grid;
-        let vp_show_cube = self.viewport().show_cube;
-        let vp_show_origin = self.viewport().show_origin;
-        let vp_show_camera_pivot = self.viewport().show_camera_pivot;
-        let vp_bg_color = self.viewport().bg_color;
-        let vp_grid_color = self.viewport().grid_color;
+        // Viewport Settings
 
-        let vp_node = find_or_create_subnet(&mut self.fs_root, "Viewport", "utility", (4.0, 0.0));
-        vp_node.children.clear();
 
-        ensure_param(vp_node, "Camera", "section", "", &[], None, None, None);
-        if let Some(p) = vp_node.params.iter_mut().find(|p| p.name == "Active Camera") {
+        ensure_param(main_node, "Viewport Settings", "section", "", &[], None, None, None);
+        if let Some(p) = main_node.params.iter_mut().find(|p| p.name == "Active Camera") {
             p.options = camera_options.clone();
             if !p.options.contains(&p.default) {
                 p.default = "Default Camera".to_string();
             }
         } else {
-            ensure_param(vp_node, "Active Camera", "choice", &self.active_camera, &camera_options_refs, None, None, None);
+            ensure_param(main_node, "Active Camera", "choice", &self.active_camera, &camera_options_refs, None, None, None);
         }
 
-        ensure_param(vp_node, "Display", "section", "", &[], None, None, None);
-        ensure_param(vp_node, "Square Aspect", "choice", if self.square_viewport { "true" } else { "false" }, &["false", "true"], None, None, None);
-
-        ensure_param(vp_node, "Guides", "section", "", &[], None, None, None);
-        ensure_param(vp_node, "Show Grid", "choice", if vp_show_grid { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(vp_node, "Cube", "choice", if vp_show_cube { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(vp_node, "Origin", "choice", if vp_show_origin { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(vp_node, "Camera Pivot", "choice", if vp_show_camera_pivot { "true" } else { "false" }, &["false", "true"], None, None, None);
-
-        ensure_param(vp_node, "View", "section", "", &[], None, None, None);
-        ensure_param(vp_node, "Close Pane", "button", "", &[], None, None, None);
-
-        ensure_param(vp_node, "Settings", "section", "", &[], None, None, None);
-        ensure_param(vp_node, "Show Grid Guide", "choice", if vp_show_grid { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(vp_node, "Show Reference Cube", "choice", if vp_show_cube { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(vp_node, "Show Origin Axes", "choice", if vp_show_origin { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(vp_node, "Show Camera Pivot", "choice", if vp_show_camera_pivot { "true" } else { "false" }, &["false", "true"], None, None, None);
-        ensure_param(vp_node, "Grid Thickness", "spinbox", &((self.grid_thickness * 1000.0) as i32).to_string(), &[], Some(2.0), Some(200.0), Some(1.0));
-        ensure_param(vp_node, "Origin Guide Size", "spinbox", &((self.origin_size * 10.0) as i32).to_string(), &[], Some(1.0), Some(50.0), Some(1.0));
-        ensure_param(vp_node, "Camera Pivot Size", "spinbox", &((self.camera_pivot_size * 10.0) as i32).to_string(), &[], Some(1.0), Some(50.0), Some(1.0));
-        ensure_param(vp_node, "Background Color", "color", &color_to_hex(vp_bg_color), &[], None, None, None);
-        ensure_param(vp_node, "Grid Color", "color", &color_to_hex(vp_grid_color), &[], None, None, None);
-
-        // 4. Parameters subnet
-        let param_node = find_or_create_subnet(&mut self.fs_root, "Parameters", "utility", (6.0, 0.0));
-        param_node.children.clear();
-
-        ensure_param(param_node, "Preset", "section", "", &[], None, None, None);
-        ensure_param(param_node, "Default", "button", "", &[], None, None, None);
-        ensure_param(param_node, "Custom", "button", "", &[], None, None, None);
-
-        ensure_param(param_node, "Reset", "section", "", &[], None, None, None);
-        ensure_param(param_node, "All", "button", "", &[], None, None, None);
-
-        ensure_param(param_node, "View", "section", "", &[], None, None, None);
-        ensure_param(param_node, "Close Pane", "button", "", &[], None, None, None);
-
-        // 5. Spreadsheet subnet
-        let ss_node = find_or_create_subnet(&mut self.fs_root, "Spreadsheet", "utility", (8.0, 0.0));
-        ss_node.children.clear();
-
-        ensure_param(ss_node, "View", "section", "", &[], None, None, None);
-        ensure_param(ss_node, "Close Pane", "button", "", &[], None, None, None);
+        ensure_param(main_node, "Square Aspect", "choice", if self.square_viewport { "true" } else { "false" }, &["false", "true"], None, None, None);
+        ensure_param(main_node, "Show Grid Guide", "choice", if vp_show_grid { "true" } else { "false" }, &["false", "true"], None, None, None);
+        ensure_param(main_node, "Show Reference Cube", "choice", if vp_show_cube { "true" } else { "false" }, &["false", "true"], None, None, None);
+        ensure_param(main_node, "Show Origin Axes", "choice", if vp_show_origin { "true" } else { "false" }, &["false", "true"], None, None, None);
+        ensure_param(main_node, "Show Camera Pivot", "choice", if vp_show_camera_pivot { "true" } else { "false" }, &["false", "true"], None, None, None);
+        ensure_param(main_node, "Grid Thickness", "spinbox", &((self.grid_thickness * 1000.0) as i32).to_string(), &[], Some(2.0), Some(200.0), Some(1.0));
+        ensure_param(main_node, "Origin Guide Size", "spinbox", &((self.origin_size * 10.0) as i32).to_string(), &[], Some(1.0), Some(50.0), Some(1.0));
+        ensure_param(main_node, "Camera Pivot Size", "spinbox", &((self.camera_pivot_size * 10.0) as i32).to_string(), &[], Some(1.0), Some(50.0), Some(1.0));
+        ensure_param(main_node, "Background Color", "color", &color_to_hex(vp_bg_color), &[], None, None, None);
+        ensure_param(main_node, "Grid Color", "color", &color_to_hex(vp_grid_color), &[], None, None, None);
+
+        ensure_param(main_node, "Help", "section", "", &[], None, None, None);
+        ensure_param(main_node, "About", "button", "", &[], None, None, None);
     }
 
     pub(crate) fn apply_settings_from_menubar_subnets(&mut self) {
-        // Read Settings from Network subnet
-        if let Some(net_idx) = self.fs_root.children.iter().position(|c| c.name == "Network") {
-            let node = &self.fs_root.children[net_idx];
-            for p in &node.params {
+        if let Some(main_idx) = self.fs_root.children.iter().position(|c| c.name == "Main") {
+            let params = self.fs_root.children[main_idx].params.clone();
+            for p in &params {
                 match p.name.as_str() {
+                    // Network Settings
                     "Node Color R" => if let Ok(val) = p.default.parse::<f32>() { self.node_color[0] = val / 255.0; }
                     "Node Color G" => if let Ok(val) = p.default.parse::<f32>() { self.node_color[1] = val / 255.0; }
                     "Node Color B" => if let Ok(val) = p.default.parse::<f32>() { self.node_color[2] = val / 255.0; }
                     "Circular Pane" => if let Ok(val) = p.default.parse::<bool>() { self.circular_network_pane = val; }
-                    _ => {}
-                }
-            }
-        }
 
-        // Read Settings from Viewport subnet
-        if let Some(vp_idx) = self.fs_root.children.iter().position(|c| c.name == "Viewport") {
-            let params = self.fs_root.children[vp_idx].params.clone();
-            for p in &params {
-                match p.name.as_str() {
+                    // Viewport Settings
                     "Show Grid Guide" => if let Ok(val) = p.default.parse::<bool>() { self.viewport_mut().show_grid = val; }
                     "Show Reference Cube" => if let Ok(val) = p.default.parse::<bool>() { self.viewport_mut().show_cube = val; }
                     "Show Origin Axes" => if let Ok(val) = p.default.parse::<bool>() { self.viewport_mut().show_origin = val; }