From 1670fe4c41dbaf223fd0a7b190b79df509b47425 Mon Sep 17 00:00:00 2001 From: el-j Date: Wed, 28 Oct 2026 21:50:48 +0100 Subject: [PATCH] fix(canvas): capture Shift from pointer events for artboard label selection --- crates/ui-egui/src/canvas/input.rs | 20 ++++++++++++++++++-- crates/ui-egui/src/canvas/tests.rs | 11 +++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/crates/ui-egui/src/canvas/input.rs b/crates/ui-egui/src/canvas/input.rs index 1bf577fd7..6141707e9 100644 --- a/crates/ui-egui/src/canvas/input.rs +++ b/crates/ui-egui/src/canvas/input.rs @@ -91,7 +91,15 @@ pub(super) fn handle_input(app: &mut VectorcraftApp, ui: &Ui, resp: &egui::Respo // The artboard's name sits above its corner. A press there renames on a double-click // and does not start a tool gesture (a fitted artboard, a new one, Artboard Options). if let Some(i) = artboard_name_at(app, ui, &xf, p) { - ui.data_mut(|dd| dd.insert_temp(name_press_id(), (i, m.shift))); + let press_shift = ui + .input(|inp| { + inp.events.iter().rev().find_map(|event| match event { + egui::Event::PointerButton { button: egui::PointerButton::Primary, pressed: true, modifiers, .. } => Some(modifiers.shift), + _ => None, + }) + }) + .unwrap_or(m.shift); + ui.data_mut(|dd| dd.insert_temp(name_press_id(), (i, press_shift))); } else { begin_drag(app, ui, &f, p); } @@ -136,7 +144,15 @@ pub(super) fn handle_input(app: &mut VectorcraftApp, ui: &Ui, resp: &egui::Respo if pointer.primary_released() && let Some((i, shift)) = ui.data_mut(|d| d.remove_temp::<(usize, bool)>(name_press_id())) { - select_named_artboard(app, i, shift || m.shift); + let release_shift = ui + .input(|inp| { + inp.events.iter().rev().find_map(|event| match event { + egui::Event::PointerButton { button: egui::PointerButton::Primary, pressed: false, modifiers, .. } => Some(modifiers.shift), + _ => None, + }) + }) + .unwrap_or(m.shift); + select_named_artboard(app, i, shift || release_shift); } if resp.double_clicked() && let Some(p) = at diff --git a/crates/ui-egui/src/canvas/tests.rs b/crates/ui-egui/src/canvas/tests.rs index e8e5b3dac..6a30f248f 100644 --- a/crates/ui-egui/src/canvas/tests.rs +++ b/crates/ui-egui/src/canvas/tests.rs @@ -731,11 +731,18 @@ fn shift_clicking_canvas_artboard_label_toggles_multi_selection() { }; let at1 = label_pos("02 - Artboard 2"); - // Shift-click artboard 2's name label + // Shift-click artboard 2's name label (Shift held on press, released before mouse release) let shift = egui::Modifiers::SHIFT; let button = |pressed| egui::Event::PointerButton { pos: at1, button: egui::PointerButton::Primary, pressed, modifiers: shift }; frame(&mut app, &ctx, vec![egui::Event::ModifiersChanged(shift), egui::Event::PointerMoved(at1), button(true)]); - frame(&mut app, &ctx, vec![egui::Event::ModifiersChanged(shift), button(false)]); + frame( + &mut app, + &ctx, + vec![ + egui::Event::ModifiersChanged(egui::Modifiers::NONE), + egui::Event::PointerButton { pos: at1, button: egui::PointerButton::Primary, pressed: false, modifiers: egui::Modifiers::NONE }, + ], + ); assert_eq!(app.session.tool_options()["selected"], json!([1, 0]), "Shift-clicking artboard label adds it to selection");