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:
parent
949d7811cd
commit
f1331069e7
@ -2,11 +2,12 @@
|
||||
//! for the best entry points into these APIs and examples of how to use them.
|
||||
|
||||
use crate::{
|
||||
bundle::{Bundle, BundleEffect, DynamicBundle},
|
||||
bundle::{Bundle, BundleEffect, DynamicBundle, NoBundleEffect},
|
||||
entity::Entity,
|
||||
relationship::{RelatedSpawner, Relationship, RelationshipTarget},
|
||||
world::{EntityWorldMut, World},
|
||||
};
|
||||
use alloc::vec::Vec;
|
||||
use core::marker::PhantomData;
|
||||
use variadics_please::all_tuples;
|
||||
|
||||
@ -45,6 +46,17 @@ pub trait SpawnableList<R> {
|
||||
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> {
|
||||
fn spawn(self, world: &mut World, entity: Entity) {
|
||||
world.spawn((R::from(entity), self.0));
|
||||
|
@ -273,21 +273,16 @@ fn detect_morphs(
|
||||
|(i, target): (usize, &Target)| target.text_span(AVAILABLE_KEYS[i].name, style.clone());
|
||||
spans.extend(detected.iter().enumerate().map(target_to_text));
|
||||
commands.insert_resource(WeightsControl { weights: detected });
|
||||
commands
|
||||
.spawn((
|
||||
Text::default(),
|
||||
Node {
|
||||
position_type: PositionType::Absolute,
|
||||
top: Val::Px(12.0),
|
||||
left: Val::Px(12.0),
|
||||
..default()
|
||||
},
|
||||
))
|
||||
.with_children(|p| {
|
||||
for span in spans {
|
||||
p.spawn(span);
|
||||
}
|
||||
});
|
||||
commands.spawn((
|
||||
Text::default(),
|
||||
Node {
|
||||
position_type: PositionType::Absolute,
|
||||
top: Val::Px(12.0),
|
||||
left: Val::Px(12.0),
|
||||
..default()
|
||||
},
|
||||
Children::spawn(spans),
|
||||
));
|
||||
}
|
||||
|
||||
pub struct MorphViewerPlugin;
|
||||
|
Loading…
Reference in New Issue
Block a user