diff options
Diffstat (limited to 'pure/src')
-rw-r--r-- | pure/src/element.rs | 18 | ||||
-rw-r--r-- | pure/src/helpers.rs | 2 | ||||
-rw-r--r-- | pure/src/lib.rs | 3 | ||||
-rw-r--r-- | pure/src/widget/tree.rs | 33 |
4 files changed, 40 insertions, 16 deletions
diff --git a/pure/src/element.rs b/pure/src/element.rs index 704b3d0b..5450db20 100644 --- a/pure/src/element.rs +++ b/pure/src/element.rs @@ -8,6 +8,8 @@ use iced_native::mouse; use iced_native::renderer; use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; +use std::borrow::Borrow; + /// A generic [`Widget`]. /// /// It is useful to build composable user interfaces that do not leak @@ -321,3 +323,19 @@ where .map(move |overlay| overlay.map(mapper)) } } + +impl<'a, Message, Renderer> Borrow<dyn Widget<Message, Renderer> + 'a> + for Element<'a, Message, Renderer> +{ + fn borrow(&self) -> &(dyn Widget<Message, Renderer> + 'a) { + self.widget.borrow() + } +} + +impl<'a, Message, Renderer> Borrow<dyn Widget<Message, Renderer> + 'a> + for &Element<'a, Message, Renderer> +{ + fn borrow(&self) -> &(dyn Widget<Message, Renderer> + 'a) { + self.widget.borrow() + } +} diff --git a/pure/src/helpers.rs b/pure/src/helpers.rs index 2c4a37be..746b807d 100644 --- a/pure/src/helpers.rs +++ b/pure/src/helpers.rs @@ -202,7 +202,7 @@ pub fn horizontal_rule<'a>(height: u16) -> widget::Rule<'a> { /// /// [`Rule`]: widget::Rule pub fn vertical_rule<'a>(width: u16) -> widget::Rule<'a> { - widget::Rule::horizontal(width) + widget::Rule::vertical(width) } /// Creates a new [`ProgressBar`]. diff --git a/pure/src/lib.rs b/pure/src/lib.rs index 6af74771..fa5fd46f 100644 --- a/pure/src/lib.rs +++ b/pure/src/lib.rs @@ -87,12 +87,11 @@ #![forbid(unsafe_code)] #![forbid(rust_2018_idioms)] +pub mod flex; pub mod helpers; pub mod overlay; pub mod widget; -pub(crate) mod flex; - mod element; pub use element::Element; diff --git a/pure/src/widget/tree.rs b/pure/src/widget/tree.rs index d81dd02c..0bb3107a 100644 --- a/pure/src/widget/tree.rs +++ b/pure/src/widget/tree.rs @@ -1,7 +1,8 @@ //! Store internal widget state in a state tree to ensure continuity. -use crate::Element; +use crate::Widget; use std::any::{self, Any}; +use std::borrow::Borrow; /// A persistent state widget tree. /// @@ -28,13 +29,15 @@ impl Tree { } /// Creates a new [`Tree`] for the provided [`Element`]. - pub fn new<Message, Renderer>( - element: &Element<'_, Message, Renderer>, + pub fn new<'a, Message, Renderer>( + widget: impl Borrow<dyn Widget<Message, Renderer> + 'a>, ) -> Self { + let widget = widget.borrow(); + Self { - tag: element.as_widget().tag(), - state: element.as_widget().state(), - children: element.as_widget().children(), + tag: widget.tag(), + state: widget.state(), + children: widget.children(), } } @@ -46,23 +49,27 @@ impl Tree { /// Otherwise, the whole [`Tree`] is recreated. /// /// [`Widget::diff`]: crate::Widget::diff - pub fn diff<Message, Renderer>( + pub fn diff<'a, Message, Renderer>( &mut self, - new: &Element<'_, Message, Renderer>, + new: impl Borrow<dyn Widget<Message, Renderer> + 'a>, ) { - if self.tag == new.as_widget().tag() { - new.as_widget().diff(self) + if self.tag == new.borrow().tag() { + new.borrow().diff(self) } else { *self = Self::new(new); } } /// Reconciliates the children of the tree with the provided list of [`Element`]. - pub fn diff_children<Message, Renderer>( + pub fn diff_children<'a, Message, Renderer>( &mut self, - new_children: &[Element<'_, Message, Renderer>], + new_children: &[impl Borrow<dyn Widget<Message, Renderer> + 'a>], ) { - self.diff_children_custom(new_children, Self::diff, Self::new) + self.diff_children_custom( + new_children, + |tree, widget| tree.diff(widget.borrow()), + |widget| Self::new(widget.borrow()), + ) } /// Reconciliates the children of the tree with the provided list of [`Element`] using custom |