Prevent grip clicks from starting area selection (#972)

Prevent grip clicks from starting area selection
This commit is contained in:
Hakan Seven authored and GitHub committed 2026-09-02 17:47:13 +03:00
commit 0ab1860948
2 files changed
+40 -4

No files matched your search

+19 -4
View File
@@ -2690,6 +2690,19 @@ impl OpenCADStudio {
};
let (vw, vh) = vp_size;
// An engaged grip owns the next left press (click-move-click placement
// or the release of a press-drag). Do not let the same press arm the
// normal box/lasso state or trigger another viewport control; the
// release path below will commit the grip.
if self.tabs[i].active_grip.is_some() {
self.tabs[i]
.scene
.selection
.borrow_mut()
.clear_left_selection_gesture();
return Task::none();
}
// Interactive navigation tools reuse the middle-button movement path,
// so no selection/pick logic runs while the left button drives them.
if self.tabs[i].orbit_mode
@@ -2879,6 +2892,11 @@ impl OpenCADStudio {
));
self.grip_hover = None;
self.grip_popup = None;
self.tabs[i]
.scene
.selection
.borrow_mut()
.clear_left_selection_gesture();
// A grip edit is not a CAD command, so explicitly seed the shared
// dynamic-input fields for the newly engaged grip.
@@ -2956,10 +2974,7 @@ impl OpenCADStudio {
// click doesn't read as an in-progress drag on later moves.
{
let mut sel = self.tabs[i].scene.selection.borrow_mut();
sel.left_down = false;
sel.left_press_pos = None;
sel.left_press_time = None;
sel.left_dragging = false;
sel.clear_left_selection_gesture();
}
let moved = grip.last_world != grip.origin_world;
if is_click && !moved {
+21
View File
@@ -56,3 +56,24 @@ pub struct SelectionState {
pub middle_last_pos: Option<Point>,
pub middle_last_press_time: Option<Instant>,
}
impl SelectionState {
/// End every left-button selection gesture without disturbing the previous
/// completed-window record or command-owned preview marquee. Grip editing
/// owns the left button while engaged and calls this before/after placement
/// so a small pointer move cannot also arm a box or lasso selection.
pub fn clear_left_selection_gesture(&mut self) {
self.left_down = false;
self.left_press_pos = None;
self.left_press_time = None;
self.left_dragging = false;
self.box_anchor = None;
self.box_anchor_world = None;
self.box_current = None;
self.box_crossing = false;
self.box_crossing_locked = false;
self.poly_active = false;
self.poly_points.clear();
self.poly_crossing = false;
}
}