Skip to content

Commit 1cf42ce

Browse files
committed
feat: forward pointer events to Vue-compatible node wrapper during interaction
1 parent 4ff4672 commit 1cf42ce

1 file changed

Lines changed: 64 additions & 3 deletions

File tree

js/node/resolution_master_node_lifecycle.js

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)