gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 1061HTML 997Markdown 12TOML 83120 Definiciones

TaffyTree::set_children: Remove from previous parent (#749)

* TaffyTree::set_children: Remove from previous parent

* added test

---------

Co-authored-by: Nico Burns <nico@nicoburns.com>

f37efc58a41a9d9313e015c3e3d7179162c543b7 · por SpecificProtagonist · (hace 1 año) · padre e20aa214b · ver el árbol en este commit

Delta semántico · 2

src/tree/taffy_tree.rs

1 archivos · +18 −2

diff --git a/src/tree/taffy_tree.rs b/src/tree/taffy_tree.rs
index 481af3d84..732acf99a 100644
--- a/src/tree/taffy_tree.rs
+++ b/src/tree/taffy_tree.rs
@@ -626,8 +626,12 @@ impl<NodeContext> TaffyTree<NodeContext> {
         }
 
         // Build up relation node <-> child
-        for child in children {
-            self.parents[(*child).into()] = Some(parent);
+        for &child in children {
+            // Remove child from previous parent
+            if let Some(previous_parent) = self.parents[child.into()] {
+                self.remove_child(previous_parent, child).unwrap();
+            }
+            self.parents[child.into()] = Some(parent);
         }
 
         let parent_children = &mut self.children[parent_key];
@@ -1234,4 +1238,16 @@ mod tests {
         assert_eq!(layout.location.x, 10f32);
         assert_eq!(layout.location.y, 30f32);
     }
+
+    #[test]
+    fn set_children_reparents() {
+        let mut taffy: TaffyTree<()> = TaffyTree::new();
+        let child = taffy.new_leaf(Style::default()).unwrap();
+        let old_parent = taffy.new_with_children(Style::default(), &[child]).unwrap();
+
+        let new_parent = taffy.new_leaf(Style::default()).unwrap();
+        taffy.set_children(new_parent, &[child]).unwrap();
+
+        assert!(taffy.children(old_parent).unwrap().is_empty());
+    }
 }