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

commitf4e080d4af6f0260eb6c45c8554b6667d0a58e4a
parentb18d1f764f
authorLucas Galante <[email protected]>
date2026-07-13 09:29
refactor: dispatch roots go by WidgetId (cce-ui plumbing retype)

propagate_event takes a WidgetId resolved through the registry; dispatch
sites name roots by id instead of minting raw pointers, and roots the
render path never registered are registered explicitly.

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01N4ajhvVZtyEEEus9bodsj3

 src/app.rs    |  6 +++---
 src/render.rs | 10 ++++++----
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/app.rs b/src/app.rs
index 668a47e..8d82be6 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -4175,8 +4175,8 @@ pub(crate) fn geometry_to_spreadsheet_data(geom: &Geometry) -> (Vec<String>, Vec
                         if i == VIEWPORT_IDX {
                             continue;
                         }
-                        let ptr = self.slots.get_dyn_mut(i).as_ptr_mut();
-                        if self.ui_context.propagate_event(&wheel_ev, ptr) {
+                        let root = self.slots.get_dyn_mut(i).base().id();
+                        if self.ui_context.propagate_event(&wheel_ev, root) {
                             handled = true;
                             if i == CONTENT_IDX {
                                 let active_node_area_y = self.positions[CONTENT_IDX].1;
@@ -4217,7 +4217,7 @@ pub(crate) fn geometry_to_spreadsheet_data(geom: &Geometry) -> (Vec<String>, Vec
                         }
                     }
                     if !handled {
-                        let vp = self.slots.viewport.as_ptr_mut();
+                        let vp = self.slots.viewport.id();
                         if self.ui_context.propagate_event(&wheel_ev, vp) {
                             handled = true;
                         }
diff --git a/src/render.rs b/src/render.rs
index cbe6e68..6902a35 100644
--- a/src/render.rs
+++ b/src/render.rs
@@ -108,11 +108,13 @@ impl State {
         let widget_ptrs: Vec<*mut (dyn WidgetHost + 'static)> = (0..WIDGET_COUNT)
             .map(|i| self.slots.get_dyn(i).as_ptr())
             .collect();
-        for &i in &draw_order {
+        // Register ALL slots, visible or not (id-rooted router): the wheel loop and the
+        // hidden-widget broadcasts dispatch by id over the whole roster, and visibility
+        // gates behavior inside the widget — an unregistered hidden root would drop the
+        // event before that gate.
+        for i in 0..WIDGET_COUNT {
             let w = self.slots.get_dyn(i);
-            if w.visible() {
-                self.ui_context.register_widget(w.base().id(), w.as_ptr());
-            }
+            self.ui_context.register_widget(w.base().id(), w.as_ptr());
         }
 
         let mut visited = vec![false; WIDGET_COUNT];