use crate::components::{Style, Node, BackgroundColor, Interaction};
#[derive(Default)]
pub struct NodeBundle {
pub style: Style,
pub node: Node,
pub background_color: BackgroundColor,
}
impl gizmo_core::component::Bundle for NodeBundle {
fn get_infos() -> Vec<gizmo_core::archetype::ComponentInfo> {
vec![
gizmo_core::archetype::ComponentInfo::of::<Style>(),
gizmo_core::archetype::ComponentInfo::of::<Node>(),
gizmo_core::archetype::ComponentInfo::of::<BackgroundColor>(),
]
}
fn apply(self, world: &mut gizmo_core::world::World, entity: gizmo_core::entity::Entity) {
world.add_component(entity, self.style);
world.add_component(entity, self.node);
world.add_component(entity, self.background_color);
}
unsafe fn write_to_archetype(
self,
arch: &mut gizmo_core::archetype::Archetype,
row: usize,
tick: u32,
) {
self.style.write_to_archetype(arch, row, tick);
self.node.write_to_archetype(arch, row, tick);
self.background_color.write_to_archetype(arch, row, tick);
}
}
#[derive(Default)]
pub struct ButtonBundle {
pub style: Style,
pub node: Node,
pub background_color: BackgroundColor,
pub interaction: Interaction,
}
impl gizmo_core::component::Bundle for ButtonBundle {
fn get_infos() -> Vec<gizmo_core::archetype::ComponentInfo> {
vec![
gizmo_core::archetype::ComponentInfo::of::<Style>(),
gizmo_core::archetype::ComponentInfo::of::<Node>(),
gizmo_core::archetype::ComponentInfo::of::<BackgroundColor>(),
gizmo_core::archetype::ComponentInfo::of::<Interaction>(),
]
}
fn apply(self, world: &mut gizmo_core::world::World, entity: gizmo_core::entity::Entity) {
world.add_component(entity, self.style);
world.add_component(entity, self.node);
world.add_component(entity, self.background_color);
world.add_component(entity, self.interaction);
}
unsafe fn write_to_archetype(
self,
arch: &mut gizmo_core::archetype::Archetype,
row: usize,
tick: u32,
) {
self.style.write_to_archetype(arch, row, tick);
self.node.write_to_archetype(arch, row, tick);
self.background_color.write_to_archetype(arch, row, tick);
self.interaction.write_to_archetype(arch, row, tick);
}
}
#[cfg(test)]
mod tests {
use super::*;
use gizmo_core::component::Bundle;
use gizmo_core::world::World;
use gizmo_math::Vec4;
fn register_ui(world: &mut World) {
world.register_component_type::<Style>();
world.register_component_type::<Node>();
world.register_component_type::<BackgroundColor>();
world.register_component_type::<Interaction>();
}
#[test]
fn node_bundle_attaches_only_the_visual_components() {
let mut world = World::new();
register_ui(&mut world);
let e = world.spawn();
NodeBundle::default().apply(&mut world, e);
assert!(world.borrow::<Style>().get(e.id()).is_some());
assert!(world.borrow::<Node>().get(e.id()).is_some());
assert!(world.borrow::<BackgroundColor>().get(e.id()).is_some());
assert!(world.borrow::<Interaction>().get(e.id()).is_none());
assert_eq!(NodeBundle::get_infos().len(), 3);
}
#[test]
fn button_bundle_adds_interaction_with_sane_defaults() {
let mut world = World::new();
register_ui(&mut world);
let e = world.spawn();
ButtonBundle::default().apply(&mut world, e);
assert!(world.borrow::<Style>().get(e.id()).is_some());
assert!(world.borrow::<Node>().get(e.id()).is_some());
assert_eq!(*world.borrow::<Interaction>().get(e.id()).unwrap(), Interaction::None);
let bg = *world.borrow::<BackgroundColor>().get(e.id()).unwrap();
assert_eq!(bg.0, Vec4::new(1.0, 1.0, 1.0, 1.0));
assert_eq!(ButtonBundle::get_infos().len(), 4);
assert_eq!(ButtonBundle::get_infos().len(), NodeBundle::get_infos().len() + 1);
}
}