diff options
Diffstat (limited to 'widget/src/lazy/responsive.rs')
-rw-r--r-- | widget/src/lazy/responsive.rs | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs index 1df0866f..9875b24e 100644 --- a/widget/src/lazy/responsive.rs +++ b/widget/src/lazy/responsive.rs @@ -22,12 +22,17 @@ use std::ops::Deref; /// A [`Responsive`] widget will always try to fill all the available space of /// its parent. #[allow(missing_debug_implementations)] -pub struct Responsive<'a, Message, Renderer = crate::Renderer> { - view: Box<dyn Fn(Size) -> Element<'a, Message, Renderer> + 'a>, - content: RefCell<Content<'a, Message, Renderer>>, +pub struct Responsive< + 'a, + Message, + Theme = crate::Theme, + Renderer = crate::Renderer, +> { + view: Box<dyn Fn(Size) -> Element<'a, Message, Theme, Renderer> + 'a>, + content: RefCell<Content<'a, Message, Theme, Renderer>>, } -impl<'a, Message, Renderer> Responsive<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Responsive<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -38,7 +43,7 @@ where /// the [`Responsive`] widget and, therefore, can be used to build the /// contents of the widget in a responsive way. pub fn new( - view: impl Fn(Size) -> Element<'a, Message, Renderer> + 'a, + view: impl Fn(Size) -> Element<'a, Message, Theme, Renderer> + 'a, ) -> Self { Self { view: Box::new(view), @@ -51,13 +56,13 @@ where } } -struct Content<'a, Message, Renderer> { +struct Content<'a, Message, Theme, Renderer> { size: Size, layout: Option<layout::Node>, - element: Element<'a, Message, Renderer>, + element: Element<'a, Message, Theme, Renderer>, } -impl<'a, Message, Renderer> Content<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Content<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -75,7 +80,7 @@ where &mut self, tree: &mut Tree, new_size: Size, - view: &dyn Fn(Size) -> Element<'a, Message, Renderer>, + view: &dyn Fn(Size) -> Element<'a, Message, Theme, Renderer>, ) { if self.size == new_size { return; @@ -93,12 +98,12 @@ where tree: &mut Tree, renderer: R, layout: Layout<'_>, - view: &dyn Fn(Size) -> Element<'a, Message, Renderer>, + view: &dyn Fn(Size) -> Element<'a, Message, Theme, Renderer>, f: impl FnOnce( &mut Tree, R, Layout<'_>, - &mut Element<'a, Message, Renderer>, + &mut Element<'a, Message, Theme, Renderer>, ) -> T, ) -> T where @@ -120,8 +125,8 @@ struct State { tree: RefCell<Tree>, } -impl<'a, Message, Renderer> Widget<Message, Renderer> - for Responsive<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer> + for Responsive<'a, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -223,7 +228,7 @@ where &self, tree: &Tree, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, @@ -274,7 +279,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, - ) -> Option<overlay::Element<'b, Message, Renderer>> { + ) -> Option<overlay::Element<'b, Message, Theme, Renderer>> { use std::ops::DerefMut; let state = tree.state.downcast_ref::<State>(); @@ -283,7 +288,10 @@ where content: self.content.borrow_mut(), tree: state.tree.borrow_mut(), types: PhantomData, - overlay_builder: |content: &mut RefMut<'_, Content<'_, _, _>>, + overlay_builder: |content: &mut RefMut< + '_, + Content<'_, _, _, _>, + >, tree| { content.update(tree, layout.bounds().size(), &self.view); content.layout(tree, renderer); @@ -315,32 +323,36 @@ where } } -impl<'a, Message, Renderer> From<Responsive<'a, Message, Renderer>> - for Element<'a, Message, Renderer> +impl<'a, Message, Theme, Renderer> + From<Responsive<'a, Message, Theme, Renderer>> + for Element<'a, Message, Theme, Renderer> where - Renderer: core::Renderer + 'a, Message: 'a, + Theme: 'a, + Renderer: core::Renderer + 'a, { - fn from(responsive: Responsive<'a, Message, Renderer>) -> Self { + fn from(responsive: Responsive<'a, Message, Theme, Renderer>) -> Self { Self::new(responsive) } } #[self_referencing] -struct Overlay<'a, 'b, Message, Renderer> { - content: RefMut<'a, Content<'b, Message, Renderer>>, +struct Overlay<'a, 'b, Message, Theme, Renderer> { + content: RefMut<'a, Content<'b, Message, Theme, Renderer>>, tree: RefMut<'a, Tree>, types: PhantomData<Message>, #[borrows(mut content, mut tree)] #[not_covariant] - overlay: Option<RefCell<Nested<'this, Message, Renderer>>>, + overlay: Option<RefCell<Nested<'this, Message, Theme, Renderer>>>, } -impl<'a, 'b, Message, Renderer> Overlay<'a, 'b, Message, Renderer> { +impl<'a, 'b, Message, Theme, Renderer> + Overlay<'a, 'b, Message, Theme, Renderer> +{ fn with_overlay_maybe<T>( &self, - f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T, ) -> Option<T> { self.with_overlay(|overlay| { overlay.as_ref().map(|nested| (f)(&mut nested.borrow_mut())) @@ -349,7 +361,7 @@ impl<'a, 'b, Message, Renderer> Overlay<'a, 'b, Message, Renderer> { fn with_overlay_mut_maybe<T>( &mut self, - f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T, + f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T, ) -> Option<T> { self.with_overlay_mut(|overlay| { overlay.as_mut().map(|nested| (f)(nested.get_mut())) @@ -357,8 +369,9 @@ impl<'a, 'b, Message, Renderer> Overlay<'a, 'b, Message, Renderer> { } } -impl<'a, 'b, Message, Renderer> overlay::Overlay<Message, Renderer> - for Overlay<'a, 'b, Message, Renderer> +impl<'a, 'b, Message, Theme, Renderer> + overlay::Overlay<Message, Theme, Renderer> + for Overlay<'a, 'b, Message, Theme, Renderer> where Renderer: core::Renderer, { @@ -378,7 +391,7 @@ where fn draw( &self, renderer: &mut Renderer, - theme: &Renderer::Theme, + theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, |