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+ } ;
916use 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);
3744pub 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
4251impl 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