Forward overlay() calls in iced_pure::element::Map

If Map does not override overlay(), calling map() on a pure Element
breaks any pick_list inside it (its overlay does not appear).

Fix it by implementing overlay() the same way iced_native::element::Map
does.
This commit is contained in:
Marien Zwart 2022-03-26 18:42:26 +11:00
parent e66a79fb9c
commit 323a0b9e61

View file

@ -1,3 +1,4 @@
use crate::overlay;
use crate::widget::tree::{self, Tree};
use crate::widget::Widget;
@ -33,7 +34,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
where
Message: 'a,
Renderer: iced_native::Renderer + 'a,
B: 'a,
B: 'static,
{
Element::new(Map::new(self.widget, f))
}
@ -63,7 +64,7 @@ impl<'a, A, B, Renderer> Widget<B, Renderer> for Map<'a, A, B, Renderer>
where
Renderer: iced_native::Renderer + 'a,
A: 'a,
B: 'a,
B: 'static,
{
fn tag(&self) -> tree::Tag {
self.widget.tag()
@ -160,4 +161,17 @@ where
renderer,
)
}
fn overlay<'b>(
&'b self,
tree: &'b mut Tree,
layout: Layout<'_>,
renderer: &Renderer,
) -> Option<overlay::Element<'b, B, Renderer>> {
let mapper = &self.mapper;
self.widget
.overlay(tree, layout, renderer)
.map(move |overlay| overlay.map(mapper))
}
}