summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pure/src/element.rs8
-rw-r--r--pure/src/widget/tree.rs32
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