From a1d5145c16aba4d0b11668d496735d07520d0339 Mon Sep 17 00:00:00 2001 From: Antoine Beyeler <49431240+abey79@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:30:20 +0100 Subject: [PATCH] Hide hover UI when showing the context menu (#4138) This PR hides the hover UI for a given widget whenever a corresponding context menu is opened. Fixes: - https://github.com/rerun-io/rerun/issues/5310 --- crates/egui/src/menu.rs | 7 +++++++ crates/egui/src/response.rs | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/crates/egui/src/menu.rs b/crates/egui/src/menu.rs index ad9d84b94d2..67689ca9d4e 100644 --- a/crates/egui/src/menu.rs +++ b/crates/egui/src/menu.rs @@ -230,6 +230,13 @@ pub(crate) fn context_menu( inner_response } +/// Returns `true` if the context menu is opened for this widget. +pub(crate) fn context_menu_opened(response: &Response) -> bool { + let menu_id = Id::new(CONTEXT_MENU_ID_STR); + let bar_state = BarState::load(&response.ctx, menu_id); + bar_state.is_menu_open(response.id) +} + /// Stores the state for the context menu. #[derive(Clone, Default)] pub(crate) struct MenuRootManager { diff --git a/crates/egui/src/response.rs b/crates/egui/src/response.rs index 2be5524205d..70c82ac3129 100644 --- a/crates/egui/src/response.rs +++ b/crates/egui/src/response.rs @@ -534,6 +534,10 @@ impl Response { return true; } + if self.context_menu_opened() { + return false; + } + if self.enabled { if !self.hovered || !self.ctx.input(|i| i.pointer.has_pointer()) { return false; @@ -849,6 +853,13 @@ impl Response { menu::context_menu(self, add_contents) } + /// Returns whether a context menu is currently open for this widget. + /// + /// See [`Self::context_menu`]. + pub fn context_menu_opened(&self) -> bool { + menu::context_menu_opened(self) + } + /// Draw a debug rectangle over the response displaying the response's id and whether it is /// enabled and/or hovered. ///