diff options
author | 2022-04-17 11:53:59 -0700 | |
---|---|---|
committer | 2022-04-17 11:53:59 -0700 | |
commit | 572dcaff81c16e3b5b06fb361ea1eed8d963b005 (patch) | |
tree | d2ae7a20a164e259fead0ef4abb4c1d57451606e /lazy | |
parent | d23ed0c4e8296687292d3e7f97fdc8707205cefe (diff) | |
download | iced-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.rs | 72 |
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() |