mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-25 16:59:45 +00:00
Generate drag preview for node library nodes (#2387)
This commit is contained in:
@@ -34,6 +34,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview'
|
||||||
import Badge from 'primevue/badge'
|
import Badge from 'primevue/badge'
|
||||||
import { Ref, computed, inject, ref } from 'vue'
|
import { Ref, computed, inject, ref } from 'vue'
|
||||||
|
|
||||||
@@ -102,7 +103,17 @@ if (props.node.draggable) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onDragStart: () => emit('dragStart', props.node),
|
onDragStart: () => emit('dragStart', props.node),
|
||||||
onDrop: () => emit('dragEnd', props.node)
|
onDrop: () => emit('dragEnd', props.node),
|
||||||
|
onGenerateDragPreview: props.node.renderDragPreview
|
||||||
|
? ({ nativeSetDragImage }) => {
|
||||||
|
setCustomNativeDragPreview({
|
||||||
|
render: ({ container }) => {
|
||||||
|
return props.node.renderDragPreview(props.node, container)
|
||||||
|
},
|
||||||
|
nativeSetDragImage
|
||||||
|
})
|
||||||
|
}
|
||||||
|
: undefined
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,11 +66,12 @@ import Button from 'primevue/button'
|
|||||||
import Divider from 'primevue/divider'
|
import Divider from 'primevue/divider'
|
||||||
import Popover from 'primevue/popover'
|
import Popover from 'primevue/popover'
|
||||||
import type { TreeNode } from 'primevue/treenode'
|
import type { TreeNode } from 'primevue/treenode'
|
||||||
import { Ref, computed, nextTick, ref } from 'vue'
|
import { Ref, computed, h, nextTick, ref, render } from 'vue'
|
||||||
|
|
||||||
import SearchBox from '@/components/common/SearchBox.vue'
|
import SearchBox from '@/components/common/SearchBox.vue'
|
||||||
import { SearchFilter } from '@/components/common/SearchFilterChip.vue'
|
import { SearchFilter } from '@/components/common/SearchFilterChip.vue'
|
||||||
import TreeExplorer from '@/components/common/TreeExplorer.vue'
|
import TreeExplorer from '@/components/common/TreeExplorer.vue'
|
||||||
|
import NodePreview from '@/components/node/NodePreview.vue'
|
||||||
import NodeSearchFilter from '@/components/searchbox/NodeSearchFilter.vue'
|
import NodeSearchFilter from '@/components/searchbox/NodeSearchFilter.vue'
|
||||||
import SidebarTabTemplate from '@/components/sidebar/tabs/SidebarTabTemplate.vue'
|
import SidebarTabTemplate from '@/components/sidebar/tabs/SidebarTabTemplate.vue'
|
||||||
import NodeTreeLeaf from '@/components/sidebar/tabs/nodeLibrary/NodeTreeLeaf.vue'
|
import NodeTreeLeaf from '@/components/sidebar/tabs/nodeLibrary/NodeTreeLeaf.vue'
|
||||||
@@ -125,6 +126,13 @@ const renderedRoot = computed<TreeExplorerNode<ComfyNodeDefImpl>>(() => {
|
|||||||
},
|
},
|
||||||
children,
|
children,
|
||||||
draggable: node.leaf,
|
draggable: node.leaf,
|
||||||
|
renderDragPreview: (node, container) => {
|
||||||
|
const vnode = h(NodePreview, { nodeDef: node.data })
|
||||||
|
render(vnode, container)
|
||||||
|
return () => {
|
||||||
|
render(null, container)
|
||||||
|
}
|
||||||
|
},
|
||||||
handleClick: (
|
handleClick: (
|
||||||
node: RenderedTreeExplorerNode<ComfyNodeDefImpl>,
|
node: RenderedTreeExplorerNode<ComfyNodeDefImpl>,
|
||||||
e: MouseEvent
|
e: MouseEvent
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { LGraphNode } from '@comfyorg/litegraph'
|
import { LGraphNode } from '@comfyorg/litegraph'
|
||||||
|
import { LiteGraph } from '@comfyorg/litegraph'
|
||||||
import { Ref } from 'vue'
|
import { Ref } from 'vue'
|
||||||
|
|
||||||
import { usePragmaticDroppable } from '@/hooks/dndHooks'
|
import { usePragmaticDroppable } from '@/hooks/dndHooks'
|
||||||
@@ -28,8 +29,8 @@ export const useCanvasDrop = (canvasRef: Ref<HTMLCanvasElement>) => {
|
|||||||
// Add an offset on x to make sure after adding the node, the cursor
|
// Add an offset on x to make sure after adding the node, the cursor
|
||||||
// is on the node (top left corner)
|
// is on the node (top left corner)
|
||||||
const pos = comfyApp.clientPosToCanvasPos([
|
const pos = comfyApp.clientPosToCanvasPos([
|
||||||
loc.clientX - 20,
|
loc.clientX,
|
||||||
loc.clientY
|
loc.clientY + LiteGraph.NODE_TITLE_HEIGHT
|
||||||
])
|
])
|
||||||
litegraphService.addNodeOnGraph(nodeDef, { pos })
|
litegraphService.addNodeOnGraph(nodeDef, { pos })
|
||||||
} else if (node.data instanceof ComfyModelDef) {
|
} else if (node.data instanceof ComfyModelDef) {
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ export interface TreeExplorerNode<T = any> {
|
|||||||
) => void | Promise<void>
|
) => void | Promise<void>
|
||||||
/** Whether the node is draggable */
|
/** Whether the node is draggable */
|
||||||
draggable?: boolean
|
draggable?: boolean
|
||||||
|
/** Function to render a drag preview */
|
||||||
|
renderDragPreview?: (
|
||||||
|
node: TreeExplorerNode<T>,
|
||||||
|
container: HTMLElement
|
||||||
|
) => void | (() => void)
|
||||||
/** Whether the node is droppable */
|
/** Whether the node is droppable */
|
||||||
droppable?: boolean
|
droppable?: boolean
|
||||||
/** Function to handle dropping a node */
|
/** Function to handle dropping a node */
|
||||||
|
|||||||
Reference in New Issue
Block a user