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

commit3347fb57e70bb0bd221c014990e84db0cfb87bd0
parent7e93c8fc72
authorLucas Galante <[email protected]>
date2026-07-13 11:13
refactor: per-slot draggable/is_dragging matches (the trait shrink)

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

 src/app.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 52 insertions(+), 2 deletions(-)

diff --git a/src/app.rs b/src/app.rs
index e96b35a..b1415b7 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -119,6 +119,56 @@ pub struct WidgetSlots {
 }
 
 impl WidgetSlots {
+
+    // Per-slot drag queries (the ControlPanel endgame took `draggable`/`is_dragging`
+    // off `WidgetHost`): the roster routes an index to the concrete slot's inherent
+    // `Adapted` read, like the other value drains.
+    pub fn draggable(&self, idx: usize) -> bool {
+        match idx {
+            HEADER_IDX => self.header.draggable(),
+            CONTENT_IDX => self.content.draggable(),
+            SPLITTER1_IDX => self.splitter1.draggable(),
+            VIEWPORT_IDX => self.viewport.draggable(),
+            SPLITTER2_IDX => self.splitter2.draggable(),
+            PARAM_PLATE_IDX => self.param_plate.draggable(),
+            PARAM_IDX => self.param.draggable(),
+            CANVAS_IDX => self.canvas.draggable(),
+            LEFT_MENUBAR_IDX => self.left_menubar.draggable(),
+            RIGHT_MENUBAR_IDX => self.right_menubar.draggable(),
+            PARAM_MENUBAR_IDX => self.param_menubar.draggable(),
+            STATUS_IDX => self.status.draggable(),
+            BREADCRUMB_IDX => self.breadcrumb.draggable(),
+            NODE_PALETTE_IDX => self.node_palette.draggable(),
+            SPREADSHEET_IDX => self.spreadsheet.draggable(),
+            SPREADSHEET_MENUBAR_IDX => self.spreadsheet_menubar.draggable(),
+            NETWORK_PANEL_IDX => self.network_panel.draggable(),
+            _ => panic!("widget slot index out of range: {idx}"),
+        }
+    }
+
+    pub fn is_dragging(&self, idx: usize) -> bool {
+        match idx {
+            HEADER_IDX => self.header.is_dragging(),
+            CONTENT_IDX => self.content.is_dragging(),
+            SPLITTER1_IDX => self.splitter1.is_dragging(),
+            VIEWPORT_IDX => self.viewport.is_dragging(),
+            SPLITTER2_IDX => self.splitter2.is_dragging(),
+            PARAM_PLATE_IDX => self.param_plate.is_dragging(),
+            PARAM_IDX => self.param.is_dragging(),
+            CANVAS_IDX => self.canvas.is_dragging(),
+            LEFT_MENUBAR_IDX => self.left_menubar.is_dragging(),
+            RIGHT_MENUBAR_IDX => self.right_menubar.is_dragging(),
+            PARAM_MENUBAR_IDX => self.param_menubar.is_dragging(),
+            STATUS_IDX => self.status.is_dragging(),
+            BREADCRUMB_IDX => self.breadcrumb.is_dragging(),
+            NODE_PALETTE_IDX => self.node_palette.is_dragging(),
+            SPREADSHEET_IDX => self.spreadsheet.is_dragging(),
+            SPREADSHEET_MENUBAR_IDX => self.spreadsheet_menubar.is_dragging(),
+            NETWORK_PANEL_IDX => self.network_panel.is_dragging(),
+            _ => panic!("widget slot index out of range: {idx}"),
+        }
+    }
+
     pub fn get_dyn(&self, idx: usize) -> &(dyn WidgetHost + 'static) {
         match idx {
             HEADER_IDX => &self.header,
@@ -3815,8 +3865,8 @@ pub(crate) fn geometry_to_spreadsheet_data(geom: &Geometry) -> (Vec<String>, Vec
     pub fn apply_layout(&mut self) {
         for (i, pos) in self.positions.iter().enumerate() {
             if i < WIDGET_COUNT {
+                if self.slots.is_dragging(i) { continue; }
                 let widget = self.slots.get_dyn_mut(i);
-                if widget.is_dragging() { continue; }
                 let (x, y, w, h) = *pos;
                 widget.set_rect(x, y, w, h);
             }
@@ -4815,7 +4865,7 @@ pub(crate) fn geometry_to_spreadsheet_data(geom: &Geometry) -> (Vec<String>, Vec
                                 }
 
                             }
-                            if self.slots.get_dyn_mut(i).draggable() {
+                            if self.slots.draggable(i) {
                                 self.slots.get_dyn_mut(i).set_modifiers(self.modifiers.control_key(), self.modifiers.shift_key(), self.modifiers.alt_key());
                                 {
                                     let ev = cce_ui::widget::Event::DragStart { start_x: self.cursor_x, start_y: self.cursor_y };