From 0dfbcfb2d63779f1bf6ddfceda52f84776fdc31e Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Mon, 19 Aug 2024 19:09:34 +0100 Subject: [PATCH] Support clicking on library entries to toggle expand/insert node (#511) * Support clicking on library entries to toggle expand/insert node * Fix type --- .../sidebar/tabs/NodeLibrarySidebarTab.vue | 41 ++++++++++++++++++- src/scripts/app.ts | 5 +++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue b/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue index 4e7e7c80d..9be23a6c6 100644 --- a/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue +++ b/src/components/sidebar/tabs/NodeLibrarySidebarTab.vue @@ -24,6 +24,16 @@ dragSelector=".p-tree-node-leaf" :pt="{ nodeLabel: 'node-lib-tree-node-label', + nodeContent: ({ props }) => ({ + onClick: () => { + if (!props.node.key) return + if (props.node.type === 'folder') { + toggleNode(props.node.key) + } else { + insertNode(props.node.data) + } + } + }), nodeChildren: ({ props }) => ({ 'data-comfy-node-name': props.node?.data?.name, onMouseenter: (event: MouseEvent) => @@ -31,6 +41,12 @@ onMouseleave: () => { hoveredComfyNodeName = null } + }), + nodeToggleButton: () => ({ + onClick: (e: MouseEvent) => { + // Prevent toggle action as the node controls it + e.stopImmediatePropagation() + } }) }" > @@ -71,6 +87,8 @@ import TreePlus from '@/components/primevueOverride/TreePlus.vue' import NodePreview from '@/components/node/NodePreview.vue' import SidebarTabTemplate from '@/components/sidebar/tabs/SidebarTabTemplate.vue' import { useSettingStore } from '@/stores/settingStore' +import { app } from '@/scripts/app' +import { ComfyNodeDef } from '@/types/apiTypes' const nodeDefStore = useNodeDefStore() const alphabeticalSort = ref(false) @@ -136,7 +154,8 @@ const handleNodeHover = async ( const previewHeight = previewRef.value?.$el.offsetHeight || 0 const availableSpaceBelow = window.innerHeight - targetRect.bottom - nodePreviewStyle.value.top = previewHeight > availableSpaceBelow + nodePreviewStyle.value.top = + previewHeight > availableSpaceBelow ? `${Math.max(0, targetRect.top - (previewHeight - availableSpaceBelow) - 20)}px` : `${targetRect.top - 40}px` if (sidebarLocation.value === 'left') { @@ -145,4 +164,24 @@ const handleNodeHover = async ( nodePreviewStyle.value.left = `${targetRect.left - 400}px` } } + +const toggleNode = (id: string) => { + if (id in expandedKeys.value) { + delete expandedKeys.value[id] + } else { + expandedKeys.value[id] = true + } +} + +const insertNode = (nodeDef: ComfyNodeDefImpl) => { + app.addNodeOnGraph(nodeDef, { pos: app.getCanvasCenter() }) +} + + diff --git a/src/scripts/app.ts b/src/scripts/app.ts index 090191b5b..911319aa4 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -2951,6 +2951,11 @@ export class ComfyApp { ([p, o1, o2]) => (p - o2) / this.canvas.ds.scale - o1 ) as Vector2 } + + getCanvasCenter() { + const [x, y, w, h] = app.canvas.ds.visible_area + return [x + w / 2, y + h / 2] + } } export const app = new ComfyApp()