From c901f40fd6c5aa39f4dc056b2b59bc7133b287e6 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 14 Apr 2020 12:11:10 +0200 Subject: Introduce `Widget::overlay` :tada: --- native/src/element.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index 73e39012..c6d65550 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -1,5 +1,6 @@ use crate::{ - layout, Clipboard, Color, Event, Hasher, Layout, Length, Point, Widget, + layout, Clipboard, Color, Event, Hasher, Layout, Length, Overlay, Point, + Widget, }; /// A generic [`Widget`]. @@ -15,7 +16,7 @@ use crate::{ /// [`Element`]: struct.Element.html #[allow(missing_debug_implementations)] pub struct Element<'a, Message, Renderer> { - pub(crate) widget: Box + 'a>, + pub(crate) widget: Box + 'a>, } impl<'a, Message, Renderer> Element<'a, Message, Renderer> @@ -27,7 +28,7 @@ where /// [`Element`]: struct.Element.html /// [`Widget`]: widget/trait.Widget.html pub fn new( - widget: impl Widget + 'a, + widget: impl Widget<'a, Message, Renderer> + 'a, ) -> Element<'a, Message, Renderer> { Element { widget: Box::new(widget), @@ -270,16 +271,22 @@ where pub fn hash_layout(&self, state: &mut Hasher) { self.widget.hash_layout(state); } + + pub fn overlay( + &mut self, + ) -> Option + 'a>> { + self.widget.overlay() + } } struct Map<'a, A, B, Renderer> { - widget: Box + 'a>, + widget: Box + 'a>, mapper: Box B>, } impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { pub fn new( - widget: Box + 'a>, + widget: Box + 'a>, mapper: F, ) -> Map<'a, A, B, Renderer> where @@ -292,7 +299,7 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { } } -impl<'a, A, B, Renderer> Widget for Map<'a, A, B, Renderer> +impl<'a, A, B, Renderer> Widget<'a, B, Renderer> for Map<'a, A, B, Renderer> where Renderer: crate::Renderer, { @@ -367,7 +374,7 @@ where } } -impl<'a, Message, Renderer> Widget +impl<'a, Message, Renderer> Widget<'a, Message, Renderer> for Explain<'a, Message, Renderer> where Renderer: crate::Renderer + layout::Debugger, -- cgit From f064f0482b653a1fbee4afbddcecf91e3a399004 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 16 Apr 2020 13:22:00 +0200 Subject: Introduce `Layer` trait --- native/src/element.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index c6d65550..01379d2d 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -274,8 +274,9 @@ where pub fn overlay( &mut self, - ) -> Option + 'a>> { - self.widget.overlay() + layout: Layout<'_>, + ) -> Option> { + self.widget.overlay(layout) } } -- cgit From afd9274de26ccf65285df02007b4ddb697bea9a3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 18 Apr 2020 14:42:48 +0200 Subject: Draft `ComboBox` and `Menu` layer --- native/src/element.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'native/src/element.rs') 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 + 'a>, - mapper: Box B>, + mapper: Rc 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> { + 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> { + self.element.overlay(layout) + } } -- cgit From 625979b6652a8a14a0eaf6bd62f1e9a8da0ae421 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 5 Jul 2020 05:44:10 +0200 Subject: Draft `Widget::overlay` idempotency --- native/src/element.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index c881871a..b00f9e55 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -273,10 +273,10 @@ where self.widget.hash_layout(state); } - pub fn overlay( - &mut self, + pub fn overlay<'b>( + &'b mut self, layout: Layout<'_>, - ) -> Option> { + ) -> Option> { self.widget.overlay(layout) } } @@ -366,10 +366,12 @@ where fn overlay( &mut self, layout: Layout<'_>, - ) -> Option> { + ) -> Option> { + let mapper = self.mapper.clone(); + self.widget .overlay(layout) - .map(|overlay| overlay.map(self.mapper.clone())) + .map(move |overlay| overlay.map(mapper)) } } @@ -450,7 +452,7 @@ where fn overlay( &mut self, layout: Layout<'_>, - ) -> Option> { + ) -> Option> { self.element.overlay(layout) } } -- cgit From 1070b61f3408539f6c9cb9d265f3295e6d055db7 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 10 Jul 2020 01:31:56 +0200 Subject: Rename `overlay::Content` trait to `Overlay` The `Overlay` struct is now `overlay::Element`. --- native/src/element.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index b00f9e55..8e0ab295 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -1,5 +1,5 @@ use crate::{ - layout, Clipboard, Color, Event, Hasher, Layout, Length, Overlay, Point, + layout, overlay, Clipboard, Color, Event, Hasher, Layout, Length, Point, Widget, }; use std::rc::Rc; @@ -276,7 +276,7 @@ where pub fn overlay<'b>( &'b mut self, layout: Layout<'_>, - ) -> Option> { + ) -> Option> { self.widget.overlay(layout) } } @@ -366,7 +366,7 @@ where fn overlay( &mut self, layout: Layout<'_>, - ) -> Option> { + ) -> Option> { let mapper = self.mapper.clone(); self.widget @@ -452,7 +452,7 @@ where fn overlay( &mut self, layout: Layout<'_>, - ) -> Option> { + ) -> Option> { self.element.overlay(layout) } } -- cgit From dc0e423142f053c59c326d92920e7829b6852cca Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 10 Jul 2020 02:01:30 +0200 Subject: Remove unnecessary lifetime in `Widget` trait --- native/src/element.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index 8e0ab295..db95919a 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -17,7 +17,7 @@ use std::rc::Rc; /// [`Element`]: struct.Element.html #[allow(missing_debug_implementations)] pub struct Element<'a, Message, Renderer> { - pub(crate) widget: Box + 'a>, + pub(crate) widget: Box + 'a>, } impl<'a, Message, Renderer> Element<'a, Message, Renderer> @@ -29,7 +29,7 @@ where /// [`Element`]: struct.Element.html /// [`Widget`]: widget/trait.Widget.html pub fn new( - widget: impl Widget<'a, Message, Renderer> + 'a, + widget: impl Widget + 'a, ) -> Element<'a, Message, Renderer> { Element { widget: Box::new(widget), @@ -282,13 +282,13 @@ where } struct Map<'a, A, B, Renderer> { - widget: Box + 'a>, + widget: Box + 'a>, mapper: Rc B>, } impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { pub fn new( - widget: Box + 'a>, + widget: Box + 'a>, mapper: F, ) -> Map<'a, A, B, Renderer> where @@ -301,7 +301,7 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { } } -impl<'a, A, B, Renderer> Widget<'a, B, Renderer> for Map<'a, A, B, Renderer> +impl<'a, A, B, Renderer> Widget for Map<'a, A, B, Renderer> where Renderer: crate::Renderer + 'a, A: 'static, @@ -389,7 +389,7 @@ where } } -impl<'a, Message, Renderer> Widget<'a, Message, Renderer> +impl<'a, Message, Renderer> Widget for Explain<'a, Message, Renderer> where Renderer: crate::Renderer + layout::Debugger, -- cgit From 2118a726f8b6134820e1ca5b7b802fa1344e453a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 10 Jul 2020 02:39:12 +0200 Subject: Write documentation for the new `overlay` API --- native/src/element.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index db95919a..a1320f18 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -24,7 +24,7 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> where Renderer: crate::Renderer, { - /// Create a new [`Element`] containing the given [`Widget`]. + /// Creates a new [`Element`] containing the given [`Widget`]. /// /// [`Element`]: struct.Element.html /// [`Widget`]: widget/trait.Widget.html @@ -273,6 +273,9 @@ where self.widget.hash_layout(state); } + /// Returns the overlay of the [`Element`], if there is any. + /// + /// [`Element`]: struct.Element.html pub fn overlay<'b>( &'b mut self, layout: Layout<'_>, -- cgit From 31c30fedd5e5ad74cc1f66162d7e5c0e5e3cf420 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 16 Jul 2020 04:40:36 +0200 Subject: Remove unnecessary `Rc` in both `Element::map` --- native/src/element.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'native/src/element.rs') diff --git a/native/src/element.rs b/native/src/element.rs index a1320f18..514a135b 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -2,7 +2,6 @@ use crate::{ layout, overlay, Clipboard, Color, Event, Hasher, Layout, Length, Point, Widget, }; -use std::rc::Rc; /// A generic [`Widget`]. /// @@ -286,7 +285,7 @@ where struct Map<'a, A, B, Renderer> { widget: Box + 'a>, - mapper: Rc B>, + mapper: Box B>, } impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { @@ -299,7 +298,7 @@ impl<'a, A, B, Renderer> Map<'a, A, B, Renderer> { { Map { widget, - mapper: Rc::new(mapper), + mapper: Box::new(mapper), } } } @@ -370,7 +369,7 @@ where &mut self, layout: Layout<'_>, ) -> Option> { - let mapper = self.mapper.clone(); + let mapper = &self.mapper; self.widget .overlay(layout) -- cgit