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/overlay.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/overlay.rs')
-rw-r--r-- | native/src/overlay.rs | 100 |
1 files changed, 94 insertions, 6 deletions
diff --git a/native/src/overlay.rs b/native/src/overlay.rs index a4bd5ea3..d7a1e082 100644 --- a/native/src/overlay.rs +++ b/native/src/overlay.rs @@ -1,4 +1,5 @@ use crate::{layout, Clipboard, Event, Hasher, Layer, Layout, Point, Size}; +use std::rc::Rc; #[allow(missing_debug_implementations)] pub struct Overlay<'a, Message, Renderer> { @@ -17,6 +18,18 @@ where Self { position, layer } } + pub fn map<B>(self, f: Rc<dyn Fn(Message) -> B>) -> Overlay<'a, B, Renderer> + where + Message: 'static, + Renderer: 'a, + B: 'static, + { + Overlay { + position: self.position, + layer: Box::new(Map::new(self.layer, f)), + } + } + pub fn layout(&self, renderer: &Renderer, bounds: Size) -> layout::Node { self.layer.layout(renderer, bounds, self.position) } @@ -37,12 +50,87 @@ where pub fn on_event( &mut self, - _event: Event, - _layout: Layout<'_>, - _cursor_position: Point, - _messages: &mut Vec<Message>, - _renderer: &Renderer, - _clipboard: Option<&dyn Clipboard>, + event: Event, + layout: Layout<'_>, + cursor_position: Point, + messages: &mut Vec<Message>, + renderer: &Renderer, + clipboard: Option<&dyn Clipboard>, ) { + self.layer.on_event( + event, + layout, + cursor_position, + messages, + renderer, + clipboard, + ) + } +} + +struct Map<'a, A, B, Renderer> { + layer: Box<dyn Layer<A, Renderer> + 'a>, + mapper: Rc<dyn Fn(A) -> B>, +} + +impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { + pub fn new( + layer: Box<dyn Layer<A, Renderer> + 'a>, + mapper: Rc<dyn Fn(A) -> B + 'static>, + ) -> Map<'a, A, B, Renderer> { + Map { layer, mapper } + } +} + +impl<'a, A, B, Renderer> Layer<B, Renderer> for Map<'a, A, B, Renderer> +where + Renderer: crate::Renderer, +{ + fn layout( + &self, + renderer: &Renderer, + bounds: Size, + position: Point, + ) -> layout::Node { + self.layer.layout(renderer, bounds, position) + } + + fn on_event( + &mut self, + event: Event, + layout: Layout<'_>, + cursor_position: Point, + messages: &mut Vec<B>, + renderer: &Renderer, + clipboard: Option<&dyn Clipboard>, + ) { + let mut original_messages = Vec::new(); + + self.layer.on_event( + event, + layout, + cursor_position, + &mut original_messages, + renderer, + clipboard, + ); + + original_messages + .drain(..) + .for_each(|message| messages.push((self.mapper)(message))); + } + + fn draw( + &self, + renderer: &mut Renderer, + defaults: &Renderer::Defaults, + layout: Layout<'_>, + cursor_position: Point, + ) -> Renderer::Output { + self.layer.draw(renderer, defaults, layout, cursor_position) + } + + fn hash_layout(&self, state: &mut Hasher, position: Point) { + self.layer.hash_layout(state, position); } } |