diff options
author | 2024-04-27 06:15:58 +0200 | |
---|---|---|
committer | 2024-04-27 06:16:57 +0200 | |
commit | 40dff6b23d4666d69e27addcfb90d9557f59ed6c (patch) | |
tree | b9ce247b7af59459302c0040c2be940fed34c2ca /widget/src/helpers.rs | |
parent | a16a75a71d0bc76c17c2d76d827fa8c37eb56f09 (diff) | |
download | iced-40dff6b23d4666d69e27addcfb90d9557f59ed6c.tar.gz iced-40dff6b23d4666d69e27addcfb90d9557f59ed6c.tar.bz2 iced-40dff6b23d4666d69e27addcfb90d9557f59ed6c.zip |
Fix `overlay` behavior in `hover` widget
Diffstat (limited to 'widget/src/helpers.rs')
-rw-r--r-- | widget/src/helpers.rs | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index c86223bc..0b5adde7 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -313,7 +313,7 @@ where struct Hover<'a, Message, Theme, Renderer> { base: Element<'a, Message, Theme, Renderer>, top: Element<'a, Message, Theme, Renderer>, - is_overlay_active: bool, + is_top_overlay_active: bool, } impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer> @@ -387,7 +387,7 @@ where viewport, ); - if cursor.is_over(layout.bounds()) || self.is_overlay_active { + if cursor.is_over(layout.bounds()) || self.is_top_overlay_active { let (top_layout, top_tree) = children.next().unwrap(); renderer.with_layer(layout.bounds(), |renderer| { @@ -491,13 +491,10 @@ where translation: core::Vector, ) -> Option<core::overlay::Element<'b, Message, Theme, Renderer>> { - let overlay = [&mut self.base, &mut self.top] + let mut overlays = [&mut self.base, &mut self.top] .into_iter() - .rev() - .zip( - layout.children().rev().zip(tree.children.iter_mut().rev()), - ) - .find_map(|(child, (layout, tree))| { + .zip(layout.children().zip(tree.children.iter_mut())) + .map(|(child, (layout, tree))| { child.as_widget_mut().overlay( tree, layout, @@ -506,15 +503,21 @@ where ) }); - self.is_overlay_active = overlay.is_some(); - overlay + if let Some(base_overlay) = overlays.next()? { + return Some(base_overlay); + } + + let top_overlay = overlays.next()?; + self.is_top_overlay_active = top_overlay.is_some(); + + top_overlay } } Element::new(Hover { base: base.into(), top: top.into(), - is_overlay_active: false, + is_top_overlay_active: false, }) } |