use crate::page::Page;
use bevy::asset::{Assets, Handle};
use bevy::prelude::{Commands, Entity, Event, On, ResMut, Resource, World};
pub(crate) fn spawn_page(world: &mut World) {
let handle = world.resource_mut::<PageSpawner>().handle.take();
if let Some(handle) = handle
&& let Some(mut page) = world.resource_mut::<Assets<Page>>().remove(&handle)
{
let entity = page.spawn(world);
world.insert_resource(page);
world.resource_mut::<PageSpawner>().spawned = Some(entity);
world.trigger(SpawnPage);
}
}
pub(crate) fn despawn_page(
_: On<DespawnPage>,
mut commands: Commands,
mut spawner: ResMut<PageSpawner>,
) {
let spawned = spawner.spawned.take();
if let Some(entity) = spawned {
commands.entity(entity).despawn();
commands.remove_resource::<Page>();
}
}
#[derive(Resource)]
pub struct PageSpawner {
handle: Option<Handle<Page>>,
spawned: Option<Entity>,
}
impl PageSpawner {
#[inline(always)]
pub(crate) fn new() -> Self {
Self {
handle: None,
spawned: None,
}
}
#[inline(always)]
pub fn spawn(&mut self, handle: Handle<Page>) {
self.handle = Some(handle);
}
#[inline(always)]
pub fn despawn(&mut self, commands: &mut Commands) {
commands.trigger(DespawnPage);
}
}
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Event)]
pub struct SpawnPage;
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Event)]
pub struct DespawnPage;