From 323a0b9e6189c8b7deeecc9961db27febbe196b1 Mon Sep 17 00:00:00 2001 From: Marien Zwart Date: Sat, 26 Mar 2022 18:42:26 +1100 Subject: [PATCH 1/2] Forward overlay() calls in iced_pure::element::Map If Map does not override overlay(), calling map() on a pure Element breaks any pick_list inside it (its overlay does not appear). Fix it by implementing overlay() the same way iced_native::element::Map does. --- pure/src/element.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pure/src/element.rs b/pure/src/element.rs index 3d5697fe7b..e6812c0ef3 100644 --- a/pure/src/element.rs +++ b/pure/src/element.rs @@ -1,3 +1,4 @@ +use crate::overlay; use crate::widget::tree::{self, Tree}; use crate::widget::Widget; @@ -33,7 +34,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { where Message: 'a, Renderer: iced_native::Renderer + 'a, - B: 'a, + B: 'static, { Element::new(Map::new(self.widget, f)) } @@ -63,7 +64,7 @@ impl<'a, A, B, Renderer> Widget for Map<'a, A, B, Renderer> where Renderer: iced_native::Renderer + 'a, A: 'a, - B: 'a, + B: 'static, { fn tag(&self) -> tree::Tag { self.widget.tag() @@ -160,4 +161,17 @@ where renderer, ) } + + fn overlay<'b>( + &'b self, + tree: &'b mut Tree, + layout: Layout<'_>, + renderer: &Renderer, + ) -> Option> { + let mapper = &self.mapper; + + self.widget + .overlay(tree, layout, renderer) + .map(move |overlay| overlay.map(mapper)) + } } From d9d6dff550a917d2b73c7ebf96cab2c1472e3243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Tue, 29 Mar 2022 18:24:17 +0700 Subject: [PATCH 2/2] Loose lifetime bounds in `pure::Widget` implementations --- native/src/overlay/element.rs | 2 +- native/src/widget/scrollable.rs | 6 +++--- pure/src/element.rs | 4 ++-- pure/src/lib.rs | 4 ++-- pure/src/widget/button.rs | 8 ++++---- pure/src/widget/column.rs | 4 ++-- pure/src/widget/pick_list.rs | 4 ++-- pure/src/widget/row.rs | 4 ++-- pure/src/widget/scrollable.rs | 4 ++-- pure/src/widget/text.rs | 4 ++-- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/native/src/overlay/element.rs b/native/src/overlay/element.rs index b60881e397..24c0fe0186 100644 --- a/native/src/overlay/element.rs +++ b/native/src/overlay/element.rs @@ -41,7 +41,7 @@ where where Message: 'a, Renderer: 'a, - B: 'static, + B: 'a, { Element { position: self.position, diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index 748fd27d31..8958f6da24 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -33,7 +33,7 @@ pub struct Scrollable<'a, Message, Renderer> { scrollbar_margin: u16, scroller_width: u16, content: Column<'a, Message, Renderer>, - on_scroll: Option Message>>, + on_scroll: Option Message + 'a>>, style_sheet: Box, } @@ -181,7 +181,7 @@ pub fn update( scrollbar_width: u16, scrollbar_margin: u16, scroller_width: u16, - on_scroll: &Option Message>>, + on_scroll: &Option Message + '_>>, update_content: impl FnOnce( Event, Layout<'_>, @@ -597,7 +597,7 @@ fn scrollbar( fn notify_on_scroll( state: &State, - on_scroll: &Option Message>>, + on_scroll: &Option Message + '_>>, bounds: Rectangle, content_bounds: Rectangle, shell: &mut Shell<'_, Message>, diff --git a/pure/src/element.rs b/pure/src/element.rs index e6812c0ef3..08096103de 100644 --- a/pure/src/element.rs +++ b/pure/src/element.rs @@ -34,7 +34,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> { where Message: 'a, Renderer: iced_native::Renderer + 'a, - B: 'static, + B: 'a, { Element::new(Map::new(self.widget, f)) } @@ -64,7 +64,7 @@ impl<'a, A, B, Renderer> Widget for Map<'a, A, B, Renderer> where Renderer: iced_native::Renderer + 'a, A: 'a, - B: 'static, + B: 'a, { fn tag(&self) -> tree::Tag { self.widget.tag() diff --git a/pure/src/lib.rs b/pure/src/lib.rs index ec2f29f8af..71d20a4d32 100644 --- a/pure/src/lib.rs +++ b/pure/src/lib.rs @@ -23,8 +23,8 @@ pub struct Pure<'a, Message, Renderer> { impl<'a, Message, Renderer> Pure<'a, Message, Renderer> where - Message: 'static, - Renderer: iced_native::Renderer + 'static, + Message: 'a, + Renderer: iced_native::Renderer + 'a, { pub fn new( state: &'a mut State, diff --git a/pure/src/widget/button.rs b/pure/src/widget/button.rs index f99d301889..e083ea7302 100644 --- a/pure/src/widget/button.rs +++ b/pure/src/widget/button.rs @@ -75,8 +75,8 @@ impl<'a, Message, Renderer> Button<'a, Message, Renderer> { impl<'a, Message, Renderer> Widget for Button<'a, Message, Renderer> where - Message: 'static + Clone, - Renderer: 'static + iced_native::Renderer, + Message: 'a + Clone, + Renderer: 'a + iced_native::Renderer, { fn tag(&self) -> tree::Tag { tree::Tag::of::() @@ -216,8 +216,8 @@ where impl<'a, Message, Renderer> Into> for Button<'a, Message, Renderer> where - Message: Clone + 'static, - Renderer: iced_native::Renderer + 'static, + Message: Clone + 'a, + Renderer: iced_native::Renderer + 'a, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/column.rs b/pure/src/widget/column.rs index 6b4472706f..a4c0987bf8 100644 --- a/pure/src/widget/column.rs +++ b/pure/src/widget/column.rs @@ -216,8 +216,8 @@ where impl<'a, Message, Renderer> Into> for Column<'a, Message, Renderer> where - Message: 'static, - Renderer: iced_native::Renderer + 'static, + Message: 'a, + Renderer: iced_native::Renderer + 'a, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/pick_list.rs b/pure/src/widget/pick_list.rs index 9573f27a1e..45bb289e84 100644 --- a/pure/src/widget/pick_list.rs +++ b/pure/src/widget/pick_list.rs @@ -109,7 +109,7 @@ impl<'a, T: 'a, Message, Renderer> Widget where T: Clone + ToString + Eq + 'static, [T]: ToOwned>, - Message: 'static, + Message: 'a, Renderer: text::Renderer + 'a, { fn tag(&self) -> tree::Tag { @@ -226,7 +226,7 @@ where T: Clone + ToString + Eq + 'static, [T]: ToOwned>, Renderer: text::Renderer + 'a, - Message: 'static, + Message: 'a, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/row.rs b/pure/src/widget/row.rs index d7f90540ba..92812d27d7 100644 --- a/pure/src/widget/row.rs +++ b/pure/src/widget/row.rs @@ -203,8 +203,8 @@ where impl<'a, Message, Renderer> Into> for Row<'a, Message, Renderer> where - Message: 'static, - Renderer: iced_native::Renderer + 'static, + Message: 'a, + Renderer: iced_native::Renderer + 'a, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/pure/src/widget/scrollable.rs b/pure/src/widget/scrollable.rs index f9a512008b..24263c9568 100644 --- a/pure/src/widget/scrollable.rs +++ b/pure/src/widget/scrollable.rs @@ -19,7 +19,7 @@ pub struct Scrollable<'a, Message, Renderer> { scrollbar_width: u16, scrollbar_margin: u16, scroller_width: u16, - on_scroll: Option Message>>, + on_scroll: Option Message + 'a>>, style_sheet: Box, content: Element<'a, Message, Renderer>, } @@ -71,7 +71,7 @@ impl<'a, Message, Renderer: iced_native::Renderer> /// /// The function takes the new relative offset of the [`Scrollable`] /// (e.g. `0` means top, while `1` means bottom). - pub fn on_scroll(mut self, f: impl Fn(f32) -> Message + 'static) -> Self { + pub fn on_scroll(mut self, f: impl Fn(f32) -> Message + 'a) -> Self { self.on_scroll = Some(Box::new(f)); self } diff --git a/pure/src/widget/text.rs b/pure/src/widget/text.rs index b78d41177d..58a939c14b 100644 --- a/pure/src/widget/text.rs +++ b/pure/src/widget/text.rs @@ -53,7 +53,7 @@ where impl<'a, Message, Renderer> Into> for Text where - Renderer: text::Renderer + 'static, + Renderer: text::Renderer + 'a, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) @@ -62,7 +62,7 @@ where impl<'a, Message, Renderer> Into> for &'a str where - Renderer: text::Renderer + 'static, + Renderer: text::Renderer + 'a, { fn into(self) -> Element<'a, Message, Renderer> { Text::new(self).into()