fix(viewport): only capture mouse clicks actually intended for the viewport

This commit is contained in:
Alain Emilia Anna Zscheile 2024-12-31 20:28:11 +01:00
parent 0a4a3e8351
commit b070cd787b
1 changed files with 6 additions and 3 deletions

View File

@ -50,9 +50,12 @@ impl Viewport {
egui::Frame::canvas(ui.style()).show(ui, |ui| { egui::Frame::canvas(ui.style()).show(ui, |ui| {
ui.ctx().request_repaint(); 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() 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; let old_scaling = self.transform.scaling;
self.transform.scaling *= ctx.input(|i| i.zoom_delta()); self.transform.scaling *= ctx.input(|i| i.zoom_delta());
@ -68,7 +71,7 @@ impl Viewport {
let overlay = &mut workspace.overlay; let overlay = &mut workspace.overlay;
let latest_point = point! {x: latest_pos.x as f64, y: -latest_pos.y as f64}; 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 { if menu_bar.is_placing_via {
workspace.interactor.execute(Command::PlaceVia(ViaWeight { workspace.interactor.execute(Command::PlaceVia(ViaWeight {
from_layer: 0, from_layer: 0,