Implement SpawnableList for Vec<Bundle> (#18259)

# Objective

In updating examples to use the Improved Spawning API I got tripped up
on being able to spawn children with a Vec. I eventually figured out
that I could use `Children::spawn(SpawnIter(my_vec.into_iter()))` but
thought there might be a more ergonomic way to approach it. After
tinkering with it for a while I came up with the implementation here. It
allows authors to use `Children::spawn(my_vec)` as an equivalent
implementation.

## Solution

- Implements `<R: Relationship, B: Bundle SpawnableList<R> for Vec<B>`
- uses `alloc::vec::Vec` for compatibility with `no_std` (`std::Vec`
also inherits implementations against the `alloc::vec::Vec` because std
is a re-export of the alloc struct, thanks @bushrat011899 for the info
on this!)

## Testing

- Did you test these changes? If so, how?
- Opened the examples before and after and verified the same behavior
was observed. I did this on Ubuntu 24.04.2 LTS using `--features
wayland`.
- Are there any parts that need more testing?
- Other OS's and features can't hurt, but this is such a small change it
shouldn't be a problem.
- How can other people (reviewers) test your changes? Is there anything
specific they need to know?
  - Run the examples yourself with and without these changes.
- If relevant, what platforms did you test these changes on, and are
there any important ones you can't test?
  - see above

## Showcase

n/a

## Migration Guide

- Optional: you may use the new API to spawn `Vec`s of `Bundle` instead
of using the `SpawnIter` approach.
This commit is contained in:
krunchington 2025-03-11 13:32:37 -07:00 committed by GitHub
parent 949d7811cd
commit f1331069e7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 16 deletions

View File

@ -2,11 +2,12 @@
//! for the best entry points into these APIs and examples of how to use them. //! for the best entry points into these APIs and examples of how to use them.
use crate::{ use crate::{
bundle::{Bundle, BundleEffect, DynamicBundle}, bundle::{Bundle, BundleEffect, DynamicBundle, NoBundleEffect},
entity::Entity, entity::Entity,
relationship::{RelatedSpawner, Relationship, RelationshipTarget}, relationship::{RelatedSpawner, Relationship, RelationshipTarget},
world::{EntityWorldMut, World}, world::{EntityWorldMut, World},
}; };
use alloc::vec::Vec;
use core::marker::PhantomData; use core::marker::PhantomData;
use variadics_please::all_tuples; use variadics_please::all_tuples;
@ -45,6 +46,17 @@ pub trait SpawnableList<R> {
fn size_hint(&self) -> usize; fn size_hint(&self) -> usize;
} }
impl<R: Relationship, B: Bundle<Effect: NoBundleEffect>> SpawnableList<R> for Vec<B> {
fn spawn(self, world: &mut World, entity: Entity) {
let mapped_bundles = self.into_iter().map(|b| (R::from(entity), b));
world.spawn_batch(mapped_bundles);
}
fn size_hint(&self) -> usize {
self.len()
}
}
impl<R: Relationship, B: Bundle> SpawnableList<R> for Spawn<B> { impl<R: Relationship, B: Bundle> SpawnableList<R> for Spawn<B> {
fn spawn(self, world: &mut World, entity: Entity) { fn spawn(self, world: &mut World, entity: Entity) {
world.spawn((R::from(entity), self.0)); world.spawn((R::from(entity), self.0));

View File

@ -273,21 +273,16 @@ fn detect_morphs(
|(i, target): (usize, &Target)| target.text_span(AVAILABLE_KEYS[i].name, style.clone()); |(i, target): (usize, &Target)| target.text_span(AVAILABLE_KEYS[i].name, style.clone());
spans.extend(detected.iter().enumerate().map(target_to_text)); spans.extend(detected.iter().enumerate().map(target_to_text));
commands.insert_resource(WeightsControl { weights: detected }); commands.insert_resource(WeightsControl { weights: detected });
commands commands.spawn((
.spawn(( Text::default(),
Text::default(), Node {
Node { position_type: PositionType::Absolute,
position_type: PositionType::Absolute, top: Val::Px(12.0),
top: Val::Px(12.0), left: Val::Px(12.0),
left: Val::Px(12.0), ..default()
..default() },
}, Children::spawn(spans),
)) ));
.with_children(|p| {
for span in spans {
p.spawn(span);
}
});
} }
pub struct MorphViewerPlugin; pub struct MorphViewerPlugin;