@@ -310,10 +310,36 @@ function isInPlot(event) {
310310 event .clientY < rect .bottom - panel .b
311311}
312312
313+ function dispatchPointerEvent (e ) {
314+ if (! layers .value || e ._vhandled || ! isInPlot (e)) return e
315+ let canvasLayers = Array .from (layers .value ).filter (l => l .render == ' canvas' )
316+ if (! canvasLayers .length ) return e
317+ // clone event
318+ let options = {}
319+ for (let key in e) options[key] = e[key]
320+ options .bubbles = false
321+ let event = new PointerEvent (e .type , options)
322+ for (let key of Object .keys (e)) {
323+ let prop = Object .getOwnPropertyDescriptor (event , key)
324+ if (prop && ! prop .writable && ! prop .set ) continue
325+ event [key] = e[key]
326+ }
327+ // dispatch to canvas layers
328+ for (let i = layers .value .length - 1 ; i >= 0 ; i-- )
329+ if (layers .value [i].dispatchEvent (event ) === false ) e .preventDefault ()
330+ for (let key of Object .keys (event )) {
331+ let prop = Object .getOwnPropertyDescriptor (event , key)
332+ if (prop && ! prop .writable && ! prop .set ) continue
333+ e[key] = event [key]
334+ }
335+ return event ._vhandled ? event : e
336+ }
337+
313338let moveTimer, movementX = 0 , movementY = 0
314339function svgPointerdown (e ) {
315340 let coord = getCoord (e)
316- emit (' pointerdown' , e, coord)
341+ emit (' pointerdown' , dispatchPointerEvent (e), coord)
342+ if (props .clip && ! isInPlot (e)) return
317343 let svg = e .currentTarget
318344 let pointerMoved = false
319345 function detectMove (ev ) {
@@ -326,16 +352,10 @@ function svgPointerdown(e) {
326352 e .target .addEventListener (' pointerup' , function (ev ) {
327353 e .target .removeEventListener (' pointermove' , detectMove)
328354 if (! pointerMoved) {
329- let coord = getCoord (ev)
330- emit (' singleclick' , new PointerEvent (" singleclick" , ev), coord)
331- if (isInPlot (e) && layers .value ) {
332- if (ev .button == 0 ) {
333- layers .value .forEach (layer => layer .dispatchEvent (new PointerEvent (" click" , ev)))
334- }
335- }
355+ let event = new PointerEvent (" singleclick" , ev)
356+ ev .target .dispatchEvent (event )
336357 }
337358 }, { once: true })
338- if (props .clip && ! isInPlot (e)) return
339359 let sel = props .selections .find (s => [" buttons" , " ctrlKey" , " shiftKey" , " altKey" , " metaKey" ].every (k => s[k] == e[k]))
340360 if (sel) {
341361 let { x = false , y = false , " min-range-x" : mrx = 0 , " min-range-y" : mry = 0 } = sel
@@ -414,7 +434,7 @@ function svgPointerdown(e) {
414434 if (sel .dismissible !== true && [" xmin" , " xmax" , " ymin" , " ymax" ].every (k => model? .[k] == null )) return
415435 let res = {}, event = new PointerEvent (" select" , e)
416436 sel[" onUpdate:modelValue" ]? .(res)
417- if (! emitEvent (sel[" onCancel " ], dropNull (res), event )) {
437+ if (! emitEvent (sel[" onDismiss " ], dropNull (res), event )) {
418438 emit (' select' , dropNull (res), event )
419439 }
420440 }
@@ -463,7 +483,7 @@ function svgPointerdown(e) {
463483let wheelDelta = 0 , wheelTimer
464484function svgWheel (e ) {
465485 let coord = getCoord (e)
466- emit (' wheel' , e , coord)
486+ emit (' wheel' , dispatchPointerEvent (e) , coord)
467487 if (props .clip && ! isInPlot (e)) return
468488 let act = props .action .find (a => [" zoom" , " nudge" ].includes (a .action ) && [" ctrlKey" , " shiftKey" , " altKey" , " metaKey" ].every (k => a[k] == e[k]))
469489 if (! act || ! act .x && ! act .y ) return
@@ -551,15 +571,16 @@ function applyTransform(act, event) {
551571}
552572const svgVOn = {
553573 pointerdown: svgPointerdown,
554- pointerup (e ) { emit (' pointerup' , e , getCoord (e)) },
574+ pointerup (e ) { emit (' pointerup' , dispatchPointerEvent (e) , getCoord (e)) },
555575 pointerover (e ) { emit (' pointerover' , e, getCoord (e)) },
556576 pointerout (e ) { emit (' pointerout' , e, getCoord (e)) },
557577 pointerenter (e ) { emit (' pointerenter' , e, getCoord (e)) },
558578 pointerleave (e ) { emit (' pointerleave' , e, getCoord (e)) },
559- dblclick (e ) { emit (' dblclick' , e, getCoord (e)) },
560- click (e ) { emit (' click' , e, getCoord (e)) },
561- contextmenu (e ) { emit (' contextmenu' , e, getCoord (e)) },
562- pointermove (e ) { emit (' pointermove' , e, getCoord (e)) },
579+ click (e ) { emit (' click' , dispatchPointerEvent (e), getCoord (e)) },
580+ contextmenu (e ) { emit (' contextmenu' , dispatchPointerEvent (e), getCoord (e)) },
581+ singleclick (e ) { emit (' singleclick' , dispatchPointerEvent (e), getCoord (e)) },
582+ dblclick (e ) { emit (' dblclick' , dispatchPointerEvent (e), getCoord (e)) },
583+ pointermove (e ) { emit (' pointermove' , dispatchPointerEvent (e), getCoord (e)) },
563584 wheel: svgWheel,
564585}
565586
@@ -653,7 +674,7 @@ const axes = computed(() => {
653674 < / defs>
654675 < rect : transform= " `translate(${panel.left}, ${panel.top})`" : width= " panel.width" : height= " panel.height"
655676 : fill= " theme.plot.background" v- if = " theme.plot.background" >< / rect>
656- < g : transform= " `translate(${panel.left}, ${panel.top})`" >
677+ < g : transform= " `translate(${panel.left}, ${panel.top})`" style = " pointer-events: none; " >
657678 < CoreGridH v- if = " theme.grid.h" v- bind= " gridBreaks.h" : layout= " innerRect" : theme= " theme.grid.h"
658679 : activeTransform= " activeTransform" : coord2pos= " coord2pos" : transition= " transition" / >
659680 < CoreGridV v- if = " theme.grid.v" v- bind= " gridBreaks.v" : layout= " innerRect" : theme= " theme.grid.v"
0 commit comments