summaryrefslogtreecommitdiffstats
path: root/lazy
diff options
context:
space:
mode:
authorLibravatar Nick Senger <nicks@lich.io>2022-04-17 11:53:59 -0700
committerLibravatar Nick Senger <nicks@lich.io>2022-04-17 11:53:59 -0700
commit572dcaff81c16e3b5b06fb361ea1eed8d963b005 (patch)
treed2ae7a20a164e259fead0ef4abb4c1d57451606e /lazy
parentd23ed0c4e8296687292d3e7f97fdc8707205cefe (diff)
downloadiced-572dcaff81c16e3b5b06fb361ea1eed8d963b005.tar.gz
iced-572dcaff81c16e3b5b06fb361ea1eed8d963b005.tar.bz2
iced-572dcaff81c16e3b5b06fb361ea1eed8d963b005.zip
fix: diff widget tree after local event processing in `Component`
Diffstat (limited to 'lazy')
-rw-r--r--lazy/src/pure/component.rs72
1 files changed, 36 insertions, 36 deletions
diff --git a/lazy/src/pure/component.rs b/lazy/src/pure/component.rs
index 21458c4d..1c8237fc 100644
--- a/lazy/src/pure/component.rs
+++ b/lazy/src/pure/component.rs
@@ -130,21 +130,23 @@ where
Renderer: iced_native::Renderer,
{
fn tag(&self) -> tree::Tag {
- tree::Tag::of::<(S, Tree)>()
+ tree::Tag::of::<S>()
}
fn state(&self) -> tree::State {
- let state = S::default();
- self.rebuild_element(&state);
+ tree::State::new(S::default())
+ }
- tree::State::new((state, self.with_element(Tree::new)))
+ fn children(&self) -> Vec<Tree> {
+ self.rebuild_element(&S::default());
+ self.with_element(|element| vec![Tree::new(element)])
}
fn diff(&self, tree: &mut Tree) {
- let (state, tree) = tree.state.downcast_mut::<(S, Tree)>();
- self.rebuild_element(&state);
-
- self.with_element(|element| tree.diff(element));
+ self.rebuild_element(tree.state.downcast_ref());
+ self.with_element(|element| {
+ tree.diff_children(std::slice::from_ref(&element))
+ })
}
fn width(&self) -> Length {
@@ -178,11 +180,9 @@ where
let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages);
- let (s, tree) = tree.state.downcast_mut::<(S, Tree)>();
-
let event_status = self.with_element_mut(|element| {
element.as_widget_mut().on_event(
- tree,
+ &mut tree.children[0],
event,
layout,
cursor_position,
@@ -197,10 +197,11 @@ where
if !local_messages.is_empty() {
let mut heads = self.state.take().unwrap().into_heads();
- for message in local_messages
- .into_iter()
- .filter_map(|message| heads.component.update(s, message))
- {
+ for message in local_messages.into_iter().filter_map(|message| {
+ heads
+ .component
+ .update(tree.state.downcast_mut::<S>(), message)
+ }) {
shell.publish(message);
}
@@ -209,12 +210,16 @@ where
component: heads.component,
message: PhantomData,
state: PhantomData,
- element_builder: |state| Some(state.view(s)),
+ element_builder: |state| {
+ Some(state.view(tree.state.downcast_ref::<S>()))
+ },
}
.build(),
));
- self.with_element(|element| tree.diff(element));
+ self.with_element(|element| {
+ tree.diff_children(std::slice::from_ref(&element))
+ });
shell.invalidate_layout();
}
@@ -231,11 +236,9 @@ where
cursor_position: Point,
viewport: &Rectangle,
) {
- let (_, tree) = tree.state.downcast_ref::<(S, Tree)>();
-
self.with_element(|element| {
element.as_widget().draw(
- tree,
+ &tree.children[0],
renderer,
style,
layout,
@@ -253,11 +256,9 @@ where
viewport: &Rectangle,
renderer: &Renderer,
) -> mouse::Interaction {
- let (_, tree) = tree.state.downcast_ref::<(S, Tree)>();
-
self.with_element(|element| {
element.as_widget().mouse_interaction(
- tree,
+ &tree.children[0],
layout,
cursor_position,
viewport,
@@ -278,8 +279,6 @@ where
tree,
types: PhantomData,
overlay_builder: |instance, tree| {
- let (_, tree) = tree.state.downcast_mut::<(S, Tree)>();
-
instance
.as_ref()
.unwrap()
@@ -287,7 +286,7 @@ where
.as_ref()
.unwrap()
.as_widget()
- .overlay(tree, layout, renderer)
+ .overlay(&mut tree.children[0], layout, renderer)
},
}
.build();
@@ -433,12 +432,11 @@ where
let overlay = self.overlay.take().unwrap().into_heads();
let mut heads = overlay.instance.state.take().unwrap().into_heads();
- let (s, tree) = overlay.tree.state.downcast_mut::<(S, Tree)>();
-
- for message in local_messages
- .into_iter()
- .filter_map(|message| heads.component.update(s, message))
- {
+ for message in local_messages.into_iter().filter_map(|message| {
+ heads
+ .component
+ .update(overlay.tree.state.downcast_mut::<S>(), message)
+ }) {
shell.publish(message);
}
@@ -447,12 +445,16 @@ where
component: heads.component,
message: PhantomData,
state: PhantomData,
- element_builder: |state| Some(state.view(s)),
+ element_builder: |state| {
+ Some(state.view(overlay.tree.state.downcast_ref::<S>()))
+ },
}
.build(),
);
- overlay.instance.with_element(|element| tree.diff(element));
+ overlay.instance.with_element(|element| {
+ overlay.tree.diff_children(std::slice::from_ref(&element))
+ });
self.overlay = Some(
OverlayBuilder {
@@ -461,8 +463,6 @@ where
tree: overlay.tree,
types: PhantomData,
overlay_builder: |instance, tree| {
- let (_, tree) = tree.state.downcast_mut::<(S, Tree)>();
-
instance
.as_ref()
.unwrap()