use crate::component::Clear;
use crate::event::EventManager;
use crate::object::{Context, Factory, Tree};
use crate::scene::event::{Event};
use crate::scene::EventInfo;
pub struct Common<C: Context>
{
pub component_manager: C::ComponentManager,
pub event_manager: EventManager<C::Event>,
pub system_event_manager: EventManager<Event<C>>,
pub tree: Tree
}
impl<C: Context> crate::system::Context for Common<C>
{
type AppState = C::AppState;
type ComponentManager = C::ComponentManager;
type Event = C::Event;
fn components(&self) -> &Self::ComponentManager {
return &self.component_manager;
}
fn components_mut(&mut self) -> &mut Self::ComponentManager {
return &mut self.component_manager;
}
fn event_manager(&mut self) -> &mut EventManager<Self::Event> {
return &mut self.event_manager;
}
fn objects(&self) -> &Tree {
return &self.tree;
}
fn enable_object(&mut self, info: EventInfo, enable: bool) {
let ty = super::event::Type::EnableObject(enable);
self.system_event_manager.send(info.into_event(ty));
}
}
pub struct State<E, S, CM: Clear, SM> {
pub common: Common<Self>,
pub systems: SM
}
impl<E, S, CM: Clear, SM> crate::system::Context for State<E, S, CM, SM> {
type AppState = S;
type ComponentManager = CM;
type Event = E;
fn components(&self) -> &Self::ComponentManager {
return &self.common.component_manager;
}
fn components_mut(&mut self) -> &mut Self::ComponentManager {
return &mut self.common.component_manager;
}
fn event_manager(&mut self) -> &mut EventManager<Self::Event> {
return &mut self.common.event_manager;
}
fn objects(&self) -> &Tree {
return &self.common.tree;
}
fn enable_object(&mut self, info: EventInfo, enable: bool) {
self.common.enable_object(info, enable)
}
}
impl<E, S, CM: Clear, SM> Context for State<E, S, CM, SM>
{
type SystemManager = SM;
fn systems(&self) -> &Self::SystemManager {
return &self.systems;
}
fn systems_mut(&mut self) -> &mut Self::SystemManager {
return &mut self.systems;
}
fn remove_object(&mut self, info: EventInfo) {
let ty = super::event::Type::RemoveObject;
self.common.system_event_manager.send(info.into_event(ty));
}
fn spawn_object(&mut self, info: EventInfo, factory: Factory<Self>) {
let ty = super::event::Type::SpawnObject(factory);
self.common.system_event_manager.send(info.into_event(ty));
}
}