Add set_parent and remove_parent to EntityCommands (#6189)
				
					
				
			I found myself doing ```rust let child = commands.spawn(..).id(); commands.entity(parent).add_child(child); ``` When that could just be ```rust commands.spawn(..).set_parent(parent); ``` Adding `set_parent` was trivial as it's just an `AddChild` command. Most of the changes are for `remove_parent`. Also updated some outdated docs. Co-authored-by: devil-ira <justthecooldude@gmail.com>
This commit is contained in:
		
							parent
							
								
									f7d3fbc7d5
								
							
						
					
					
						commit
						c9ec5c771a
					
				@ -155,7 +155,7 @@ impl Command for InsertChildren {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Command that pushes children to the end of the entity's children
 | 
					/// Command that pushes children to the end of the entity's [`Children`].
 | 
				
			||||||
#[derive(Debug)]
 | 
					#[derive(Debug)]
 | 
				
			||||||
pub struct PushChildren {
 | 
					pub struct PushChildren {
 | 
				
			||||||
    parent: Entity,
 | 
					    parent: Entity,
 | 
				
			||||||
@ -175,7 +175,7 @@ impl Command for PushChildren {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Command that removes children from an entity, and removes that child's parent and inserts it into the previous parent component
 | 
					/// Command that removes children from an entity, and removes that child's parent.
 | 
				
			||||||
pub struct RemoveChildren {
 | 
					pub struct RemoveChildren {
 | 
				
			||||||
    parent: Entity,
 | 
					    parent: Entity,
 | 
				
			||||||
    children: SmallVec<[Entity; 8]>,
 | 
					    children: SmallVec<[Entity; 8]>,
 | 
				
			||||||
@ -187,6 +187,27 @@ impl Command for RemoveChildren {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Command that removes the parent of an entity, and removes that entity from the parent's [`Children`].
 | 
				
			||||||
 | 
					pub struct RemoveParent {
 | 
				
			||||||
 | 
					    child: Entity,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Command for RemoveParent {
 | 
				
			||||||
 | 
					    fn write(self, world: &mut World) {
 | 
				
			||||||
 | 
					        if let Some(parent) = world.get::<Parent>(self.child) {
 | 
				
			||||||
 | 
					            let parent_entity = parent.get();
 | 
				
			||||||
 | 
					            remove_from_children(world, parent_entity, self.child);
 | 
				
			||||||
 | 
					            world.entity_mut(self.child).remove::<Parent>();
 | 
				
			||||||
 | 
					            if let Some(mut events) = world.get_resource_mut::<Events<_>>() {
 | 
				
			||||||
 | 
					                events.send(HierarchyEvent::ChildRemoved {
 | 
				
			||||||
 | 
					                    child: self.child,
 | 
				
			||||||
 | 
					                    parent: parent_entity,
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Struct for building children onto an entity
 | 
					/// Struct for building children onto an entity
 | 
				
			||||||
pub struct ChildBuilder<'w, 's, 'a> {
 | 
					pub struct ChildBuilder<'w, 's, 'a> {
 | 
				
			||||||
    commands: &'a mut Commands<'w, 's>,
 | 
					    commands: &'a mut Commands<'w, 's>,
 | 
				
			||||||
@ -288,6 +309,10 @@ pub trait BuildChildren {
 | 
				
			|||||||
    /// will have those children removed from its list. Removing all children from a parent causes its
 | 
					    /// will have those children removed from its list. Removing all children from a parent causes its
 | 
				
			||||||
    /// [`Children`] component to be removed from the entity.
 | 
					    /// [`Children`] component to be removed from the entity.
 | 
				
			||||||
    fn add_child(&mut self, child: Entity) -> &mut Self;
 | 
					    fn add_child(&mut self, child: Entity) -> &mut Self;
 | 
				
			||||||
 | 
					    /// Sets the parent of this entity.
 | 
				
			||||||
 | 
					    fn set_parent(&mut self, parent: Entity) -> &mut Self;
 | 
				
			||||||
 | 
					    /// Removes the parent of this entity.
 | 
				
			||||||
 | 
					    fn remove_parent(&mut self) -> &mut Self;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<'w, 's, 'a> BuildChildren for EntityCommands<'w, 's, 'a> {
 | 
					impl<'w, 's, 'a> BuildChildren for EntityCommands<'w, 's, 'a> {
 | 
				
			||||||
@ -346,6 +371,18 @@ impl<'w, 's, 'a> BuildChildren for EntityCommands<'w, 's, 'a> {
 | 
				
			|||||||
        self.commands().add(AddChild { child, parent });
 | 
					        self.commands().add(AddChild { child, parent });
 | 
				
			||||||
        self
 | 
					        self
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn set_parent(&mut self, parent: Entity) -> &mut Self {
 | 
				
			||||||
 | 
					        let child = self.id();
 | 
				
			||||||
 | 
					        self.commands().add(AddChild { child, parent });
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn remove_parent(&mut self) -> &mut Self {
 | 
				
			||||||
 | 
					        let child = self.id();
 | 
				
			||||||
 | 
					        self.commands().add(RemoveParent { child });
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Struct for adding children to an entity directly through the [`World`] for use in exclusive systems
 | 
					/// Struct for adding children to an entity directly through the [`World`] for use in exclusive systems
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user