From da62e857313f5d0f693735823af2ceb89d4f963e Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 9 Feb 2023 13:55:45 -0600 Subject: [PATCH] move clone method to nodemut --- packages/native-core/src/dioxus.rs | 2 +- packages/native-core/src/real_dom.rs | 30 ++++++++++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/native-core/src/dioxus.rs b/packages/native-core/src/dioxus.rs index fa7ca4802..5760d9d2e 100644 --- a/packages/native-core/src/dioxus.rs +++ b/packages/native-core/src/dioxus.rs @@ -111,7 +111,7 @@ impl DioxusState { } LoadTemplate { name, index, id } => { let template_id = self.templates[name][index]; - let clone_id = rdom.clone_node(template_id); + let clone_id = rdom.get_mut(template_id).unwrap().clone_node(); let clone = rdom.get_mut(clone_id).unwrap(); self.set_element_id(clone, id); self.stack.push(clone_id); diff --git a/packages/native-core/src/real_dom.rs b/packages/native-core/src/real_dom.rs index 6cbedd90e..ac9d5385f 100644 --- a/packages/native-core/src/real_dom.rs +++ b/packages/native-core/src/real_dom.rs @@ -163,19 +163,6 @@ impl RealDom { self.tree.root() } - pub fn clone_node(&mut self, node_id: NodeId) -> NodeId { - let node = self.get(node_id).unwrap(); - let new_node = node.node_type().clone(); - let new_id = self.create_node(new_node).id(); - - let children = self.tree.children_ids(node_id).unwrap().to_vec(); - for child in children { - let child_id = self.clone_node(child); - self.get_mut(new_id).unwrap().add_child(child_id); - } - new_id - } - pub fn get(&self, id: NodeId) -> Option> { self.tree.contains(id).then_some(NodeRef { id, dom: self }) } @@ -630,6 +617,23 @@ impl<'a, V: FromAnyValue + Send + Sync> NodeMut<'a, V> { .dirty_nodes .mark_dirty(self.id, NodeMaskBuilder::ALL.build()) } + + #[inline] + pub fn clone_node(&mut self) -> NodeId { + let new_node = self.node_type().clone(); + let rdom = self.real_dom_mut(); + let new_id = rdom.create_node(new_node).id(); + + if let Some(children) = self.child_ids() { + let children = children.to_vec(); + let rdom = self.real_dom_mut(); + for child in children { + let child_id = rdom.get_mut(child).unwrap().clone_node(); + rdom.get_mut(new_id).unwrap().add_child(child_id); + } + } + new_id + } } pub enum NodeTypeMut<'a, V: FromAnyValue + Send + Sync = ()> {