Skip to content

Commit 202dc3b

Browse files
authored
Support on slot click listeners in vue (#7059)
Adds support for the `node.onInputDblClick` and `node.onInputClick` callbacks in vue - Fixes vue link drop code so that a link which is not dropped on the canvas does not fallback to the dropped on canvas code. ![input-double-click_00001](https://github.com/user-attachments/assets/8b138a6e-e569-4a5d-b59a-cd688ff062e6) Resolves #7037 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-7059-Support-on-slot-click-listeners-in-vue-2bb6d73d3650812993fdef244e91683b) by [Unito](https://www.unito.io)
1 parent 2c437ac commit 202dc3b

File tree

5 files changed

+46
-15
lines changed

5 files changed

+46
-15
lines changed

browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ test.describe('Vue Node Link Interaction', () => {
897897
0,
898898
false
899899
)
900-
const dropPos = { x: outputCenter.x + 200, y: outputCenter.y - 120 }
900+
const dropPos = { x: outputCenter.x + 200, y: outputCenter.y - 100 }
901901

902902
await comfyMouse.move(outputCenter)
903903
await comfyPage.page.keyboard.down('Shift')

src/renderer/extensions/vueNodes/components/InputSlot.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
ref="connectionDotRef"
77
:color="slotColor"
88
:class="cn('-translate-x-1/2 w-3', errorClassesDot)"
9+
@click="onClick"
10+
@dblclick="onDoubleClick"
911
@pointerdown="onPointerDown"
1012
/>
1113

@@ -142,7 +144,7 @@ useSlotElementTracking({
142144
element: slotElRef
143145
})
144146
145-
const { onPointerDown } = useSlotLinkInteraction({
147+
const { onClick, onDoubleClick, onPointerDown } = useSlotLinkInteraction({
146148
nodeId: props.nodeId ?? '',
147149
index: props.index,
148150
type: 'input'

src/renderer/extensions/vueNodes/composables/useSlotLinkInteraction.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { layoutStore } from '@/renderer/core/layout/store/layoutStore'
2929
import type { Point } from '@/renderer/core/layout/types'
3030
import { toPoint } from '@/renderer/core/layout/utils/geometry'
3131
import { createSlotLinkDragContext } from '@/renderer/extensions/vueNodes/composables/slotLinkDragContext'
32+
import { augmentToCanvasPointerEvent } from '@/renderer/extensions/vueNodes/utils/eventUtils'
3233
import { app } from '@/scripts/app'
3334
import { createRafBatch } from '@/utils/rafBatch'
3435

@@ -39,6 +40,8 @@ interface SlotInteractionOptions {
3940
}
4041

4142
interface SlotInteractionHandlers {
43+
onClick: (event: PointerEvent) => void
44+
onDoubleClick: (event: PointerEvent) => void
4245
onPointerDown: (event: PointerEvent) => void
4346
}
4447

@@ -500,7 +503,7 @@ export function useSlotLinkInteraction({
500503

501504
const hasConnected = connectByPriority(canvasEvent.target, snappedCandidate)
502505

503-
if (!hasConnected) {
506+
if (!hasConnected && event.target === app.canvas?.canvas) {
504507
activeAdapter?.dropOnCanvas(canvasEvent)
505508
}
506509

@@ -716,7 +719,26 @@ export function useSlotLinkInteraction({
716719
}
717720
})
718721

722+
function onDoubleClick(e: PointerEvent) {
723+
const { graph } = app.canvas
724+
if (!graph) return
725+
const node = graph.getNodeById(nodeId)
726+
if (!node) return
727+
augmentToCanvasPointerEvent(e, node, app.canvas)
728+
node.onInputDblClick?.(index, e)
729+
}
730+
function onClick(e: PointerEvent) {
731+
const { graph } = app.canvas
732+
if (!graph) return
733+
const node = graph.getNodeById(nodeId)
734+
if (!node) return
735+
augmentToCanvasPointerEvent(e, node, app.canvas)
736+
node.onInputClick?.(index, e)
737+
}
738+
719739
return {
740+
onClick,
741+
onDoubleClick,
720742
onPointerDown
721743
}
722744
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import type { LGraphCanvas } from '@/lib/litegraph/src/LGraphCanvas'
2+
import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
3+
import type { CanvasPointerEvent } from '@/lib/litegraph/src/types/events'
4+
5+
export function augmentToCanvasPointerEvent(
6+
e: PointerEvent,
7+
node: LGraphNode,
8+
canvas: LGraphCanvas
9+
): asserts e is CanvasPointerEvent {
10+
canvas.adjustMouseEvent(e)
11+
canvas.graph_mouse[0] = e.offsetX + node.pos[0]
12+
canvas.graph_mouse[1] = e.offsetY + node.pos[1]
13+
}

src/renderer/extensions/vueNodes/widgets/components/WidgetLegacy.vue

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import { useChainCallback } from '@/composables/functional/useChainCallback'
66
import { CanvasPointer } from '@/lib/litegraph/src/CanvasPointer'
77
import type { LGraphCanvas } from '@/lib/litegraph/src/LGraphCanvas'
88
import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
9-
import type { CanvasPointerEvent } from '@/lib/litegraph/src/types/events'
109
import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets'
1110
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
11+
import { augmentToCanvasPointerEvent } from '@/renderer/extensions/vueNodes/utils/eventUtils'
1212
import { useColorPaletteStore } from '@/stores/workspace/colorPaletteStore'
1313
import type { SimplifiedWidget } from '@/types/simplifiedWidget'
1414
@@ -64,16 +64,10 @@ function draw() {
6464
ctx.scale(scaleFactor, scaleFactor)
6565
widgetInstance.draw?.(ctx, node, width, 1, height)
6666
}
67-
function translateEvent(e: PointerEvent): asserts e is CanvasPointerEvent {
68-
if (!node) return
69-
canvas.adjustMouseEvent(e)
70-
canvas.graph_mouse[0] = e.offsetX + node.pos[0]
71-
canvas.graph_mouse[1] = e.offsetY + node.pos[1]
72-
}
7367
//See LGraphCanvas.processWidgetClick
7468
function handleDown(e: PointerEvent) {
7569
if (!node || !widgetInstance || !pointer) return
76-
translateEvent(e)
70+
augmentToCanvasPointerEvent(e, node, canvas)
7771
pointer.down(e)
7872
if (widgetInstance.mouse)
7973
pointer.onDrag = (e) =>
@@ -82,14 +76,14 @@ function handleDown(e: PointerEvent) {
8276
canvas.processWidgetClick(e, node, widgetInstance, pointer)
8377
}
8478
function handleUp(e: PointerEvent) {
85-
if (!pointer) return
86-
translateEvent(e)
79+
if (!pointer || !node) return
80+
augmentToCanvasPointerEvent(e, node, canvas)
8781
e.click_time = e.timeStamp - (pointer?.eDown?.timeStamp ?? 0)
8882
pointer.up(e)
8983
}
9084
function handleMove(e: PointerEvent) {
91-
if (!pointer) return
92-
translateEvent(e)
85+
if (!pointer || !node) return
86+
augmentToCanvasPointerEvent(e, node, canvas)
9387
pointer.move(e)
9488
}
9589
</script>

0 commit comments

Comments
 (0)