use crate::*;
#[derive(Event, Debug, Clone, PartialEq, Eq)]
pub struct UiClickEvent {
pub target: Entity,
}
#[derive(Event, Debug, Clone, PartialEq, Eq)]
pub struct UiChangeEvent {
pub target: Entity,
pub value: String,
}
#[derive(Component, Debug, Clone, PartialEq, Eq)]
pub struct UiClickEmitter {
pub target: Option<Entity>,
}
impl UiClickEmitter {
pub const SELF: UiClickEmitter = UiClickEmitter { target: None };
pub fn new(entity: Entity) -> Self {
UiClickEmitter {
target: Some(entity)
}
}
}
fn ui_click_emitter_system(mut events: EventReader<Pointer<Down>>, mut write: EventWriter<UiClickEvent>, query: Query<(&UiClickEmitter, Entity)>) {
for event in events.read() {
if let Ok((emitter, entity)) = query.get(event.target) {
write.send(UiClickEvent {
target: if let Some(e) = emitter.target { e } else { entity },
});
}
}
}
#[derive(Component, Clone, PartialEq, Eq)]
pub struct OnUiClickCommands {
pub closure: fn(&mut Commands),
}
impl OnUiClickCommands {
pub fn new(closure: fn(&mut Commands)) -> Self {
OnUiClickCommands {
closure,
}
}
}
fn on_ui_click_commands_system(mut events: EventReader<UiClickEvent>, mut commands: Commands, query: Query<&OnUiClickCommands>) {
for event in events.read() {
if let Ok(listener) = query.get(event.target) {
(listener.closure)(&mut commands);
}
}
}
#[derive(Component, Debug, Clone, PartialEq, Eq)]
pub struct OnUiClickDespawn {
pub target: Option<Entity>,
}
impl OnUiClickDespawn {
pub const SELF: OnUiClickDespawn = OnUiClickDespawn { target: None };
pub fn new(entity: Entity) -> Self {
OnUiClickDespawn {
target: Some(entity)
}
}
}
fn on_ui_click_despawn_system(mut events: EventReader<UiClickEvent>, mut commands: Commands, query: Query<(&OnUiClickDespawn, Entity)>) {
for event in events.read() {
if let Ok((listener, entity)) = query.get(event.target) {
commands.entity(if let Some(e) = listener.target { e } else { entity }).despawn_recursive();
}
}
}
pub struct CorePlugin;
impl Plugin for CorePlugin {
fn build(&self, app: &mut App) {
app
.add_event::<UiClickEvent>()
.add_systems(Update, ui_click_emitter_system.run_if(on_event::<Pointer<Down>>()))
.add_event::<UiChangeEvent>()
.add_systems(Update, on_ui_click_commands_system.run_if(on_event::<UiClickEvent>()))
.add_systems(Update, on_ui_click_despawn_system.run_if(on_event::<UiClickEvent>()));
}
}