summaryrefslogtreecommitdiffstats
path: root/pure/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-05-06 19:42:14 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-05-06 19:42:14 +0200
commitf1c1d519c5be7f9f0bbd32b22635659a803425e2 (patch)
treeecc49c877588a0b474acdf73fd7d1359b7bed5d1 /pure/src
parent2243e461909e58a6dc5a12fb237929e47c2864e5 (diff)
downloadiced-f1c1d519c5be7f9f0bbd32b22635659a803425e2.tar.gz
iced-f1c1d519c5be7f9f0bbd32b22635659a803425e2.tar.bz2
iced-f1c1d519c5be7f9f0bbd32b22635659a803425e2.zip
Take `AsRef<Widget>` instead of `Element` in `Tree` API
Diffstat (limited to 'pure/src')
-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