Skip to content

Commit cb3cba9

Browse files
authored
can reflect observers (#23797)
# Objective - Reflect observers *so that I can observe my reflection* ## Solution - Reflect observers ## Testing - CI (and followup PR)
1 parent e677bab commit cb3cba9

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

crates/bevy_ecs/src/reflect/event.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@
55
//!
66
//! Same as [`component`](`super::component`), but for events.
77
8-
use crate::{event::Event, reflect::from_reflect_with_fallback, world::World};
8+
use alloc::boxed::Box;
9+
10+
use crate::{
11+
event::Event,
12+
observer::{Observer, On},
13+
reflect::from_reflect_with_fallback,
14+
world::{DeferredWorld, World},
15+
};
916
use bevy_reflect::{FromReflect, FromType, PartialReflect, Reflect, TypePath, TypeRegistry};
1017

1118
/// A struct used to operate on reflected [`Event`] trait of a type.
@@ -37,6 +44,8 @@ pub struct ReflectEvent(ReflectEventFns);
3744
pub struct ReflectEventFns {
3845
/// Function pointer implementing [`ReflectEvent::trigger`].
3946
pub trigger: fn(&mut World, &dyn PartialReflect, &TypeRegistry),
47+
/// Function pointer implementing [`ReflectEvent::create_observer`].
48+
pub create_observer: fn(Box<dyn Fn(&dyn Reflect, DeferredWorld) + Send + Sync>) -> Observer,
4049
}
4150

4251
impl ReflectEventFns {
@@ -59,6 +68,14 @@ impl ReflectEvent {
5968
(self.0.trigger)(world, event, registry);
6069
}
6170

71+
/// Creates an [`Observer`] for this [`Event`] that calls the given callback.
72+
pub fn create_observer(
73+
&self,
74+
callback: Box<dyn Fn(&dyn Reflect, DeferredWorld) + Send + Sync>,
75+
) -> Observer {
76+
(self.0.create_observer)(callback)
77+
}
78+
6279
/// Create a custom implementation of [`ReflectEvent`].
6380
///
6481
/// This is an advanced feature,
@@ -105,6 +122,11 @@ where
105122
let event = from_reflect_with_fallback::<E>(reflected_event, world, registry);
106123
world.trigger(event);
107124
},
125+
create_observer: |callback| {
126+
Observer::new(move |event: On<E>, world: DeferredWorld| {
127+
callback((*event).as_reflect(), world);
128+
})
129+
},
108130
})
109131
}
110132
}

0 commit comments

Comments
 (0)