Browse Source

move clone method to nodemut

Evan Almloff 2 years ago
parent
commit
da62e85731
2 changed files with 18 additions and 14 deletions
  1. 1 1
      packages/native-core/src/dioxus.rs
  2. 17 13
      packages/native-core/src/real_dom.rs

+ 1 - 1
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);

+ 17 - 13
packages/native-core/src/real_dom.rs

@@ -163,19 +163,6 @@ impl<V: FromAnyValue + Send + Sync> RealDom<V> {
         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<NodeRef<'_, V>> {
         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 = ()> {