use bevy::prelude::*;
use crate::prelude::*;
use crate::sickle::*;
pub trait NodeSpawningExt
{
fn spawn_scene_node(
&mut self,
scene_ref: SceneRef,
callback: impl FnOnce(&mut UiBuilder<Entity>, SceneRef),
) -> UiBuilder<Entity>;
}
impl NodeSpawningExt for UiBuilder<'_, UiRoot>
{
fn spawn_scene_node(
&mut self,
scene_ref: SceneRef,
callback: impl FnOnce(&mut UiBuilder<Entity>, SceneRef),
) -> UiBuilder<Entity>
{
let mut node = self.spawn(Node::default());
node.entity_commands().build(scene_ref.clone());
(callback)(&mut node, scene_ref);
node
}
}
impl NodeSpawningExt for UiBuilder<'_, Entity>
{
fn spawn_scene_node(
&mut self,
scene_ref: SceneRef,
callback: impl FnOnce(&mut UiBuilder<Entity>, SceneRef),
) -> UiBuilder<Entity>
{
let id = self.id();
if self.commands().get_entity(id).is_err() {
return self.reborrow();
}
let mut child = self.spawn(Node::default());
child.entity_commands().build(scene_ref.clone());
(callback)(&mut child, scene_ref);
let id = self.id();
self.commands().ui_builder(id)
}
}
pub trait ControlBuilderExt
{
fn edit_control_child(
&mut self,
child: &'static str,
callback: impl FnOnce(&mut Commands, Entity, Entity) + Send + Sync + 'static,
) -> &mut Self;
}
impl ControlBuilderExt for UiBuilder<'_, Entity>
{
fn edit_control_child(
&mut self,
child: &'static str,
callback: impl FnOnce(&mut Commands, Entity, Entity) + Send + Sync + 'static,
) -> &mut Self
{
let entity = self.id();
self.commands().queue(move |world: &mut World| {
let Some(control_map) = world.get::<ControlMap>(entity) else {
tracing::warn!(
"failed editing child {child} of entity {entity:?}, \
entity is missing or does not have ControlMap (see ControlRoot)"
);
return;
};
let Some(child_entity) = control_map.get_entity(child) else {
tracing::warn!(
"failed editing child {child} of entity {entity:?}, \
entity's ControlMap does not have an entry for {child} (see ControlMember)"
);
return;
};
let mut c = world.commands();
(callback)(&mut c, entity, child_entity);
world.flush();
});
self
}
}