Use Borrow instead of AsRef to allow easier casting

This commit is contained in:
Héctor Ramón Jiménez 2022-05-06 23:35:13 +02:00
parent f1c1d519c5
commit 59aeb20600
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
2 changed files with 22 additions and 11 deletions

View file

@ -8,6 +8,8 @@ use iced_native::mouse;
use iced_native::renderer; use iced_native::renderer;
use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
use std::borrow::Borrow;
/// A generic [`Widget`]. /// A generic [`Widget`].
/// ///
/// It is useful to build composable user interfaces that do not leak /// It is useful to build composable user interfaces that do not leak
@ -322,10 +324,18 @@ where
} }
} }
impl<'a, Message, Renderer> AsRef<dyn Widget<Message, Renderer> + 'a> impl<'a, Message, Renderer> Borrow<dyn Widget<Message, Renderer> + 'a>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
{ {
fn as_ref(&self) -> &(dyn Widget<Message, Renderer> + 'a) { fn borrow(&self) -> &(dyn Widget<Message, Renderer> + 'a) {
self.widget.as_ref() 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()
} }
} }

View file

@ -2,6 +2,7 @@
use crate::Widget; use crate::Widget;
use std::any::{self, Any}; use std::any::{self, Any};
use std::borrow::Borrow;
/// A persistent state widget tree. /// A persistent state widget tree.
/// ///
@ -29,9 +30,9 @@ impl Tree {
/// Creates a new [`Tree`] for the provided [`Element`]. /// Creates a new [`Tree`] for the provided [`Element`].
pub fn new<'a, Message, Renderer>( pub fn new<'a, Message, Renderer>(
widget: impl AsRef<dyn Widget<Message, Renderer> + 'a>, widget: impl Borrow<dyn Widget<Message, Renderer> + 'a>,
) -> Self { ) -> Self {
let widget = widget.as_ref(); let widget = widget.borrow();
Self { Self {
tag: widget.tag(), tag: widget.tag(),
@ -50,10 +51,10 @@ impl Tree {
/// [`Widget::diff`]: crate::Widget::diff /// [`Widget::diff`]: crate::Widget::diff
pub fn diff<'a, Message, Renderer>( pub fn diff<'a, Message, Renderer>(
&mut self, &mut self,
new: impl AsRef<dyn Widget<Message, Renderer> + 'a>, new: impl Borrow<dyn Widget<Message, Renderer> + 'a>,
) { ) {
if self.tag == new.as_ref().tag() { if self.tag == new.borrow().tag() {
new.as_ref().diff(self) new.borrow().diff(self)
} else { } else {
*self = Self::new(new); *self = Self::new(new);
} }
@ -62,12 +63,12 @@ impl Tree {
/// Reconciliates the children of the tree with the provided list of [`Element`]. /// Reconciliates the children of the tree with the provided list of [`Element`].
pub fn diff_children<'a, Message, Renderer>( pub fn diff_children<'a, Message, Renderer>(
&mut self, &mut self,
new_children: &[impl AsRef<dyn Widget<Message, Renderer> + 'a>], new_children: &[impl Borrow<dyn Widget<Message, Renderer> + 'a>],
) { ) {
self.diff_children_custom( self.diff_children_custom(
new_children, new_children,
|tree, widget| Self::diff(tree, widget), |tree, widget| tree.diff(widget.borrow()),
|widget| Self::new(widget), |widget| Self::new(widget.borrow()),
) )
} }