diff --git a/web/extensions/core/widgetInputs.js b/web/extensions/core/widgetInputs.js index d9eaf8a0..a6b1a1dc 100644 --- a/web/extensions/core/widgetInputs.js +++ b/web/extensions/core/widgetInputs.js @@ -5,7 +5,7 @@ const CONVERTED_TYPE = "converted-widget"; const VALID_TYPES = ["STRING", "combo", "number", "BOOLEAN"]; function isConvertableWidget(widget, config) { - return VALID_TYPES.includes(widget.type) || VALID_TYPES.includes(config[0]); + return (VALID_TYPES.includes(widget.type) || VALID_TYPES.includes(config[0])) && !widget.options?.forceInput; } function hideWidget(node, widget, suffix = "") { @@ -103,6 +103,9 @@ app.registerExtension({ let toInput = []; let toWidget = []; for (const w of this.widgets) { + if (w.options?.forceInput) { + continue; + } if (w.type === CONVERTED_TYPE) { toWidget.push({ content: `Convert ${w.name} to widget`, @@ -130,6 +133,20 @@ app.registerExtension({ return r; }; + const origOnNodeCreated = nodeType.prototype.onNodeCreated + nodeType.prototype.onNodeCreated = function () { + const r = origOnNodeCreated ? origOnNodeCreated.apply(this) : undefined; + if (this.widgets) { + for (const w of this.widgets) { + if (w?.options?.forceInput) { + const config = nodeData?.input?.required[w.name] || nodeData?.input?.optional?.[w.name] || [w.type, w.options || {}]; + convertToInput(this, w, config); + } + } + } + return r; + } + // On initial configure of nodes hide all converted widgets const origOnConfigure = nodeType.prototype.onConfigure; nodeType.prototype.onConfigure = function () { @@ -137,7 +154,7 @@ app.registerExtension({ if (this.inputs) { for (const input of this.inputs) { - if (input.widget) { + if (input.widget && !input.widget.config[1]?.forceInput) { const w = this.widgets.find((w) => w.name === input.widget.name); if (w) { hideWidget(this, w); @@ -374,7 +391,7 @@ app.registerExtension({ } for (const k in config1[1]) { - if (k !== "default") { + if (k !== "default" && k !== 'forceInput') { if (config1[1][k] !== config2[1][k]) { return false; } diff --git a/web/scripts/app.js b/web/scripts/app.js index 6a2c6329..42adfde8 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -1151,22 +1151,21 @@ export class ComfyApp { const inputData = inputs[inputName]; const type = inputData[0]; - if(inputData[1]?.forceInput) { - this.addInput(inputName, type); + if (Array.isArray(type)) { + // Enums + Object.assign(config, widgets.COMBO(this, inputName, inputData, app) || {}); + } else if (`${type}:${inputName}` in widgets) { + // Support custom widgets by Type:Name + Object.assign(config, widgets[`${type}:${inputName}`](this, inputName, inputData, app) || {}); + } else if (type in widgets) { + // Standard type widgets + Object.assign(config, widgets[type](this, inputName, inputData, app) || {}); } else { - if (Array.isArray(type)) { - // Enums - Object.assign(config, widgets.COMBO(this, inputName, inputData, app) || {}); - } else if (`${type}:${inputName}` in widgets) { - // Support custom widgets by Type:Name - Object.assign(config, widgets[`${type}:${inputName}`](this, inputName, inputData, app) || {}); - } else if (type in widgets) { - // Standard type widgets - Object.assign(config, widgets[type](this, inputName, inputData, app) || {}); - } else { - // Node connection inputs - this.addInput(inputName, type); - } + // Node connection inputs + this.addInput(inputName, type); + } + if(inputData[1]?.forceInput && config?.widget) { + config.widget.options.forceInput = inputData[1].forceInput; } }