Fix duplicate recording when Overlay present
This commit is contained in:
parent
1c54f5e3e9
commit
445b6c8608
1 changed files with 31 additions and 9 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue