Fix duplicate recording when Overlay present

This commit is contained in:
Héctor Ramón Jiménez 2025-08-27 10:54:17 +02:00
parent 1c54f5e3e9
commit 445b6c8608
No known key found for this signature in database
GPG key ID: 4C07CEC81AFA161F

View file

@ -23,6 +23,7 @@ pub fn recorder<'a, Message, Renderer>(
pub struct Recorder<'a, Message, Renderer> { pub struct Recorder<'a, Message, Renderer> {
content: Element<'a, Message, Theme, Renderer>, content: Element<'a, Message, Theme, Renderer>,
on_record: Option<Box<dyn Fn(Interaction) -> Message + 'a>>, on_record: Option<Box<dyn Fn(Interaction) -> Message + 'a>>,
has_overlay: bool,
} }
impl<'a, Message, Renderer> Recorder<'a, Message, Renderer> { impl<'a, Message, Renderer> Recorder<'a, Message, Renderer> {
@ -32,6 +33,7 @@ impl<'a, Message, Renderer> Recorder<'a, Message, Renderer> {
Self { Self {
content: content.into(), content: content.into(),
on_record: None, on_record: None,
has_overlay: false,
} }
} }
@ -96,7 +98,9 @@ where
return; return;
} }
if let Some(on_record) = &self.on_record { if !self.has_overlay
&& let Some(on_record) = &self.on_record
{
let state = tree.state.downcast_mut::<State>(); let state = tree.state.downcast_mut::<State>();
record( record(
@ -174,7 +178,7 @@ where
bounds: *last_hovered, bounds: *last_hovered,
..renderer::Quad::default() ..renderer::Quad::default()
}, },
palette.primary.scale_alpha(0.5), palette.primary.scale_alpha(0.7),
); );
}); });
} }
@ -219,6 +223,8 @@ where
_viewport: &Rectangle, _viewport: &Rectangle,
translation: Vector, translation: Vector,
) -> Option<overlay::Element<'a, Message, Theme, Renderer>> { ) -> Option<overlay::Element<'a, Message, Theme, Renderer>> {
self.has_overlay = false;
self.content self.content
.as_widget_mut() .as_widget_mut()
.overlay( .overlay(
@ -229,6 +235,8 @@ where
translation, translation,
) )
.map(|raw| { .map(|raw| {
self.has_overlay = true;
let state = tree.state.downcast_mut::<State>(); let state = tree.state.downcast_mut::<State>();
overlay::Element::new(Box::new(Overlay { overlay::Element::new(Box::new(Overlay {
@ -253,22 +261,20 @@ where
} }
} }
struct Overlay<'a, Message, Theme, Renderer> { struct Overlay<'a, Message, Renderer> {
raw: overlay::Element<'a, Message, Theme, Renderer>, raw: overlay::Element<'a, Message, Theme, Renderer>,
bounds: Rectangle, bounds: Rectangle,
last_hovered: &'a mut Option<Rectangle>, last_hovered: &'a mut Option<Rectangle>,
on_record: Option<&'a dyn Fn(Interaction) -> Message>, on_record: Option<&'a dyn Fn(Interaction) -> Message>,
} }
impl<'a, Message, Theme, Renderer> core::Overlay<Message, Theme, Renderer> impl<'a, Message, Renderer> core::Overlay<Message, Theme, Renderer>
for Overlay<'a, Message, Theme, Renderer> for Overlay<'a, Message, Renderer>
where where
Renderer: core::Renderer + 'a, Renderer: core::Renderer + 'a,
{ {
fn layout(&mut self, renderer: &Renderer, _bounds: Size) -> layout::Node { fn layout(&mut self, renderer: &Renderer, bounds: Size) -> layout::Node {
self.raw self.raw.as_overlay_mut().layout(renderer, bounds)
.as_overlay_mut()
.layout(renderer, self.bounds.size())
} }
fn draw( fn draw(
@ -282,6 +288,22 @@ where
self.raw self.raw
.as_overlay() .as_overlay()
.draw(renderer, theme, style, layout, cursor); .draw(renderer, theme, style, layout, cursor);
let Some(last_hovered) = &self.last_hovered else {
return;
};
let palette = theme.palette();
renderer.with_layer(self.bounds, |renderer| {
renderer.fill_quad(
renderer::Quad {
bounds: *last_hovered,
..renderer::Quad::default()
},
palette.primary.scale_alpha(0.7),
);
});
} }
fn operate( fn operate(