fix(canvas): capture Shift from pointer events for artboard label selection

This commit is contained in:
el-j
2026-10-30 00:15:54 +07:00
committed by bflatastic
parent 49a05508ab
commit 1670fe4c41
2 changed files with 27 additions and 4 deletions
+18 -2
View File
@@ -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
+9 -2
View File
@@ -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");