diff options
author | 2022-04-06 11:50:22 -0700 | |
---|---|---|
committer | 2022-04-06 13:16:23 -0700 | |
commit | e4178c8e4f0fb98d7b939b25a74982fa7f717fba (patch) | |
tree | a1f4835fda84df938b22a0b82f101135dc5b82fb /lazy | |
parent | 5cc1aa31c774894d9a48ee005e857913c9720908 (diff) | |
download | iced-e4178c8e4f0fb98d7b939b25a74982fa7f717fba.tar.gz iced-e4178c8e4f0fb98d7b939b25a74982fa7f717fba.tar.bz2 iced-e4178c8e4f0fb98d7b939b25a74982fa7f717fba.zip |
fix: nested components
Diffstat (limited to 'lazy')
-rw-r--r-- | lazy/src/pure/component.rs | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/lazy/src/pure/component.rs b/lazy/src/pure/component.rs index 4d952f69..bd98aa8c 100644 --- a/lazy/src/pure/component.rs +++ b/lazy/src/pure/component.rs @@ -130,23 +130,24 @@ where Renderer: iced_native::Renderer, { fn tag(&self) -> tree::Tag { - tree::Tag::of::<S>() + tree::Tag::of::<(S, Tree)>() } fn state(&self) -> tree::State { - tree::State::new(S::default()) - } + let state = S::default(); + self.rebuild_element(&state); - fn children(&self) -> Vec<Tree> { - self.rebuild_element(&S::default()); - self.with_element(|element| vec![Tree::new(element)]) + tree::State::new(( + state, + self.with_element(|element| Tree::new(element)), + )) } fn diff(&self, tree: &mut Tree) { - self.rebuild_element(tree.state.downcast_ref()); - self.with_element(|element| { - tree.diff_children(std::slice::from_ref(&element)) - }) + let (state, tree) = tree.state.downcast_mut::<(S, Tree)>(); + self.rebuild_element(&state); + + self.with_element(|element| tree.diff(element)); } fn width(&self) -> Length { @@ -180,9 +181,11 @@ 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( - &mut tree.children[0], + tree, event, layout, cursor_position, @@ -197,11 +200,10 @@ 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(tree.state.downcast_mut::<S>(), message) - }) { + for message in local_messages + .into_iter() + .filter_map(|message| heads.component.update(s, message)) + { shell.publish(message); } @@ -210,13 +212,13 @@ where component: heads.component, message: PhantomData, state: PhantomData, - element_builder: |state| { - Some(state.view(tree.state.downcast_ref::<S>())) - }, + element_builder: |state| Some(state.view(s)), } .build(), )); + self.with_element(|element| tree.diff(element)); + shell.invalidate_layout(); } @@ -232,9 +234,11 @@ where cursor_position: Point, viewport: &Rectangle, ) { + let (_, tree) = tree.state.downcast_ref::<(S, Tree)>(); + self.with_element(|element| { element.as_widget().draw( - &tree.children[0], + tree, renderer, style, layout, @@ -252,9 +256,11 @@ 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.children[0], + tree, layout, cursor_position, viewport, @@ -269,6 +275,8 @@ where layout: Layout<'_>, renderer: &Renderer, ) -> Option<overlay::Element<'b, Message, Renderer>> { + let (_, tree) = tree.state.downcast_mut::<(S, Tree)>(); + let overlay = OverlayBuilder { instance: self, instance_ref_builder: |instance| instance.state.borrow(), @@ -282,7 +290,7 @@ where .as_ref() .unwrap() .as_widget() - .overlay(&mut tree.children[0], layout, renderer) + .overlay(tree, layout, renderer) }, } .build(); |