From f1c1d519c5be7f9f0bbd32b22635659a803425e2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 6 May 2022 19:42:14 +0200 Subject: Take `AsRef` instead of `Element` in `Tree` API --- pure/src/widget/tree.rs | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/tree.rs b/pure/src/widget/tree.rs index d81dd02c..28249fe6 100644 --- a/pure/src/widget/tree.rs +++ b/pure/src/widget/tree.rs @@ -1,5 +1,5 @@ //! Store internal widget state in a state tree to ensure continuity. -use crate::Element; +use crate::Widget; use std::any::{self, Any}; @@ -28,13 +28,15 @@ impl Tree { } /// Creates a new [`Tree`] for the provided [`Element`]. - pub fn new( - element: &Element<'_, Message, Renderer>, + pub fn new<'a, Message, Renderer>( + widget: impl AsRef + 'a>, ) -> Self { + let widget = widget.as_ref(); + 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 +48,27 @@ impl Tree { /// Otherwise, the whole [`Tree`] is recreated. /// /// [`Widget::diff`]: crate::Widget::diff - pub fn diff( + pub fn diff<'a, Message, Renderer>( &mut self, - new: &Element<'_, Message, Renderer>, + new: impl AsRef + 'a>, ) { - if self.tag == new.as_widget().tag() { - new.as_widget().diff(self) + if self.tag == new.as_ref().tag() { + new.as_ref().diff(self) } else { *self = Self::new(new); } } /// Reconciliates the children of the tree with the provided list of [`Element`]. - pub fn diff_children( + pub fn diff_children<'a, Message, Renderer>( &mut self, - new_children: &[Element<'_, Message, Renderer>], + new_children: &[impl AsRef + 'a>], ) { - self.diff_children_custom(new_children, Self::diff, Self::new) + self.diff_children_custom( + new_children, + |tree, widget| Self::diff(tree, widget), + |widget| Self::new(widget), + ) } /// Reconciliates the children of the tree with the provided list of [`Element`] using custom -- cgit From 59aeb20600661e55e59223a309146eea68b4c32f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 6 May 2022 23:35:13 +0200 Subject: Use `Borrow` instead of `AsRef` to allow easier casting --- pure/src/widget/tree.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'pure/src/widget') diff --git a/pure/src/widget/tree.rs b/pure/src/widget/tree.rs index 28249fe6..0bb3107a 100644 --- a/pure/src/widget/tree.rs +++ b/pure/src/widget/tree.rs @@ -2,6 +2,7 @@ use crate::Widget; use std::any::{self, Any}; +use std::borrow::Borrow; /// A persistent state widget tree. /// @@ -29,9 +30,9 @@ impl Tree { /// Creates a new [`Tree`] for the provided [`Element`]. pub fn new<'a, Message, Renderer>( - widget: impl AsRef + 'a>, + widget: impl Borrow + 'a>, ) -> Self { - let widget = widget.as_ref(); + let widget = widget.borrow(); Self { tag: widget.tag(), @@ -50,10 +51,10 @@ impl Tree { /// [`Widget::diff`]: crate::Widget::diff pub fn diff<'a, Message, Renderer>( &mut self, - new: impl AsRef + 'a>, + new: impl Borrow + 'a>, ) { - if self.tag == new.as_ref().tag() { - new.as_ref().diff(self) + if self.tag == new.borrow().tag() { + new.borrow().diff(self) } else { *self = Self::new(new); } @@ -62,12 +63,12 @@ impl Tree { /// Reconciliates the children of the tree with the provided list of [`Element`]. pub fn diff_children<'a, Message, Renderer>( &mut self, - new_children: &[impl AsRef + 'a>], + new_children: &[impl Borrow + 'a>], ) { self.diff_children_custom( new_children, - |tree, widget| Self::diff(tree, widget), - |widget| Self::new(widget), + |tree, widget| tree.diff(widget.borrow()), + |widget| Self::new(widget.borrow()), ) } -- cgit