summaryrefslogtreecommitdiffstats
path: root/native/src/element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/element.rs')
-rw-r--r--native/src/element.rs25
1 files changed, 22 insertions, 3 deletions
diff --git a/native/src/element.rs b/native/src/element.rs
index 01379d2d..c881871a 100644
--- a/native/src/element.rs
+++ b/native/src/element.rs
@@ -2,6 +2,7 @@ use crate::{
layout, Clipboard, Color, Event, Hasher, Layout, Length, Overlay, Point,
Widget,
};
+use std::rc::Rc;
/// A generic [`Widget`].
///
@@ -282,7 +283,7 @@ where
struct Map<'a, A, B, Renderer> {
widget: Box<dyn Widget<'a, A, Renderer> + 'a>,
- mapper: Box<dyn Fn(A) -> B>,
+ mapper: Rc<dyn Fn(A) -> B>,
}
impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {
@@ -295,14 +296,16 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> {
{
Map {
widget,
- mapper: Box::new(mapper),
+ mapper: Rc::new(mapper),
}
}
}
impl<'a, A, B, Renderer> Widget<'a, B, Renderer> for Map<'a, A, B, Renderer>
where
- Renderer: crate::Renderer,
+ Renderer: crate::Renderer + 'a,
+ A: 'static,
+ B: 'static,
{
fn width(&self) -> Length {
self.widget.width()
@@ -359,6 +362,15 @@ where
fn hash_layout(&self, state: &mut Hasher) {
self.widget.hash_layout(state);
}
+
+ fn overlay(
+ &mut self,
+ layout: Layout<'_>,
+ ) -> Option<Overlay<'a, B, Renderer>> {
+ self.widget
+ .overlay(layout)
+ .map(|overlay| overlay.map(self.mapper.clone()))
+ }
}
struct Explain<'a, Message, Renderer: crate::Renderer> {
@@ -434,4 +446,11 @@ where
fn hash_layout(&self, state: &mut Hasher) {
self.element.widget.hash_layout(state);
}
+
+ fn overlay(
+ &mut self,
+ layout: Layout<'_>,
+ ) -> Option<Overlay<'a, Message, Renderer>> {
+ self.element.overlay(layout)
+ }
}