From 53d9b53f962006e09cc1a34985cbf68361c2bb15 Mon Sep 17 00:00:00 2001 From: M4tthewDE Date: Wed, 1 Jan 2025 17:50:03 +0100 Subject: [PATCH] Fix hovering through custom menu button --- crates/egui/src/hit_test.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/crates/egui/src/hit_test.rs b/crates/egui/src/hit_test.rs index 8741f5f8b41..26aab1ef382 100644 --- a/crates/egui/src/hit_test.rs +++ b/crates/egui/src/hit_test.rs @@ -2,7 +2,7 @@ use ahash::HashMap; use emath::TSTransform; -use crate::{ahash, emath, LayerId, Pos2, Rect, WidgetRect, WidgetRects}; +use crate::{ahash, emath, Id, LayerId, Pos2, Rect, WidgetRect, WidgetRects}; /// Result of a hit-test against [`WidgetRects`]. /// @@ -133,6 +133,23 @@ pub fn hit_test( } } + // Find widgets which are hidden behind another widget and discard them. + // This is the case when a widget fully contains another widget and is on a different layer. + // It prevents "hovering through" widgets when there is a clickable widget behind. + + let mut hidden: ahash::HashSet = Default::default(); + for (i, current) in close.iter().enumerate().rev() { + for next in &close[i + 1..] { + if next.interact_rect.contains_rect(current.interact_rect) + && current.layer_id != next.layer_id + { + hidden.insert(current.id); + } + } + } + + close.retain(|c| !hidden.contains(&c.id)); + let mut hits = hit_test_on_close(&close, pos); hits.contains_pointer = close