@@ -9,7 +9,7 @@ use anathema_templates::blueprints::Blueprint;
99use anathema_templates:: { Document , Globals } ;
1010use anathema_value_resolver:: { AttributeStorage , Scope } ;
1111use anathema_widgets:: components:: deferred:: { CommandKind , DeferredComponents } ;
12- use anathema_widgets:: components:: events:: Event ;
12+ use anathema_widgets:: components:: events:: ComponentEvent ;
1313use anathema_widgets:: components:: {
1414 AnyComponentContext , AssociatedEvents , ComponentKind , ComponentRegistry , Emitter , ViewMessage ,
1515} ;
@@ -230,7 +230,7 @@ pub struct Frame<'rt, 'bp, G> {
230230}
231231
232232impl < ' rt , ' bp , G : GlobalEventHandler > Frame < ' rt , ' bp , G > {
233- pub fn handle_global_event ( & mut self , event : Event ) -> Option < Event > {
233+ pub fn handle_global_event ( & mut self , event : ComponentEvent ) -> Option < ComponentEvent > {
234234 let mut changed = false ;
235235 let mut tabindex = TabIndex :: new ( & mut self . tabindex , self . tree . view_mut ( ) , & mut changed) ;
236236
@@ -257,21 +257,21 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
257257 event
258258 }
259259
260- pub fn event ( & mut self , event : Event ) {
260+ pub fn event ( & mut self , event : ComponentEvent ) {
261261 #[ cfg( feature = "profile" ) ]
262262 puffin:: profile_function!( ) ;
263263
264264 let Some ( event) = self . handle_global_event ( event) else { return } ;
265- if let Event :: Stop = event {
265+ if let ComponentEvent :: Stop = event {
266266 self . stop = true ;
267267 return ;
268268 }
269269
270270 match event {
271- Event :: Noop => return ,
272- Event :: Stop => todo ! ( ) ,
271+ ComponentEvent :: Noop => return ,
272+ ComponentEvent :: Stop => todo ! ( ) ,
273273 // Component specific event
274- Event :: Blur | Event :: Focus | Event :: Key ( _) => {
274+ ComponentEvent :: Blur | ComponentEvent :: Focus | ComponentEvent :: Key ( _) => {
275275 let Some ( Index {
276276 widget_id, state_id, ..
277277 } ) = self . tabindex
@@ -280,13 +280,13 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
280280 } ;
281281 self . send_event_to_component ( event, widget_id, state_id) ;
282282 }
283- Event :: Mouse ( _) | Event :: Resize ( _) => {
283+ ComponentEvent :: Mouse ( _) | ComponentEvent :: Resize ( _) => {
284284 for i in 0 ..self . layout_ctx . components . len ( ) {
285285 let Some ( ( widget_id, state_id) ) = self . layout_ctx . components . get ( i) else { continue } ;
286286 self . send_event_to_component ( event, widget_id, state_id) ;
287287 }
288288 }
289- Event :: Tick ( _) => panic ! ( "this event should never be sent to the runtime" ) ,
289+ ComponentEvent :: Tick ( _) => panic ! ( "this event should never be sent to the runtime" ) ,
290290 }
291291 }
292292
@@ -376,7 +376,7 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
376376
377377 fn poll_events < B : Backend > ( & mut self , remaining : Duration , fps_now : Instant , backend : & mut B ) {
378378 while let Some ( event) = backend. next_event ( remaining) {
379- if let Event :: Resize ( size) = event {
379+ if let ComponentEvent :: Resize ( size) = event {
380380 self . layout_ctx . viewport . resize ( size) ;
381381 self . needs_layout = true ;
382382 backend. resize ( size, self . layout_ctx . glyph_map ) ;
@@ -434,25 +434,36 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
434434 #[ cfg( feature = "profile" ) ]
435435 puffin:: profile_function!( ) ;
436436
437- while let Some ( event) = self . assoc_events . next ( ) {
438- let Some ( ( widget_id, state_id) ) = self . layout_ctx . components . get_by_widget_id ( event. parent . into ( ) ) else {
439- return ;
440- } ;
437+ while let Some ( assoc_event) = self . assoc_events . next ( ) {
438+ let mut parent = assoc_event. parent ;
439+ let external_ident = self . document . strings . get_ref_unchecked ( assoc_event. external ( ) ) ;
440+ let internal_ident = self . document . strings . get_ref_unchecked ( assoc_event. internal ( ) ) ;
441+ let sender = self . document . strings . get_ref_unchecked ( assoc_event. sender ) ;
442+ let mut event = assoc_event. to_event ( internal_ident, external_ident, sender) ;
443+
444+ loop {
445+ let Some ( ( widget_id, state_id) ) = self . layout_ctx . components . get_by_widget_id ( parent. into ( ) ) else {
446+ return ;
447+ } ;
448+
449+ let stop_propagation = self
450+ . with_component ( widget_id, state_id, |comp, children, ctx| {
451+ let next_parent = ctx. parent ( ) ;
452+ comp. dyn_component . any_component_event ( children, ctx, & mut event) ;
441453
442- panic ! (
443- "this is going to be reworked. this was working while SharedState didn't have a lifetime, it does now so... figure it out"
444- ) ;
445- // let Some(remote_state) = self.layout_ctx.states.get(event.state) else { return };
446- // let Some(remote_state) = remote_state.shared_state() else { return };
447- // self.with_component(widget_id, state_id, |comp, children, ctx| {
448- // // TODO:
449- // // Create a new event type
450- // // if the event is stopped then return from drain_assoc_events
451-
452- // let event_ident = self.document.strings.get_ref_unchecked(event.external);
453- // comp.dyn_component
454- // .any_receive(children, ctx, event_ident, &*remote_state);
455- // });
454+ parent = match next_parent {
455+ Some ( p) => p,
456+ None => return true ,
457+ } ;
458+
459+ event. should_stop_propagation ( )
460+ } )
461+ . unwrap_or ( true ) ;
462+
463+ if stop_propagation {
464+ break ;
465+ }
466+ }
456467 }
457468 }
458469
@@ -521,7 +532,7 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
521532 Ok ( ( ) )
522533 }
523534
524- fn send_event_to_component ( & mut self , event : Event , widget_id : WidgetId , state_id : StateId ) {
535+ fn send_event_to_component ( & mut self , event : ComponentEvent , widget_id : WidgetId , state_id : StateId ) {
525536 self . with_component ( widget_id, state_id, |comp, elements, ctx| {
526537 comp. dyn_component . any_event ( elements, ctx, event) ;
527538 } ) ;
@@ -537,6 +548,7 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
537548 let WidgetKind :: Component ( component) = & mut container. kind else {
538549 panic ! ( "this is always a component" )
539550 } ;
551+
540552 let Some ( state) = self . layout_ctx . states . get_mut ( state_id) else {
541553 panic ! ( "a component always has a state" )
542554 } ;
@@ -548,6 +560,7 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
548560
549561 let ctx = AnyComponentContext :: new (
550562 component. parent . map ( Into :: into) ,
563+ component. name_id ,
551564 state_id,
552565 component. assoc_functions ,
553566 self . assoc_events ,
@@ -570,7 +583,7 @@ impl<'rt, 'bp, G: GlobalEventHandler> Frame<'rt, 'bp, G> {
570583
571584 for i in 0 ..self . layout_ctx . components . len ( ) {
572585 let Some ( ( widget_id, state_id) ) = self . layout_ctx . components . get_ticking ( i) else { continue } ;
573- let event = Event :: Tick ( dt) ;
586+ let event = ComponentEvent :: Tick ( dt) ;
574587 self . send_event_to_component ( event, widget_id, state_id) ;
575588 }
576589 }
0 commit comments