Skip to content

Commit

Permalink
Refactor node library drag and drop
Browse files Browse the repository at this point in the history
  • Loading branch information
huchenlei committed Aug 24, 2024
1 parent f4242f8 commit b884622
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 119 deletions.
22 changes: 13 additions & 9 deletions src/components/graph/GraphCanvas.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { ref, computed, onUnmounted, watch, onMounted, watchEffect } from 'vue'
import { app as comfyApp } from '@/scripts/app'
import { useSettingStore } from '@/stores/settingStore'
import { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'
import { useNodeDefStore } from '@/stores/nodeDefStore'
import { ComfyNodeDefImpl, useNodeDefStore } from '@/stores/nodeDefStore'
import { useWorkspaceStore } from '@/stores/workspaceStateStore'
import {
LiteGraph,
Expand Down Expand Up @@ -113,14 +113,18 @@ onMounted(async () => {
element: canvasRef.value,
onDrop: (event) => {
const loc = event.location.current.input
// Add an offset on x to make sure after adding the node, the cursor
// is on the node (top left corner)
const pos = comfyApp.clientPosToCanvasPos([loc.clientX - 20, loc.clientY])
const comfyNodeName = event.source.element.getAttribute(
'data-comfy-node-name'
)
const nodeDef = nodeDefStore.nodeDefsByName[comfyNodeName]
comfyApp.addNodeOnGraph(nodeDef, { pos })
const dndData = event.source.data
if (dndData.type === 'add-node') {
const nodeDef = dndData.data as ComfyNodeDefImpl
// Add an offset on x to make sure after adding the node, the cursor
// is on the node (top left corner)
const pos = comfyApp.clientPosToCanvasPos([
loc.clientX - 20,
loc.clientY
])
comfyApp.addNodeOnGraph(nodeDef, { pos })
}
}
})
emit('ready')
Expand Down
106 changes: 0 additions & 106 deletions src/components/primevueOverride/TreePlus.vue

This file was deleted.

6 changes: 3 additions & 3 deletions src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
@search="handleSearch"
:placeholder="$t('searchNodes') + '...'"
/>
<TreePlus
<Tree
class="node-lib-tree"
v-model:expandedKeys="expandedKeys"
selectionMode="single"
Expand Down Expand Up @@ -62,7 +62,7 @@
@toggleBookmark="toggleBookmark(node.data.display_name)"
/>
</template>
</TreePlus>
</Tree>
<div
v-if="hoveredComfyNode"
class="node-lib-node-preview"
Expand All @@ -89,7 +89,7 @@ import {
import { computed, ref, nextTick } from 'vue'
import type { TreeNode } from 'primevue/treenode'
import NodeTreeLeaf from './nodeLibrary/NodeTreeLeaf.vue'
import TreePlus from '@/components/primevueOverride/TreePlus.vue'
import Tree from 'primevue/tree'
import NodePreview from '@/components/node/NodePreview.vue'
import SearchBox from '@/components/common/SearchBox.vue'
import SidebarTabTemplate from '@/components/sidebar/tabs/SidebarTabTemplate.vue'
Expand Down
25 changes: 24 additions & 1 deletion src/components/sidebar/tabs/nodeLibrary/NodeTreeLeaf.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<template>
<div class="node-tree-leaf">
<div class="node-tree-leaf" ref="container">
<div class="node-content">
<Tag
v-if="node.experimental"
Expand All @@ -24,6 +24,9 @@
import Button from 'primevue/button'
import Tag from 'primevue/tag'
import { ComfyNodeDefImpl } from '@/stores/nodeDefStore'
import { onMounted, onUnmounted, ref } from 'vue'
import { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'
import { CanvasDragAndDropData } from '@/types/litegraphTypes'
const props = defineProps<{
node: ComfyNodeDefImpl
Expand All @@ -37,6 +40,26 @@ const emit = defineEmits<{
const toggleBookmark = () => {
emit('toggle-bookmark', props.node)
}
const container = ref<HTMLElement | null>(null)
let draggableCleanup: () => void
onMounted(() => {
const treeNodeElement = container.value?.closest(
'.p-tree-node'
) as HTMLElement
draggableCleanup = draggable({
element: treeNodeElement,
getInitialData() {
return {
type: 'add-node',
data: props.node
} as CanvasDragAndDropData<ComfyNodeDefImpl>
}
})
})
onUnmounted(() => {
draggableCleanup()
})
</script>

<style scoped>
Expand Down
5 changes: 5 additions & 0 deletions src/types/litegraphTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,8 @@ export class ConnectingLinkImpl implements ConnectingLink {
}
}
}

export type CanvasDragAndDropData<T = any> = {
type: 'add-node'
data: T
}

0 comments on commit b884622

Please sign in to comment.