@@ -41,6 +41,8 @@ export type Events = {
41
41
onClick : EventListener
42
42
onContextMenu : EventListener
43
43
onDoubleClick : EventListener
44
+ onDragOverEnter : EventListener
45
+ onDragOverLeave : EventListener
44
46
onWheel : EventListener
45
47
onPointerDown : EventListener
46
48
onPointerUp : EventListener
@@ -54,6 +56,8 @@ export type EventHandlers = {
54
56
onClick ?: ( event : ThreeEvent < MouseEvent > ) => void
55
57
onContextMenu ?: ( event : ThreeEvent < MouseEvent > ) => void
56
58
onDoubleClick ?: ( event : ThreeEvent < MouseEvent > ) => void
59
+ onDragOverEnter ?: ( event : ThreeEvent < DragEvent > ) => void
60
+ onDragOverLeave ?: ( event : DragEvent ) => void
57
61
onPointerUp ?: ( event : ThreeEvent < PointerEvent > ) => void
58
62
onPointerDown ?: ( event : ThreeEvent < PointerEvent > ) => void
59
63
onPointerOver ?: ( event : ThreeEvent < PointerEvent > ) => void
@@ -109,6 +113,7 @@ export function getEventPriority() {
109
113
case 'pointerdown' :
110
114
case 'pointerup' :
111
115
return DiscreteEventPriority
116
+ case 'dragover' :
112
117
case 'pointermove' :
113
118
case 'pointerout' :
114
119
case 'pointerover' :
@@ -171,10 +176,12 @@ export function createEvents(store: UseBoundStore<RootState>) {
171
176
172
177
/** Returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc */
173
178
function filterPointerEvents ( objects : THREE . Object3D [ ] ) {
174
- return objects . filter ( ( obj ) =>
175
- [ 'Move' , 'Over' , 'Enter' , 'Out' , 'Leave' ] . some (
176
- ( name ) => ( obj as unknown as Instance ) . __r3f ?. handlers [ ( 'onPointer' + name ) as keyof EventHandlers ] ,
177
- ) ,
179
+ return objects . filter (
180
+ ( obj ) =>
181
+ [ 'Move' , 'Over' , 'Enter' , 'Out' , 'Leave' ] . some (
182
+ ( name ) => ( obj as unknown as Instance ) . __r3f ?. handlers [ ( 'onPointer' + name ) as keyof EventHandlers ] ,
183
+ ) ||
184
+ [ 'Over' ] . some ( ( name ) => ( obj as unknown as Instance ) . __r3f ?. handlers [ ( 'onDrag' + name ) as keyof EventHandlers ] ) ,
178
185
)
179
186
}
180
187
@@ -377,6 +384,8 @@ export function createEvents(store: UseBoundStore<RootState>) {
377
384
const data = { ...hoveredObj , intersections }
378
385
handlers . onPointerOut ?.( data as ThreeEvent < PointerEvent > )
379
386
handlers . onPointerLeave ?.( data as ThreeEvent < PointerEvent > )
387
+ // @ts -ignore
388
+ handlers . onDragOverLeave ?.( data )
380
389
}
381
390
}
382
391
} )
@@ -409,6 +418,7 @@ export function createEvents(store: UseBoundStore<RootState>) {
409
418
410
419
// Get fresh intersects
411
420
const isPointerMove = name === 'onPointerMove'
421
+ const isDragOver = name === 'onDragOverEnter' || name === 'onDragOverLeave'
412
422
const isClickEvent = name === 'onClick' || name === 'onContextMenu' || name === 'onDoubleClick'
413
423
const filter = isPointerMove ? filterPointerEvents : undefined
414
424
//const hits = patchIntersects(intersect(filter), event)
@@ -430,7 +440,7 @@ export function createEvents(store: UseBoundStore<RootState>) {
430
440
}
431
441
}
432
442
// Take care of unhover
433
- if ( isPointerMove ) cancelPointer ( hits )
443
+ if ( isPointerMove || isDragOver ) cancelPointer ( hits )
434
444
435
445
handleIntersects ( hits , event , delta , ( data : ThreeEvent < DomEvent > ) => {
436
446
const eventObject = data . eventObject
@@ -457,6 +467,18 @@ export function createEvents(store: UseBoundStore<RootState>) {
457
467
}
458
468
// Call mouse move
459
469
handlers . onPointerMove ?.( data as ThreeEvent < PointerEvent > )
470
+ } else if ( isDragOver ) {
471
+ // When enter or out is present take care of hover-state
472
+ const id = makeId ( data )
473
+ const hoveredItem = internal . hovered . get ( id )
474
+ if ( ! hoveredItem ) {
475
+ // If the object wasn't previously hovered, book it and call its handler
476
+ internal . hovered . set ( id , data )
477
+ handlers . onDragOverEnter ?.( data as ThreeEvent < DragEvent > )
478
+ } else if ( hoveredItem . stopped ) {
479
+ // If the object was previously hovered and stopped, we shouldn't allow other items to proceed
480
+ data . stopPropagation ( )
481
+ }
460
482
} else {
461
483
// All other events ...
462
484
const handler = handlers [ name as keyof EventHandlers ] as ( event : ThreeEvent < PointerEvent > ) => void
0 commit comments