Draft ComboBox and Menu layer

This commit is contained in:
Héctor Ramón Jiménez 2020-04-18 14:42:48 +02:00
parent b1afadf1a2
commit afd9274de2
22 changed files with 966 additions and 150 deletions

View file

@ -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)
}
}