From 2a0b7805c015320990a761e5f15c3f83750f17c4 Mon Sep 17 00:00:00 2001 From: Karim Jerbi Date: Fri, 14 Aug 2026 20:51:22 +0100 Subject: [PATCH] fix(dock): size drag preview slots by the edge viewport height The dock drag preview computed slot heights and drop indices from the full window height, but docked panel columns only span the model viewport, so the preview overlay and insertion point drifted below the actual dock edge. Use the current viewport height so the ghost and drop index line up with the panels. --- src/app/update/dialog.rs | 3 ++- src/app/view/mod.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/update/dialog.rs b/src/app/update/dialog.rs index 403959ecb..fc46feea1 100644 --- a/src/app/update/dialog.rs +++ b/src/app/update/dialog.rs @@ -636,6 +636,7 @@ pub(super) fn on_ribbon_tool_click(&mut self, tool_id: String, event: ModuleEven } DockMsg::DragMove(point) => { if self.dock_dragging.is_some() { + let avail = self.tabs[self.active_tab].scene.selection.borrow().vp_size.1; let side = if point.x < self.win_size.0 * 0.5 { DockSide::Left } else { @@ -644,7 +645,7 @@ pub(super) fn on_ribbon_tool_click(&mut self, tool_id: String, event: ModuleEven let index = crate::ui::dock::drop_index( point.y, std::cmp::max(self.dock.len(side), 1), - self.win_size.1, + avail, ); self.dock_drag_target = Some((side, index)); } else if let Some(id) = self.dock_resizing { diff --git a/src/app/view/mod.rs b/src/app/view/mod.rs index 7a5929f8c..fec1d8a81 100644 --- a/src/app/view/mod.rs +++ b/src/app/view/mod.rs @@ -1563,7 +1563,8 @@ impl OpenCADStudio { } else { self.dock.len(side) + 1 }; - let slot_h = self.win_size.1 / final_count as f32; + let edge_h = tab.scene.selection.borrow().vp_size.1; + let slot_h = edge_h / final_count as f32; let index = self.dock_drag_target.map(|(_, i)| i).unwrap_or(0); let slot = index.min(final_count.saturating_sub(1)); let ghost_top = slot as f32 * slot_h;