From a8363f062bc2bf73ea0362201757c091e25ed06b Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sat, 24 Oct 2026 09:39:53 +0700 Subject: [PATCH] #1202: look for empty canvas under the pointer only on a triple click --- crates/ui-egui/src/canvas.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/crates/ui-egui/src/canvas.rs b/crates/ui-egui/src/canvas.rs index 08f84d71..a3ea7d26 100644 --- a/crates/ui-egui/src/canvas.rs +++ b/crates/ui-egui/src/canvas.rs @@ -613,15 +613,18 @@ fn input(app: &mut FigApp, ui: &mut Ui, resp: &egui::Response) -> bool { // mode counts on, so leaving it right away would otherwise take a fourth click or a pause. let ds = app.session.ds().ok(); let editing = ds.is_some_and(|d| d.vector_edit.is_some() || d.text_edit.is_some()); - let empty_canvas = ds.is_some_and(|d| { - let Some(ve) = d.vector_edit.as_ref().filter(|v| v.anchor.is_none() && d.text_edit.is_none()) else { - return false; - }; - let p = app.to_page(pos); - let tol = 6.0 / d.view.zoom.max(1e-6); - ve.parts().iter().all(|part| d.doc.world_render_bounds(part.id).is_none_or(|b| !b.inflate(tol * 4.0, tol * 4.0).contains(p))) - }); - if resp.double_clicked() || (resp.triple_clicked() && (!editing || empty_canvas)) { + // Only a triple click asks (it walks the parts' render bounds). + let empty_canvas = || { + ds.is_some_and(|d| { + let Some(ve) = d.vector_edit.as_ref().filter(|v| v.anchor.is_none() && d.text_edit.is_none()) else { + return false; + }; + let p = app.to_page(pos); + let tol = 6.0 / d.view.zoom.max(1e-6); + ve.parts().iter().all(|part| d.doc.world_render_bounds(part.id).is_none_or(|b| !b.inflate(tol * 4.0, tol * 4.0).contains(p))) + }) + }; + if resp.double_clicked() || (resp.triple_clicked() && (!editing || empty_canvas())) { let ev = pointer_event(app, PointerKind::DoubleClick, pos, &mods); if let Err(e) = app.session.pointer(&ev) { app.toast(e.to_string());