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