use crate::{
change_detection::MaybeLocation,
event::{Event, EventKey, EventPattern, EventPatternTrigger, PropagateEntityTrigger},
prelude::*,
traversal::Traversal,
};
use bevy_ptr::Ptr;
use core::{
fmt::Debug,
ops::{Deref, DerefMut},
};
pub struct On<'w, 't, E: EventPattern> {
observer: Entity,
event: &'w mut E::Event,
trigger: &'w mut EventPatternTrigger<'t, E>,
trigger_context: &'w TriggerContext,
}
impl<'w, 't, E: EventPattern> On<'w, 't, E> {
pub fn new(
event: &'w mut E::Event,
observer: Entity,
trigger: &'w mut EventPatternTrigger<'t, E>,
trigger_context: &'w TriggerContext,
) -> Self {
Self {
event,
observer,
trigger,
trigger_context,
}
}
pub fn event_key(&self) -> EventKey {
self.trigger_context.event_key
}
pub fn event(&self) -> &E::Event {
self.event
}
pub fn event_mut(&mut self) -> &mut E::Event {
self.event
}
pub fn event_ptr(&self) -> Ptr<'_> {
Ptr::from(&self.event)
}
pub fn trigger(&self) -> &EventPatternTrigger<'t, E> {
self.trigger
}
pub fn trigger_mut(&mut self) -> &mut EventPatternTrigger<'t, E> {
self.trigger
}
pub fn observer(&self) -> Entity {
self.observer
}
pub fn caller(&self) -> MaybeLocation {
self.trigger_context.caller
}
}
impl<'w, 't, const AUTO_PROPAGATE: bool, E, T> On<'w, 't, E>
where
E: EventPattern<
Event: EntityEvent<Trigger<'t> = PropagateEntityTrigger<AUTO_PROPAGATE, E::Event, T>>,
>,
T: Traversal<E::Event>,
{
pub fn original_event_target(&self) -> Entity {
self.trigger.original_event_target
}
pub fn propagate(&mut self, should_propagate: bool) {
self.trigger.propagate = should_propagate;
}
pub fn get_propagate(&self) -> bool {
self.trigger.propagate
}
}
impl<'w, 't, E> Debug for On<'w, 't, E>
where
E: EventPattern,
E::Event: Event<Trigger<'t>: Debug> + Debug,
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("On")
.field("event", &self.event)
.field("trigger", &self.trigger)
.finish()
}
}
impl<'w, 't, E: EventPattern> Deref for On<'w, 't, E> {
type Target = E::Event;
fn deref(&self) -> &Self::Target {
self.event
}
}
impl<'w, 't, E: EventPattern> DerefMut for On<'w, 't, E> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.event
}
}
pub struct TriggerContext {
pub event_key: EventKey,
pub caller: MaybeLocation,
}