Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
0728175
Align headers
benceruleanlu Jul 8, 2025
1c3d117
Correct positioning of collapse button
benceruleanlu Jul 8, 2025
e0ef8ca
Correct rounding
benceruleanlu Jul 8, 2025
cdc2654
Update locales [skip ci]
invalid-email-address Jul 8, 2025
5a8e7f7
Adds basic collapsing
benceruleanlu Jul 8, 2025
14b3300
Sync collapsing with litegraph
benceruleanlu Jul 8, 2025
233ecd7
Change hidden to disabled
benceruleanlu Jul 8, 2025
e411fea
Revert "Change hidden to disabled"
benceruleanlu Jul 8, 2025
fbb0421
v-show not v-if
benceruleanlu Jul 8, 2025
36e8d2d
Add title editing functionality
benceruleanlu Jul 9, 2025
8a6f877
Remove watch for now
benceruleanlu Jul 9, 2025
54e6771
Remove dead 'title-edit' emit from NodeHeader
benceruleanlu Jul 9, 2025
dc78933
Replace hardcoded -30px margin with NODE_TITLE_HEIGHT constant
benceruleanlu Jul 9, 2025
74867db
Add title watcher
benceruleanlu Jul 10, 2025
6d018d1
Add collapsed state watcher
benceruleanlu Jul 10, 2025
2dba60c
Use node.collapse()
benceruleanlu Jul 10, 2025
fe215db
Remove logic handling from display component
benceruleanlu Jul 10, 2025
ec4a355
Remove title attribute from collapse/expand button in NodeHeader.vue
benceruleanlu Jul 10, 2025
57f46ad
Temporarily remove CLAUDE.md
benceruleanlu Jul 18, 2025
e7f8d44
Add support for property change events in graph node manager
benceruleanlu Jul 20, 2025
b791d95
Fix double click propagation bug
benceruleanlu Jul 20, 2025
9ba09ec
Refactor jank offset
benceruleanlu Jul 20, 2025
cb13491
Vue Node Widgets (#4360)
benceruleanlu Aug 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add title editing functionality
  • Loading branch information
benceruleanlu committed Jul 9, 2025
commit 36e8d2dcbee4706b7b73c61115c3affe68ff898e
12 changes: 12 additions & 0 deletions src/components/graph/GraphCanvas.vue
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
:data-node-id="nodeData.id"
@node-click="handleNodeSelect"
@update:collapsed="handleNodeCollapse"
@update:title="handleNodeTitleUpdate"
/>
</TransformPane>

Expand Down Expand Up @@ -471,6 +472,17 @@ const handleNodeCollapse = (nodeId: string, collapsed: boolean) => {
node.flags.collapsed = collapsed
}

// Handle node title updates
const handleNodeTitleUpdate = (nodeId: string, newTitle: string) => {
if (!nodeManager) return

const node = nodeManager.getNode(nodeId)
if (!node) return

// Update the node title in LiteGraph for persistence
node.title = newTitle
}

watchEffect(() => {
nodeDefStore.showDeprecated = settingStore.get('Comfy.Node.ShowDeprecated')
})
Expand Down
6 changes: 6 additions & 0 deletions src/components/graph/vueNodes/LGraphNode.vue
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
:lod-level="lodLevel"
:collapsed="isCollapsed"
@collapse="handleCollapse"
@update:title="handleTitleUpdate"
/>

<!-- Node Body - rendered based on LOD level and collapsed state -->
Expand Down Expand Up @@ -116,6 +117,7 @@ const emit = defineEmits<{
isInput: boolean
]
'update:collapsed': [nodeId: string, collapsed: boolean]
'update:title': [nodeId: string, newTitle: string]
}>()

// LOD (Level of Detail) system based on zoom level
Expand Down Expand Up @@ -181,6 +183,10 @@ const handleSlotClick = (
emit('slot-click', event, props.nodeData, slotIndex, isInput)
}

const handleTitleUpdate = (newTitle: string) => {
emit('update:title', props.nodeData.id, newTitle)
}

// Expose methods for parent to control dragging state
defineExpose({
setDragging(dragging: boolean) {
Expand Down
42 changes: 38 additions & 4 deletions src/components/graph/vueNodes/NodeHeader.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,21 @@
</button>

<!-- Node Title -->
<span class="text-sm font-medium truncate flex-1">
{{ nodeInfo?.title || 'Untitled' }}
</span>
<div class="text-sm font-medium truncate flex-1">
<EditableText
:model-value="displayTitle"
:is-editing="isEditing"
@edit="handleTitleEdit"
/>
</div>
</div>
</template>

<script setup lang="ts">
import type { LGraphNode } from '@comfyorg/litegraph'
import { computed, onErrorCaptured, ref } from 'vue'
import { computed, onErrorCaptured, ref, watch } from 'vue'

import EditableText from '@/components/common/EditableText.vue'
import type { VueNodeData } from '@/composables/graph/useGraphNodeManager'
import type { LODLevel } from '@/composables/graph/useLOD'
import { useErrorHandling } from '@/composables/useErrorHandling'
Expand All @@ -52,6 +57,7 @@ const props = defineProps<NodeHeaderProps>()
const emit = defineEmits<{
collapse: []
'title-edit': []
'update:title': [newTitle: string]
}>()

// Error boundary implementation
Expand All @@ -64,8 +70,24 @@ onErrorCaptured((error) => {
return false
})

// Editing state
const isEditing = ref(false)

const nodeInfo = computed(() => props.nodeData || props.node)

// Local state for title to provide immediate feedback
const displayTitle = ref(nodeInfo.value?.title || 'Untitled')

// Watch for external title changes (e.g., from litegraph or other sources)
watch(
() => nodeInfo.value?.title,
(newTitle) => {
if (newTitle && newTitle !== displayTitle.value) {
displayTitle.value = newTitle
}
}
)

// Compute header color based on node color property or type
const headerColor = computed(() => {
const info = nodeInfo.value
Expand Down Expand Up @@ -101,7 +123,19 @@ const handleCollapse = () => {

const handleDoubleClick = () => {
if (!props.readonly) {
isEditing.value = true
emit('title-edit')
}
}

const handleTitleEdit = (newTitle: string) => {
isEditing.value = false
const trimmedTitle = newTitle.trim()
if (trimmedTitle && trimmedTitle !== displayTitle.value) {
// Update local state immediately for instant feedback
displayTitle.value = trimmedTitle
// Emit for litegraph sync
emit('update:title', trimmedTitle)
}
}
</script>
3 changes: 2 additions & 1 deletion src/composables/graph/useGraphNodeManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,8 @@ export const useGraphNodeManager = (graph: LGraph): GraphNodeManager => {
executing: false, // Will be updated separately based on execution state
widgets: safeWidgets,
inputs: node.inputs ? [...node.inputs] : undefined,
outputs: node.outputs ? [...node.outputs] : undefined
outputs: node.outputs ? [...node.outputs] : undefined,
flags: node.flags ? { ...node.flags } : undefined
}
}

Expand Down