diff options
author | 2020-04-18 14:42:48 +0200 | |
---|---|---|
committer | 2020-07-08 10:59:56 +0200 | |
commit | afd9274de26ccf65285df02007b4ddb697bea9a3 (patch) | |
tree | afc8e452251db84a132367753104613d2d4567b7 /native/src/element.rs | |
parent | b1afadf1a2162e236525c466b6b3099a2623a2de (diff) | |
download | iced-afd9274de26ccf65285df02007b4ddb697bea9a3.tar.gz iced-afd9274de26ccf65285df02007b4ddb697bea9a3.tar.bz2 iced-afd9274de26ccf65285df02007b4ddb697bea9a3.zip |
Draft `ComboBox` and `Menu` layer
Diffstat (limited to 'native/src/element.rs')
-rw-r--r-- | native/src/element.rs | 25 |
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) + } } |