use crate::page::Page;
use bevy::asset::{Assets, Handle};
use bevy::prelude::{AssetServer, Commands, Entity, Event, On, Res, ResMut, Resource};
pub(crate) fn spawn_page(
mut commands: Commands,
mut spawner: ResMut<PageSpawner>,
server: Res<AssetServer>,
mut assets: ResMut<Assets<Page>>,
) {
if let Some(handle) = &spawner.handle
&& let Some(mut page) = assets.remove(handle)
{
let entity = page.spawn(&mut commands, &server);
commands.insert_resource(page);
spawner.handle = None;
spawner.spawned = Some(entity);
commands.trigger(SpawnPage);
}
}
pub(crate) fn despawn_page(
_: On<DespawnPage>,
mut commands: Commands,
mut spawner: ResMut<PageSpawner>,
) {
if let Some(entity) = spawner.spawned {
commands.entity(entity).despawn();
commands.remove_resource::<Page>();
spawner.spawned = None;
}
}
#[derive(Resource)]
pub struct PageSpawner {
handle: Option<Handle<Page>>,
spawned: Option<Entity>,
}
impl PageSpawner {
pub(crate) fn new() -> Self {
Self {
handle: None,
spawned: None,
}
}
pub fn spawn(&mut self, handle: Handle<Page>) {
self.handle = Some(handle);
}
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;