From b070cd787b603a338bbfac4593f677b5cd2dcec7 Mon Sep 17 00:00:00 2001 From: Alain Emilia Anna Zscheile Date: Tue, 31 Dec 2024 20:28:11 +0100 Subject: [PATCH] fix(viewport): only capture mouse clicks actually intended for the viewport --- crates/topola-egui/src/viewport.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/topola-egui/src/viewport.rs b/crates/topola-egui/src/viewport.rs index 08c698f..d5d9daa 100644 --- a/crates/topola-egui/src/viewport.rs +++ b/crates/topola-egui/src/viewport.rs @@ -50,9 +50,12 @@ impl Viewport { egui::Frame::canvas(ui.style()).show(ui, |ui| { ui.ctx().request_repaint(); - let (_id, viewport_rect) = ui.allocate_space(ui.available_size()); + let (id, viewport_rect) = ui.allocate_space(ui.available_size()); + let response = ui.interact(viewport_rect, id, egui::Sense::click()); + // NOTE: we use `interact_pos` instead of `latest_pos` to handle "pointer gone" + // events more graceful let latest_pos = self.transform.inverse() - * (ctx.input(|i| i.pointer.latest_pos().unwrap_or_default())); + * (ctx.input(|i| i.pointer.interact_pos().unwrap_or_default())); let old_scaling = self.transform.scaling; self.transform.scaling *= ctx.input(|i| i.zoom_delta()); @@ -68,7 +71,7 @@ impl Viewport { let overlay = &mut workspace.overlay; let latest_point = point! {x: latest_pos.x as f64, y: -latest_pos.y as f64}; - if ctx.input(|i| i.pointer.any_click()) { + if response.clicked() { if menu_bar.is_placing_via { workspace.interactor.execute(Command::PlaceVia(ViaWeight { from_layer: 0,