ChildBuilder docs improvement (#8371)
# Objective Fixes #7230 ## Solution Documented some side-effects --------- Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com> Co-authored-by: Nicola Papale <nicopap@users.noreply.github.com>
This commit is contained in:
parent
6b774c0fda
commit
15a96adc01
@ -16,6 +16,9 @@ fn push_events(world: &mut World, events: impl IntoIterator<Item = HierarchyEven
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Adds `child` to `parent`'s [`Children`], without checking if it is already present there.
|
||||||
|
///
|
||||||
|
/// This might cause unexpected results when removing duplicate children.
|
||||||
fn push_child_unchecked(world: &mut World, parent: Entity, child: Entity) {
|
fn push_child_unchecked(world: &mut World, parent: Entity, child: Entity) {
|
||||||
let mut parent = world.entity_mut(parent);
|
let mut parent = world.entity_mut(parent);
|
||||||
if let Some(mut children) = parent.get_mut::<Children>() {
|
if let Some(mut children) = parent.get_mut::<Children>() {
|
||||||
@ -25,6 +28,7 @@ fn push_child_unchecked(world: &mut World, parent: Entity, child: Entity) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets [`Parent`] of the `child` to `new_parent`. Inserts [`Parent`] if `child` doesn't have one.
|
||||||
fn update_parent(world: &mut World, child: Entity, new_parent: Entity) -> Option<Entity> {
|
fn update_parent(world: &mut World, child: Entity, new_parent: Entity) -> Option<Entity> {
|
||||||
let mut child = world.entity_mut(child);
|
let mut child = world.entity_mut(child);
|
||||||
if let Some(mut parent) = child.get_mut::<Parent>() {
|
if let Some(mut parent) = child.get_mut::<Parent>() {
|
||||||
@ -113,6 +117,8 @@ fn update_old_parents(world: &mut World, parent: Entity, children: &[Entity]) {
|
|||||||
push_events(world, events);
|
push_events(world, events);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Removes entities in `children` from `parent`'s [`Children`], removing the component if it ends up empty.
|
||||||
|
/// Also removes [`Parent`] component from `children`.
|
||||||
fn remove_children(parent: Entity, children: &[Entity], world: &mut World) {
|
fn remove_children(parent: Entity, children: &[Entity], world: &mut World) {
|
||||||
let mut events: SmallVec<[HierarchyEvent; 8]> = SmallVec::new();
|
let mut events: SmallVec<[HierarchyEvent; 8]> = SmallVec::new();
|
||||||
if let Some(parent_children) = world.get::<Children>(parent) {
|
if let Some(parent_children) = world.get::<Children>(parent) {
|
||||||
@ -143,6 +149,8 @@ fn remove_children(parent: Entity, children: &[Entity], world: &mut World) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Removes all children from `parent` by removing its [`Children`] component, as well as removing
|
||||||
|
/// [`Parent`] component from its children.
|
||||||
fn clear_children(parent: Entity, world: &mut World) {
|
fn clear_children(parent: Entity, world: &mut World) {
|
||||||
if let Some(children) = world.entity_mut(parent).take::<Children>() {
|
if let Some(children) = world.entity_mut(parent).take::<Children>() {
|
||||||
for &child in &children.0 {
|
for &child in &children.0 {
|
||||||
@ -151,12 +159,12 @@ fn clear_children(parent: Entity, world: &mut World) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Command that adds a child to an entity
|
/// Command that adds a child to an entity.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct AddChild {
|
pub struct AddChild {
|
||||||
/// Parent entity to add the child to
|
/// Parent entity to add the child to.
|
||||||
pub parent: Entity,
|
pub parent: Entity,
|
||||||
/// Child entity to add
|
/// Child entity to add.
|
||||||
pub child: Entity,
|
pub child: Entity,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +174,7 @@ impl Command for AddChild {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Command that inserts a child at a given index of a parent's children, shifting following children back
|
/// Command that inserts a child at a given index of a parent's children, shifting following children back.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct InsertChildren {
|
pub struct InsertChildren {
|
||||||
parent: Entity,
|
parent: Entity,
|
||||||
@ -195,7 +203,7 @@ impl Command for PushChildren {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Command that removes children from an entity, and removes that child's parent.
|
/// Command that removes children from an entity, and removes these children's parent.
|
||||||
pub struct RemoveChildren {
|
pub struct RemoveChildren {
|
||||||
parent: Entity,
|
parent: Entity,
|
||||||
children: SmallVec<[Entity; 8]>,
|
children: SmallVec<[Entity; 8]>,
|
||||||
@ -207,7 +215,8 @@ impl Command for RemoveChildren {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Command that clear all children from an entity.
|
/// Command that clears all children from an entity and removes [`Parent`] component from those
|
||||||
|
/// children.
|
||||||
pub struct ClearChildren {
|
pub struct ClearChildren {
|
||||||
parent: Entity,
|
parent: Entity,
|
||||||
}
|
}
|
||||||
@ -218,7 +227,7 @@ impl Command for ClearChildren {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Command that clear all children from an entity. And replace with the given children.
|
/// Command that clear all children from an entity, replacing them with the given children.
|
||||||
pub struct ReplaceChildren {
|
pub struct ReplaceChildren {
|
||||||
parent: Entity,
|
parent: Entity,
|
||||||
children: SmallVec<[Entity; 8]>,
|
children: SmallVec<[Entity; 8]>,
|
||||||
@ -243,42 +252,44 @@ impl Command for RemoveParent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Struct for building children onto an entity
|
/// Struct for building children entities and adding them to a parent 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>,
|
||||||
push_children: PushChildren,
|
push_children: PushChildren,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'w, 's, 'a> ChildBuilder<'w, 's, 'a> {
|
impl<'w, 's, 'a> ChildBuilder<'w, 's, 'a> {
|
||||||
/// Spawns an entity with the given bundle and inserts it into the children defined by the [`ChildBuilder`]
|
/// Spawns an entity with the given bundle and inserts it into the parent entity's [`Children`].
|
||||||
|
/// Also adds [`Parent`] component to the created entity.
|
||||||
pub fn spawn(&mut self, bundle: impl Bundle) -> EntityCommands<'w, 's, '_> {
|
pub fn spawn(&mut self, bundle: impl Bundle) -> EntityCommands<'w, 's, '_> {
|
||||||
let e = self.commands.spawn(bundle);
|
let e = self.commands.spawn(bundle);
|
||||||
self.push_children.children.push(e.id());
|
self.push_children.children.push(e.id());
|
||||||
e
|
e
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Spawns an [`Entity`] with no components and inserts it into the children defined by the [`ChildBuilder`] which adds the [`Parent`] component to it.
|
/// Spawns an [`Entity`] with no components and inserts it into the parent entity's [`Children`].
|
||||||
|
/// Also adds [`Parent`] component to the created entity.
|
||||||
pub fn spawn_empty(&mut self) -> EntityCommands<'w, 's, '_> {
|
pub fn spawn_empty(&mut self) -> EntityCommands<'w, 's, '_> {
|
||||||
let e = self.commands.spawn_empty();
|
let e = self.commands.spawn_empty();
|
||||||
self.push_children.children.push(e.id());
|
self.push_children.children.push(e.id());
|
||||||
e
|
e
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the parent entity of this [`ChildBuilder`]
|
/// Returns the parent entity of this [`ChildBuilder`].
|
||||||
pub fn parent_entity(&self) -> Entity {
|
pub fn parent_entity(&self) -> Entity {
|
||||||
self.push_children.parent
|
self.push_children.parent
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adds a command to this [`ChildBuilder`]
|
/// Adds a command to be executed, like [`Commands::add`].
|
||||||
pub fn add_command<C: Command + 'static>(&mut self, command: C) -> &mut Self {
|
pub fn add_command<C: Command + 'static>(&mut self, command: C) -> &mut Self {
|
||||||
self.commands.add(command);
|
self.commands.add(command);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trait defining how to build children
|
/// Trait for removing, adding and replacing children and parents of an entity.
|
||||||
pub trait BuildChildren {
|
pub trait BuildChildren {
|
||||||
/// Creates a [`ChildBuilder`] with the given children built in the given closure
|
/// Takes a clousre which builds children for this entity using [`ChildBuilder`].
|
||||||
fn with_children(&mut self, f: impl FnOnce(&mut ChildBuilder)) -> &mut Self;
|
fn with_children(&mut self, f: impl FnOnce(&mut ChildBuilder)) -> &mut Self;
|
||||||
/// Pushes children to the back of the builder's children. For any entities that are
|
/// Pushes children to the back of the builder's children. For any entities that are
|
||||||
/// already a child of this one, this method does nothing.
|
/// already a child of this one, this method does nothing.
|
||||||
@ -287,7 +298,7 @@ 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 push_children(&mut self, children: &[Entity]) -> &mut Self;
|
fn push_children(&mut self, children: &[Entity]) -> &mut Self;
|
||||||
/// Inserts children at the given index
|
/// Inserts children at the given index.
|
||||||
///
|
///
|
||||||
/// If the children were previously children of another parent, that parent's [`Children`] component
|
/// If the children were previously children of another parent, that parent's [`Children`] component
|
||||||
/// 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
|
||||||
@ -297,7 +308,7 @@ pub trait BuildChildren {
|
|||||||
///
|
///
|
||||||
/// Removing all children from a parent causes its [`Children`] component to be removed from the entity.
|
/// Removing all children from a parent causes its [`Children`] component to be removed from the entity.
|
||||||
fn remove_children(&mut self, children: &[Entity]) -> &mut Self;
|
fn remove_children(&mut self, children: &[Entity]) -> &mut Self;
|
||||||
/// Adds a single child
|
/// Adds a single child.
|
||||||
///
|
///
|
||||||
/// If the children were previously children of another parent, that parent's [`Children`] component
|
/// If the children were previously children of another parent, that parent's [`Children`] component
|
||||||
/// 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
|
||||||
@ -306,10 +317,19 @@ pub trait BuildChildren {
|
|||||||
/// Removes all children from this entity. The [`Children`] component will be removed if it exists, otherwise this does nothing.
|
/// Removes all children from this entity. The [`Children`] component will be removed if it exists, otherwise this does nothing.
|
||||||
fn clear_children(&mut self) -> &mut Self;
|
fn clear_children(&mut self) -> &mut Self;
|
||||||
/// Removes all current children from this entity, replacing them with the specified list of entities.
|
/// Removes all current children from this entity, replacing them with the specified list of entities.
|
||||||
|
///
|
||||||
|
/// The removed children will have their [`Parent`] component removed.
|
||||||
fn replace_children(&mut self, children: &[Entity]) -> &mut Self;
|
fn replace_children(&mut self, children: &[Entity]) -> &mut Self;
|
||||||
/// Sets the parent of this entity.
|
/// Sets the parent of this entity.
|
||||||
|
///
|
||||||
|
/// If this entity already had a parent, the parent's [`Children`] component will have this
|
||||||
|
/// child removed from its list. Removing all children from a parent causes its [`Children`]
|
||||||
|
/// component to be removed from the entity.
|
||||||
fn set_parent(&mut self, parent: Entity) -> &mut Self;
|
fn set_parent(&mut self, parent: Entity) -> &mut Self;
|
||||||
/// Removes the parent of this entity.
|
/// Removes the [`Parent`] of this entity.
|
||||||
|
///
|
||||||
|
/// Also removes this entity from its parent's [`Children`] component. Removing all children from a parent causes
|
||||||
|
/// its [`Children`] component to be removed from the entity.
|
||||||
fn remove_parent(&mut self) -> &mut Self;
|
fn remove_parent(&mut self) -> &mut Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,7 +412,7 @@ impl<'w, 's, 'a> BuildChildren for EntityCommands<'w, 's, 'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 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.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct WorldChildBuilder<'w> {
|
pub struct WorldChildBuilder<'w> {
|
||||||
world: &'w mut World,
|
world: &'w mut World,
|
||||||
@ -400,7 +420,8 @@ pub struct WorldChildBuilder<'w> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'w> WorldChildBuilder<'w> {
|
impl<'w> WorldChildBuilder<'w> {
|
||||||
/// Spawns an entity with the given bundle and inserts it into the children defined by the [`WorldChildBuilder`]
|
/// Spawns an entity with the given bundle and inserts it into the parent entity's [`Children`].
|
||||||
|
/// Also adds [`Parent`] component to the created entity.
|
||||||
pub fn spawn(&mut self, bundle: impl Bundle + Send + Sync + 'static) -> EntityMut<'_> {
|
pub fn spawn(&mut self, bundle: impl Bundle + Send + Sync + 'static) -> EntityMut<'_> {
|
||||||
let entity = self.world.spawn((bundle, Parent(self.parent))).id();
|
let entity = self.world.spawn((bundle, Parent(self.parent))).id();
|
||||||
push_child_unchecked(self.world, self.parent, entity);
|
push_child_unchecked(self.world, self.parent, entity);
|
||||||
@ -414,7 +435,8 @@ impl<'w> WorldChildBuilder<'w> {
|
|||||||
self.world.entity_mut(entity)
|
self.world.entity_mut(entity)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Spawns an [`Entity`] with no components and inserts it into the children defined by the [`WorldChildBuilder`] which adds the [`Parent`] component to it.
|
/// Spawns an [`Entity`] with no components and inserts it into the parent entity's [`Children`].
|
||||||
|
/// Also adds [`Parent`] component to the created entity.
|
||||||
pub fn spawn_empty(&mut self) -> EntityMut<'_> {
|
pub fn spawn_empty(&mut self) -> EntityMut<'_> {
|
||||||
let entity = self.world.spawn(Parent(self.parent)).id();
|
let entity = self.world.spawn(Parent(self.parent)).id();
|
||||||
push_child_unchecked(self.world, self.parent, entity);
|
push_child_unchecked(self.world, self.parent, entity);
|
||||||
@ -428,37 +450,53 @@ impl<'w> WorldChildBuilder<'w> {
|
|||||||
self.world.entity_mut(entity)
|
self.world.entity_mut(entity)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the parent entity of this [`WorldChildBuilder`]
|
/// Returns the parent entity of this [`WorldChildBuilder`].
|
||||||
pub fn parent_entity(&self) -> Entity {
|
pub fn parent_entity(&self) -> Entity {
|
||||||
self.parent
|
self.parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trait that defines adding children to an entity directly through the [`World`]
|
/// Trait that defines adding, changing and children and parents of an entity directly through the [`World`].
|
||||||
pub trait BuildWorldChildren {
|
pub trait BuildWorldChildren {
|
||||||
/// Creates a [`WorldChildBuilder`] with the given children built in the given closure
|
/// Takes a clousre which builds children for this entity using [`WorldChildBuilder`].
|
||||||
fn with_children(&mut self, spawn_children: impl FnOnce(&mut WorldChildBuilder)) -> &mut Self;
|
fn with_children(&mut self, spawn_children: impl FnOnce(&mut WorldChildBuilder)) -> &mut Self;
|
||||||
|
|
||||||
/// Adds a single child
|
/// Adds a single child.
|
||||||
///
|
///
|
||||||
/// If the children were previously children of another parent, that parent's [`Children`] component
|
/// If the children were previously children of another parent, that parent's [`Children`] component
|
||||||
/// 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;
|
||||||
|
|
||||||
/// Pushes children to the back of the builder's children
|
/// Pushes children to the back of the builder's children. For any entities that are
|
||||||
|
/// already a child of this one, this method does nothing.
|
||||||
|
///
|
||||||
|
/// If the children were previously children of another parent, that parent's [`Children`] component
|
||||||
|
/// will have those children removed from its list. Removing all children from a parent causes its
|
||||||
|
/// [`Children`] component to be removed from the entity.
|
||||||
fn push_children(&mut self, children: &[Entity]) -> &mut Self;
|
fn push_children(&mut self, children: &[Entity]) -> &mut Self;
|
||||||
/// Inserts children at the given index
|
/// Inserts children at the given index.
|
||||||
|
///
|
||||||
|
/// If the children were previously children of another parent, that parent's [`Children`] component
|
||||||
|
/// will have those children removed from its list. Removing all children from a parent causes its
|
||||||
|
/// [`Children`] component to be removed from the entity.
|
||||||
fn insert_children(&mut self, index: usize, children: &[Entity]) -> &mut Self;
|
fn insert_children(&mut self, index: usize, children: &[Entity]) -> &mut Self;
|
||||||
/// Removes the given children
|
/// Removes the given children
|
||||||
|
///
|
||||||
|
/// Removing all children from a parent causes its [`Children`] component to be removed from the entity.
|
||||||
fn remove_children(&mut self, children: &[Entity]) -> &mut Self;
|
fn remove_children(&mut self, children: &[Entity]) -> &mut Self;
|
||||||
|
|
||||||
/// Set the `parent` of this entity. This entity will be added to the end of the `parent`'s list of children.
|
/// Sets the parent of this entity.
|
||||||
///
|
///
|
||||||
/// If this entity already had a parent it will be removed from it.
|
/// If this entity already had a parent, the parent's [`Children`] component will have this
|
||||||
|
/// child removed from its list. Removing all children from a parent causes its [`Children`]
|
||||||
|
/// component to be removed from the entity.
|
||||||
fn set_parent(&mut self, parent: Entity) -> &mut Self;
|
fn set_parent(&mut self, parent: Entity) -> &mut Self;
|
||||||
|
|
||||||
/// Remove the parent from this entity.
|
/// Removes the [`Parent`] of this entity.
|
||||||
|
///
|
||||||
|
/// Also removes this entity from its parent's [`Children`] component. Removing all children from a parent causes
|
||||||
|
/// its [`Children`] component to be removed from the entity.
|
||||||
fn remove_parent(&mut self) -> &mut Self;
|
fn remove_parent(&mut self) -> &mut Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user