From e41c9922349eb92ccddeda87906b7d52a60a1b39 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 21 Mar 2023 15:08:26 +0100 Subject: [PATCH] Don't hover things in 2D/3D views if we are dragging something (#1643) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/rerun-io/rerun/issues/1185 …and unlike previous attempts, click-to-select still works --- crates/re_ui/src/egui_helpers.rs | 19 +++++++++++++++++++ crates/re_ui/src/lib.rs | 1 + crates/re_viewer/src/ui/view_spatial/ui_2d.rs | 4 +++- crates/re_viewer/src/ui/view_spatial/ui_3d.rs | 4 +++- 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 crates/re_ui/src/egui_helpers.rs diff --git a/crates/re_ui/src/egui_helpers.rs b/crates/re_ui/src/egui_helpers.rs new file mode 100644 index 000000000000..eab0a2d08e56 --- /dev/null +++ b/crates/re_ui/src/egui_helpers.rs @@ -0,0 +1,19 @@ +/// Is anything in egui being dragged? +pub fn is_anything_being_dragged(egui_ctx: &egui::Context) -> bool { + // As soon as a button is down, egui considers it a drag. + // That is, even a click is considered a drag until it is over. + // So we need some special treatment here. + // TODO(emilk): make it easier to distinguish between clicks and drags in egui. + + // copied from egui + /// If the pointer is down for longer than this, it won't become a click (but it is still a drag) + const MAX_CLICK_DURATION: f64 = 0.6; + egui_ctx.input(|i| { + if let Some(press_start_time) = i.pointer.press_start_time() { + let held_time = i.time - press_start_time; + held_time > MAX_CLICK_DURATION || i.pointer.is_moving() + } else { + false + } + }) +} diff --git a/crates/re_ui/src/lib.rs b/crates/re_ui/src/lib.rs index 8a28c268afd4..222473b8ed15 100644 --- a/crates/re_ui/src/lib.rs +++ b/crates/re_ui/src/lib.rs @@ -3,6 +3,7 @@ mod command; mod command_palette; mod design_tokens; +pub mod egui_helpers; pub mod icons; mod static_image_cache; pub mod toasts; diff --git a/crates/re_viewer/src/ui/view_spatial/ui_2d.rs b/crates/re_viewer/src/ui/view_spatial/ui_2d.rs index 554fed20508a..a1af3d606e6c 100644 --- a/crates/re_viewer/src/ui/view_spatial/ui_2d.rs +++ b/crates/re_viewer/src/ui/view_spatial/ui_2d.rs @@ -314,9 +314,11 @@ fn view_2d_scrollable( highlights, ); + let should_do_hovering = !re_ui::egui_helpers::is_anything_being_dragged(parent_ui.ctx()); + // Check if we're hovering any hover primitive. let mut depth_at_pointer = None; - if let Some(pointer_pos_ui) = response.hover_pos() { + if let (true, Some(pointer_pos_ui)) = (should_do_hovering, response.hover_pos()) { let pointer_pos_space = space_from_ui.transform_pos(pointer_pos_ui); let hover_radius = space_from_ui.scale().y * 5.0; // TODO(emilk): from egui? let picking_result = scene.picking( diff --git a/crates/re_viewer/src/ui/view_spatial/ui_3d.rs b/crates/re_viewer/src/ui/view_spatial/ui_3d.rs index 301d96b2b16c..25d4a08ff6d5 100644 --- a/crates/re_viewer/src/ui/view_spatial/ui_3d.rs +++ b/crates/re_viewer/src/ui/view_spatial/ui_3d.rs @@ -312,9 +312,11 @@ pub fn view_3d( highlights, ); + let should_do_hovering = !re_ui::egui_helpers::is_anything_being_dragged(ui.ctx()); + // TODO(andreas): We're very close making the hover reaction of ui2d and ui3d the same. Finish the job! // Check if we're hovering any hover primitive. - if let Some(pointer_pos) = response.hover_pos() { + if let (true, Some(pointer_pos)) = (should_do_hovering, response.hover_pos()) { let picking_result = scene.picking(glam::vec2(pointer_pos.x, pointer_pos.y), &rect, &eye, 5.0);