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.
|
//! 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));
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user