2626 nodeLabel: 'node-lib-tree-node-label',
2727 nodeChildren: ({ props }) => ({
2828 'data-comfy-node-name': props.node?.data?.name,
29- onMouseenter: (event: MouseEvent) => {
30- hoveredComfyNodeName = props.node?.data?.name
31-
32- const hoverTarget = event.target as HTMLElement
33- const targetRect = hoverTarget.getBoundingClientRect()
34- if (sidebarLocation === 'left') {
35- nodePreviewStyle.top = `${targetRect.top - 40}px`
36- nodePreviewStyle.left = `${targetRect.right}px`
37- } else {
38- nodePreviewStyle.top = `${targetRect.top - 40}px`
39- nodePreviewStyle.left = `${targetRect.left - 400}px`
40- }
41- },
29+ onMouseenter: (event: MouseEvent) =>
30+ handleNodeHover(event, props.node?.data?.name),
4231 onMouseleave: () => {
4332 hoveredComfyNodeName = null
4433 }
6352 :style =" nodePreviewStyle"
6453 >
6554 <NodePreview
55+ ref =" previewRef"
6656 :key =" hoveredComfyNode.name"
6757 :nodeDef =" hoveredComfyNode"
6858 ></NodePreview >
7565import Badge from ' primevue/badge'
7666import ToggleButton from ' primevue/togglebutton'
7767import { ComfyNodeDefImpl , useNodeDefStore } from ' @/stores/nodeDefStore'
78- import { computed , ref } from ' vue'
68+ import { computed , ref , nextTick } from ' vue'
7969import type { TreeNode } from ' primevue/treenode'
8070import TreePlus from ' @/components/primevueOverride/TreePlus.vue'
8171import NodePreview from ' @/components/node/NodePreview.vue'
@@ -92,6 +82,7 @@ const hoveredComfyNode = computed<ComfyNodeDefImpl | null>(() => {
9282 }
9383 return nodeDefStore .nodeDefsByName [hoveredComfyNodeName .value ] || null
9484})
85+ const previewRef = ref <InstanceType <typeof NodePreview > | null >(null )
9586
9687const settingStore = useSettingStore ()
9788const sidebarLocation = computed <' left' | ' right' >(() =>
@@ -128,4 +119,30 @@ const fillNodeInfo = (node: TreeNode): TreeNode => {
128119 : children .reduce ((acc , child ) => acc + child .totalNodes , 0 )
129120 }
130121}
122+
123+ const handleNodeHover = async (
124+ event : MouseEvent ,
125+ nodeName : string | undefined
126+ ) => {
127+ hoveredComfyNodeName .value = nodeName || null
128+
129+ if (! nodeName ) return
130+
131+ const hoverTarget = event .target as HTMLElement
132+ const targetRect = hoverTarget .getBoundingClientRect ()
133+
134+ await nextTick ()
135+
136+ const previewHeight = previewRef .value ?.$el .offsetHeight || 0
137+ const availableSpaceBelow = window .innerHeight - targetRect .bottom
138+
139+ nodePreviewStyle .value .top = previewHeight > availableSpaceBelow
140+ ? ` ${Math .max (0 , targetRect .top - (previewHeight - availableSpaceBelow ) - 20 )}px `
141+ : ` ${targetRect .top - 40 }px `
142+ if (sidebarLocation .value === ' left' ) {
143+ nodePreviewStyle .value .left = ` ${targetRect .right }px `
144+ } else {
145+ nodePreviewStyle .value .left = ` ${targetRect .left - 400 }px `
146+ }
147+ }
131148 </script >
0 commit comments