@@ -205,6 +205,7 @@ pub struct Drop {
205
205
/// Generates pointer events from input and focus data
206
206
#[ allow( clippy:: too_many_arguments) ]
207
207
pub fn pointer_events (
208
+ mut commands : Commands ,
208
209
// Input
209
210
mut input_presses : EventReader < InputPress > ,
210
211
mut input_moves : EventReader < InputMove > ,
@@ -237,12 +238,14 @@ pub fn pointer_events(
237
238
. iter ( )
238
239
. flat_map ( |h| h. iter ( ) . map ( |( entity, data) | ( * entity, data. to_owned ( ) ) ) )
239
240
{
240
- pointer_move . send ( Pointer :: new (
241
+ let event = Pointer :: new (
241
242
pointer_id,
242
243
location. clone ( ) ,
243
244
hovered_entity,
244
245
Move { hit, delta } ,
245
- ) ) ;
246
+ ) ;
247
+ commands. trigger_targets ( event. clone ( ) , event. target ) ;
248
+ pointer_move. send ( event) ;
246
249
}
247
250
}
248
251
@@ -264,12 +267,14 @@ pub fn pointer_events(
264
267
) ;
265
268
continue ;
266
269
} ;
267
- pointer_up . send ( Pointer :: new (
270
+ let event = Pointer :: new (
268
271
press_event. pointer_id ,
269
272
location,
270
273
hovered_entity,
271
274
Up { button, hit } ,
272
- ) ) ;
275
+ ) ;
276
+ commands. trigger_targets ( event. clone ( ) , event. target ) ;
277
+ pointer_up. send ( event) ;
273
278
}
274
279
}
275
280
for ( hovered_entity, hit) in hover_map
@@ -285,12 +290,14 @@ pub fn pointer_events(
285
290
) ;
286
291
continue ;
287
292
} ;
288
- pointer_down . send ( Pointer :: new (
293
+ let event = Pointer :: new (
289
294
press_event. pointer_id ,
290
295
location,
291
296
hovered_entity,
292
297
Down { button, hit } ,
293
- ) ) ;
298
+ ) ;
299
+ commands. trigger_targets ( event. clone ( ) , event. target ) ;
300
+ pointer_down. send ( event) ;
294
301
}
295
302
}
296
303
}
@@ -313,12 +320,9 @@ pub fn pointer_events(
313
320
) ;
314
321
continue ;
315
322
} ;
316
- pointer_over. send ( Pointer :: new (
317
- pointer_id,
318
- location,
319
- hovered_entity,
320
- Over { hit } ,
321
- ) ) ;
323
+ let event = Pointer :: new ( pointer_id, location, hovered_entity, Over { hit } ) ;
324
+ commands. trigger_targets ( event. clone ( ) , event. target ) ;
325
+ pointer_over. send ( event) ;
322
326
}
323
327
}
324
328
@@ -340,12 +344,9 @@ pub fn pointer_events(
340
344
) ;
341
345
continue ;
342
346
} ;
343
- pointer_out. send ( Pointer :: new (
344
- pointer_id,
345
- location,
346
- hovered_entity,
347
- Out { hit } ,
348
- ) ) ;
347
+ let event = Pointer :: new ( pointer_id, location, hovered_entity, Out { hit } ) ;
348
+ commands. trigger_targets ( event. clone ( ) , event. target ) ;
349
+ pointer_out. send ( event) ;
349
350
}
350
351
}
351
352
}
@@ -366,6 +367,11 @@ pub struct DragEntry {
366
367
/// Uses pointer events to determine when click and drag events occur.
367
368
#[ allow( clippy:: too_many_arguments) ]
368
369
pub fn send_click_and_drag_events (
370
+ // for triggering observers
371
+ // - Pointer<Click>
372
+ // - Pointer<Drag>
373
+ // - Pointer<DragStart>
374
+ mut commands : Commands ,
369
375
// Input
370
376
mut pointer_down : EventReader < Pointer < Down > > ,
371
377
mut pointer_up : EventReader < Pointer < Up > > ,
@@ -377,12 +383,9 @@ pub fn send_click_and_drag_events(
377
383
mut down_map : Local <
378
384
HashMap < ( PointerId , PointerButton ) , HashMap < Entity , ( Pointer < Down > , Instant ) > > ,
379
385
> ,
380
- // Output
386
+ // Outputs used for further processing
381
387
mut drag_map : ResMut < DragMap > ,
382
- mut pointer_click : EventWriter < Pointer < Click > > ,
383
- mut pointer_drag_start : EventWriter < Pointer < DragStart > > ,
384
388
mut pointer_drag_end : EventWriter < Pointer < DragEnd > > ,
385
- mut pointer_drag : EventWriter < Pointer < Drag > > ,
386
389
) {
387
390
let pointer_location = |pointer_id : PointerId | {
388
391
pointer_map
@@ -415,15 +418,16 @@ pub fn send_click_and_drag_events(
415
418
latest_pos : down. pointer_location . position ,
416
419
} ,
417
420
) ;
418
- pointer_drag_start . send ( Pointer :: new (
421
+ let event = Pointer :: new (
419
422
pointer_id,
420
423
down. pointer_location . clone ( ) ,
421
424
down. target ,
422
425
DragStart {
423
426
button,
424
427
hit : down. hit . clone ( ) ,
425
428
} ,
426
- ) ) ;
429
+ ) ;
430
+ commands. trigger_targets ( event, down. target ) ;
427
431
}
428
432
429
433
for ( dragged_entity, drag) in drag_list. iter_mut ( ) {
@@ -433,12 +437,9 @@ pub fn send_click_and_drag_events(
433
437
delta : location. position - drag. latest_pos ,
434
438
} ;
435
439
drag. latest_pos = location. position ;
436
- pointer_drag. send ( Pointer :: new (
437
- pointer_id,
438
- location. clone ( ) ,
439
- * dragged_entity,
440
- drag_event,
441
- ) ) ;
440
+ let target = * dragged_entity;
441
+ let event = Pointer :: new ( pointer_id, location. clone ( ) , target, drag_event) ;
442
+ commands. trigger_targets ( event, target) ;
442
443
}
443
444
}
444
445
}
@@ -458,7 +459,7 @@ pub fn send_click_and_drag_events(
458
459
. and_then ( |down| down. get ( & target) )
459
460
{
460
461
let duration = now - * down_instant;
461
- pointer_click . send ( Pointer :: new (
462
+ let event = Pointer :: new (
462
463
pointer_id,
463
464
pointer_location,
464
465
target,
@@ -467,7 +468,8 @@ pub fn send_click_and_drag_events(
467
468
hit,
468
469
duration,
469
470
} ,
470
- ) ) ;
471
+ ) ;
472
+ commands. trigger_targets ( event, target) ;
471
473
}
472
474
}
473
475
@@ -501,19 +503,22 @@ pub fn send_click_and_drag_events(
501
503
button : press. button ,
502
504
distance : drag. latest_pos - drag. start_pos ,
503
505
} ;
504
- pointer_drag_end. send ( Pointer :: new (
505
- press. pointer_id ,
506
- location. clone ( ) ,
507
- drag_target,
508
- drag_end,
509
- ) ) ;
506
+ let event = Pointer :: new ( press. pointer_id , location. clone ( ) , drag_target, drag_end) ;
507
+ commands. trigger_targets ( event. clone ( ) , event. target ) ;
508
+ pointer_drag_end. send ( event) ;
510
509
}
511
510
}
512
511
}
513
512
514
513
/// Uses pointer events to determine when drag-over events occur
515
514
#[ allow( clippy:: too_many_arguments) ]
516
515
pub fn send_drag_over_events (
516
+ // uses this to trigger the following
517
+ // - Pointer<DragEnter>,
518
+ // - Pointer<DragOver>,
519
+ // - Pointer<DragLeave>,
520
+ // - Pointer<Drop>,
521
+ mut commands : Commands ,
517
522
// Input
518
523
drag_map : Res < DragMap > ,
519
524
mut pointer_over : EventReader < Pointer < Over > > ,
@@ -522,12 +527,6 @@ pub fn send_drag_over_events(
522
527
mut pointer_drag_end : EventReader < Pointer < DragEnd > > ,
523
528
// Local
524
529
mut drag_over_map : Local < HashMap < ( PointerId , PointerButton ) , HashMap < Entity , HitData > > > ,
525
-
526
- // Output
527
- mut pointer_drag_enter : EventWriter < Pointer < DragEnter > > ,
528
- mut pointer_drag_over : EventWriter < Pointer < DragOver > > ,
529
- mut pointer_drag_leave : EventWriter < Pointer < DragLeave > > ,
530
- mut pointer_drop : EventWriter < Pointer < Drop > > ,
531
530
) {
532
531
// Fire PointerDragEnter events.
533
532
for Pointer {
@@ -548,17 +547,17 @@ pub fn send_drag_over_events(
548
547
{
549
548
let drag_entry = drag_over_map. entry ( ( pointer_id, button) ) . or_default ( ) ;
550
549
drag_entry. insert ( target, hit. clone ( ) ) ;
551
- let event = DragEnter {
552
- button,
553
- dragged : * drag_target,
554
- hit : hit. clone ( ) ,
555
- } ;
556
- pointer_drag_enter. send ( Pointer :: new (
550
+ let event = Pointer :: new (
557
551
pointer_id,
558
552
pointer_location. clone ( ) ,
559
553
target,
560
- event,
561
- ) ) ;
554
+ DragEnter {
555
+ button,
556
+ dragged : * drag_target,
557
+ hit : hit. clone ( ) ,
558
+ } ,
559
+ ) ;
560
+ commands. trigger_targets ( event, target) ;
562
561
}
563
562
}
564
563
}
@@ -580,7 +579,7 @@ pub fn send_drag_over_events(
580
579
|& & drag_target| target != drag_target, /* can't drag over itself */
581
580
)
582
581
{
583
- pointer_drag_over . send ( Pointer :: new (
582
+ let event = Pointer :: new (
584
583
pointer_id,
585
584
pointer_location. clone ( ) ,
586
585
target,
@@ -589,7 +588,8 @@ pub fn send_drag_over_events(
589
588
dragged : * drag_target,
590
589
hit : hit. clone ( ) ,
591
590
} ,
592
- ) ) ;
591
+ ) ;
592
+ commands. trigger_targets ( event, target) ;
593
593
}
594
594
}
595
595
}
@@ -598,7 +598,7 @@ pub fn send_drag_over_events(
598
598
for Pointer {
599
599
pointer_id,
600
600
pointer_location,
601
- target,
601
+ target : drag_end_target ,
602
602
event : DragEnd {
603
603
button,
604
604
distance : _,
@@ -609,26 +609,30 @@ pub fn send_drag_over_events(
609
609
continue ;
610
610
} ;
611
611
for ( dragged_over, hit) in drag_over_set. drain ( ) {
612
- pointer_drag_leave. send ( Pointer :: new (
612
+ let target = dragged_over;
613
+ let event = Pointer :: new (
613
614
pointer_id,
614
615
pointer_location. clone ( ) ,
615
616
dragged_over,
616
617
DragLeave {
617
618
button,
618
- dragged : target ,
619
+ dragged : drag_end_target ,
619
620
hit : hit. clone ( ) ,
620
621
} ,
621
- ) ) ;
622
- pointer_drop. send ( Pointer :: new (
622
+ ) ;
623
+ commands. trigger_targets ( event, target) ;
624
+
625
+ let event = Pointer :: new (
623
626
pointer_id,
624
627
pointer_location. clone ( ) ,
625
- dragged_over ,
628
+ target ,
626
629
Drop {
627
630
button,
628
631
dropped : target,
629
632
hit : hit. clone ( ) ,
630
633
} ,
631
- ) ) ;
634
+ ) ;
635
+ commands. trigger_targets ( event, target) ;
632
636
}
633
637
}
634
638
@@ -651,7 +655,7 @@ pub fn send_drag_over_events(
651
655
continue ;
652
656
} ;
653
657
for drag_target in drag_list. keys ( ) {
654
- pointer_drag_leave . send ( Pointer :: new (
658
+ let event = Pointer :: new (
655
659
pointer_id,
656
660
pointer_location. clone ( ) ,
657
661
target,
@@ -660,7 +664,8 @@ pub fn send_drag_over_events(
660
664
dragged : * drag_target,
661
665
hit : hit. clone ( ) ,
662
666
} ,
663
- ) ) ;
667
+ ) ;
668
+ commands. trigger_targets ( event, target) ;
664
669
}
665
670
}
666
671
}
0 commit comments