mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-05 05:32:02 +00:00
66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import type { LGraphNode } from '@comfyorg/litegraph'
|
|
import { ref } from 'vue'
|
|
|
|
import StringWidget from '@/components/graph/widgets/StringWidget.vue'
|
|
import {
|
|
type InputSpec,
|
|
isStringInputSpec
|
|
} from '@/schemas/nodeDef/nodeDefSchemaV2'
|
|
import { ComponentWidgetImpl, addWidget } from '@/scripts/domWidget'
|
|
import { type ComfyWidgetConstructorV2 } from '@/scripts/widgetTypes'
|
|
|
|
const PADDING = 8
|
|
|
|
export const useStringWidgetVue = (options: { defaultValue?: string } = {}) => {
|
|
const widgetConstructor: ComfyWidgetConstructorV2 = (
|
|
node: LGraphNode,
|
|
inputSpec: InputSpec
|
|
) => {
|
|
if (!isStringInputSpec(inputSpec)) {
|
|
throw new Error(`Invalid input data: ${inputSpec}`)
|
|
}
|
|
|
|
// Initialize widget value
|
|
const widgetValue = ref<string>(
|
|
inputSpec.default ?? options.defaultValue ?? ''
|
|
)
|
|
|
|
// Create the Vue-based widget instance
|
|
const widget = new ComponentWidgetImpl<string>({
|
|
node,
|
|
name: inputSpec.name,
|
|
component: StringWidget,
|
|
inputSpec,
|
|
options: {
|
|
// Required: getter for widget value
|
|
getValue: () => widgetValue.value,
|
|
|
|
// Required: setter for widget value
|
|
setValue: (value: string) => {
|
|
widgetValue.value = value
|
|
},
|
|
|
|
// Optional: minimum height for the widget
|
|
getMinHeight: () => {
|
|
return inputSpec.multiline ? 80 + PADDING : 40 + PADDING
|
|
},
|
|
|
|
// Optional: whether to serialize this widget's value
|
|
serialize: true
|
|
}
|
|
})
|
|
|
|
// Add dynamic prompts support if specified
|
|
if (typeof inputSpec.dynamicPrompts === 'boolean') {
|
|
widget.dynamicPrompts = inputSpec.dynamicPrompts
|
|
}
|
|
|
|
// Register the widget with the node
|
|
addWidget(node, widget as any)
|
|
|
|
return widget
|
|
}
|
|
|
|
return widgetConstructor
|
|
}
|