diff options
Diffstat (limited to '')
| -rw-r--r-- | pure/src/element.rs | 8 | ||||
| -rw-r--r-- | pure/src/widget/tree.rs | 32 | 
2 files changed, 27 insertions, 13 deletions
| diff --git a/pure/src/element.rs b/pure/src/element.rs index 704b3d0b..5b5038c8 100644 --- a/pure/src/element.rs +++ b/pure/src/element.rs @@ -321,3 +321,11 @@ where              .map(move |overlay| overlay.map(mapper))      }  } + +impl<'a, Message, Renderer> AsRef<dyn Widget<Message, Renderer> + 'a> +    for Element<'a, Message, Renderer> +{ +    fn as_ref(&self) -> &(dyn Widget<Message, Renderer> + 'a) { +        self.widget.as_ref() +    } +} 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<Message, Renderer>( -        element: &Element<'_, Message, Renderer>, +    pub fn new<'a, Message, Renderer>( +        widget: impl AsRef<dyn Widget<Message, Renderer> + '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<Message, Renderer>( +    pub fn diff<'a, Message, Renderer>(          &mut self, -        new: &Element<'_, Message, Renderer>, +        new: impl AsRef<dyn Widget<Message, Renderer> + '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<Message, Renderer>( +    pub fn diff_children<'a, Message, Renderer>(          &mut self, -        new_children: &[Element<'_, Message, Renderer>], +        new_children: &[impl AsRef<dyn Widget<Message, Renderer> + '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 | 
