Skip to content

Commit 73b0ecc

Browse files
authored
fix preview nodes clipping under the bottom (#444)
for #411 - moves code to main typescript section (to avoid vue weirdness) and finds the preview node element, adjust top by height
1 parent 775f536 commit 73b0ecc

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

src/components/sidebar/tabs/NodeLibrarySidebarTab.vue

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,8 @@
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
}
@@ -63,6 +52,7 @@
6352
:style="nodePreviewStyle"
6453
>
6554
<NodePreview
55+
ref="previewRef"
6656
:key="hoveredComfyNode.name"
6757
:nodeDef="hoveredComfyNode"
6858
></NodePreview>
@@ -75,7 +65,7 @@
7565
import Badge from 'primevue/badge'
7666
import ToggleButton from 'primevue/togglebutton'
7767
import { ComfyNodeDefImpl, useNodeDefStore } from '@/stores/nodeDefStore'
78-
import { computed, ref } from 'vue'
68+
import { computed, ref, nextTick } from 'vue'
7969
import type { TreeNode } from 'primevue/treenode'
8070
import TreePlus from '@/components/primevueOverride/TreePlus.vue'
8171
import 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
9687
const settingStore = useSettingStore()
9788
const 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

Comments
 (0)