Fix overlay behavior in hover widget

This commit is contained in:
Héctor Ramón Jiménez 2024-04-27 06:15:58 +02:00
parent a16a75a71d
commit 40dff6b23d
No known key found for this signature in database
GPG key ID: 7CC46565708259A7

View file

@ -313,7 +313,7 @@ where
struct Hover<'a, Message, Theme, Renderer> { struct Hover<'a, Message, Theme, Renderer> {
base: Element<'a, Message, Theme, Renderer>, base: Element<'a, Message, Theme, Renderer>,
top: 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> impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
@ -387,7 +387,7 @@ where
viewport, 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(); let (top_layout, top_tree) = children.next().unwrap();
renderer.with_layer(layout.bounds(), |renderer| { renderer.with_layer(layout.bounds(), |renderer| {
@ -491,13 +491,10 @@ where
translation: core::Vector, translation: core::Vector,
) -> Option<core::overlay::Element<'b, Message, Theme, Renderer>> ) -> 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() .into_iter()
.rev() .zip(layout.children().zip(tree.children.iter_mut()))
.zip( .map(|(child, (layout, tree))| {
layout.children().rev().zip(tree.children.iter_mut().rev()),
)
.find_map(|(child, (layout, tree))| {
child.as_widget_mut().overlay( child.as_widget_mut().overlay(
tree, tree,
layout, layout,
@ -506,15 +503,21 @@ where
) )
}); });
self.is_overlay_active = overlay.is_some(); if let Some(base_overlay) = overlays.next()? {
overlay return Some(base_overlay);
}
let top_overlay = overlays.next()?;
self.is_top_overlay_active = top_overlay.is_some();
top_overlay
} }
} }
Element::new(Hover { Element::new(Hover {
base: base.into(), base: base.into(),
top: top.into(), top: top.into(),
is_overlay_active: false, is_top_overlay_active: false,
}) })
} }