@@ -195,6 +195,47 @@ export const nodeLifecycleMethods = {
195195 return e ;
196196 } ,
197197
198+ forwardVueCompatNodePointerEvent ( e ) {
199+ if ( ! this . isVueNodesMode ( ) || ! e ?. type ) return false ;
200+
201+ const nodeElement = this . _vueCompatCanvasElement ?. closest ?. ( '[data-node-id]' ) ;
202+ const EventConstructor = e . type . startsWith ( 'pointer' )
203+ ? globalThis . PointerEvent
204+ : globalThis . MouseEvent ;
205+ if ( ! nodeElement ?. dispatchEvent || typeof EventConstructor !== 'function' ) return false ;
206+
207+ const forwardedEvent = new EventConstructor ( e . type , {
208+ bubbles : true ,
209+ cancelable : true ,
210+ composed : true ,
211+ view : globalThis . window ,
212+ detail : e . detail ?? 0 ,
213+ screenX : e . screenX ?? 0 ,
214+ screenY : e . screenY ?? 0 ,
215+ clientX : e . clientX ?? 0 ,
216+ clientY : e . clientY ?? 0 ,
217+ ctrlKey : Boolean ( e . ctrlKey ) ,
218+ shiftKey : Boolean ( e . shiftKey ) ,
219+ altKey : Boolean ( e . altKey ) ,
220+ metaKey : Boolean ( e . metaKey ) ,
221+ button : e . button ?? 0 ,
222+ buttons : e . buttons ?? 0 ,
223+ relatedTarget : e . relatedTarget ?? null ,
224+ pointerId : e . pointerId ?? 1 ,
225+ width : e . width ?? 1 ,
226+ height : e . height ?? 1 ,
227+ pressure : e . pressure ?? 0 ,
228+ tangentialPressure : e . tangentialPressure ?? 0 ,
229+ tiltX : e . tiltX ?? 0 ,
230+ tiltY : e . tiltY ?? 0 ,
231+ twist : e . twist ?? 0 ,
232+ pointerType : e . pointerType || 'mouse' ,
233+ isPrimary : e . isPrimary ?? true
234+ } ) ;
235+ nodeElement . dispatchEvent ( forwardedEvent ) ;
236+ return true ;
237+ } ,
238+
198239 updateVueCompatCanvasLayout ( canvasElement ) {
199240 const widgetsGrid = canvasElement ?. closest ?. ( '[data-testid="node-widgets"]' ) ;
200241 const slotsElement = widgetsGrid ?. previousElementSibling ;
@@ -443,6 +484,7 @@ export const nodeLifecycleMethods = {
443484 }
444485 this . _vueCompatCanvasElement = null ;
445486 this . _vueCompatCanvasHandlers = null ;
487+ this . _vueCompatForwardingNodePointer = false ;
446488 this . teardownVueCompatCanvasLayout ( ) ;
447489 } ,
448490
@@ -501,14 +543,28 @@ export const nodeLifecycleMethods = {
501543
502544 self . normalizeVueCompatPointerEvent ( e , pos ) ;
503545
546+ const isPointerDown = e . type === "pointerdown" || e . type === "mousedown" ;
547+ const isPointerEnd = e . type === "pointerup"
548+ || e . type === "mouseup"
549+ || e . type === "pointercancel"
550+ || e . buttons === 0 ;
551+ if ( isPointerDown && self . _vueCompatForwardingNodePointer ) {
552+ self . _vueCompatForwardingNodePointer = false ;
553+ }
554+ if ( self . _vueCompatForwardingNodePointer ) {
555+ const forwarded = self . forwardVueCompatNodePointerEvent ( e ) ;
556+ if ( isPointerEnd ) self . _vueCompatForwardingNodePointer = false ;
557+ return forwarded ;
558+ }
559+
504560 const canvas = self . app ?. canvas
505561 || node . graph ?. list_of_graphcanvas ?. [ 0 ]
506562 || globalThis . LGraphCanvas ?. active_canvas
507563 || null ;
508564
509565 try {
510566 return self . withVueCompatWidgetSize ( ( ) => {
511- if ( node . capture && ( e . type === "pointerdown" || e . type === "mousedown" ) ) {
567+ if ( node . capture && isPointerDown ) {
512568 self . handleMouseUp ( e ) ;
513569 }
514570 if ( node . capture && ( e . type === "pointerup" || e . type === "mouseup" || e . buttons === 0 ) ) {
@@ -517,8 +573,13 @@ export const nodeLifecycleMethods = {
517573 if ( node . capture ) {
518574 return self . handleMouseMove ( e , null , canvas ) ;
519575 }
520- if ( e . type === "pointerdown" || e . type === "mousedown" ) {
521- return node . onMouseDown ?. ( e , pos , canvas ) ?? false ;
576+ if ( isPointerDown ) {
577+ const handled = node . onMouseDown ?. ( e , pos , canvas ) ?? false ;
578+ if ( handled ) return handled ;
579+ self . _vueCompatForwardingNodePointer = true ;
580+ const forwarded = self . forwardVueCompatNodePointerEvent ( e ) ;
581+ if ( ! forwarded ) self . _vueCompatForwardingNodePointer = false ;
582+ return forwarded ;
522583 }
523584 return false ;
524585 } ) ;
0 commit comments