diff --git a/.gitignore b/.gitignore index d311a2a09..df6adbe4b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ temp/ custom_nodes/ !custom_nodes/example_node.py.example extra_model_paths.yaml +/.vs diff --git a/web/extensions/core/widgetInputs.js b/web/extensions/core/widgetInputs.js index 7e6688261..4afb14110 100644 --- a/web/extensions/core/widgetInputs.js +++ b/web/extensions/core/widgetInputs.js @@ -1,13 +1,17 @@ -import { ComfyWidgets, addRandomizeWidget } from "/scripts/widgets.js"; +import { ComfyWidgets, addSeedControlWidget } from "/scripts/widgets.js"; import { app } from "/scripts/app.js"; const CONVERTED_TYPE = "converted-widget"; const VALID_TYPES = ["STRING", "combo", "number"]; function isConvertableWidget(widget, config) { - return VALID_TYPES.includes(widget.type) || VALID_TYPES.includes(config[0]); + if (widget.name == "seed control after generating") + widget.allowConvertToInput = false; + else + return VALID_TYPES.includes(widget.type) || VALID_TYPES.includes(config[0]); } + function hideWidget(node, widget, suffix = "") { widget.origType = widget.type; widget.origComputeSize = widget.computeSize; @@ -23,7 +27,7 @@ function hideWidget(node, widget, suffix = "") { return widget.value; }; - // Hide any linked widgets, e.g. seed+randomize + // Hide any linked widgets, e.g. seed+seedControl if (widget.linkedWidgets) { for (const w of widget.linkedWidgets) { hideWidget(node, w, ":" + widget.name); @@ -40,7 +44,7 @@ function showWidget(widget) { delete widget.origComputeSize; delete widget.origSerializeValue; - // Hide any linked widgets, e.g. seed+randomize + // Hide any linked widgets, e.g. seed+seedControl if (widget.linkedWidgets) { for (const w of widget.linkedWidgets) { showWidget(w); @@ -271,21 +275,35 @@ app.registerExtension({ } let widget; - if (type in ComfyWidgets) { - widget = (ComfyWidgets[type](this, "value", inputData, app) || {}).widget; + + // ComfyWidgets allows a subtype of widgets which is defined by ":" + // common example is "INT:seed" + // so let's check for those first + let combinedWidgetType = type + ":" + widgetName; + if (combinedWidgetType in ComfyWidgets) { + // widget = (ComfyWidgets[combinedWidgetType](this, "value", inputData, app) || {}).widget; + widget = (ComfyWidgets[combinedWidgetType](this, widgetName, inputData, app) || {}).widget; } else { - widget = this.addWidget(type, "value", null, () => {}, {}); - } + // we did not find a subtype, so proceed with "" only + if (type in ComfyWidgets) { + widget = (ComfyWidgets[type](this, widgetName/*"value*"*/, inputData, app) || {}).widget; + } else { + widget = this.addWidget(type, widgetName /*"value"*/, null, () => { }, {}); + } + + // addSeedControlWidget(node, seed.widget, "randomize"); - if (node?.widgets && widget) { - const theirWidget = node.widgets.find((w) => w.name === widgetName); - if (theirWidget) { - widget.value = theirWidget.value; + if (widget.type === "number") { + addSeedControlWidget(this, widget, "fixed seed"); } } - if (widget.type === "number") { - addRandomizeWidget(this, widget, "Random after every gen"); + if (node?.widgets && widget) { + + const theirWidget = node.widgets.find((w) => w.name === widgetName); + if (theirWidget) { + widget.value = theirWidget.value; + } } // When our value changes, update other widgets to reflect our changes diff --git a/web/scripts/app.js b/web/scripts/app.js index 501c7ea65..a55b3650a 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -828,11 +828,15 @@ class ComfyApp { widget.value = widget.value.slice(7); } } + if (widget.name == "seed control after generating") { + if (widget.value == true) { + widget.value = "randomize"; + } + } } } + this.#invokeExtensions("loadedGraphNode", node); } - - this.#invokeExtensions("loadedGraphNode", node); } } diff --git a/web/scripts/widgets.js b/web/scripts/widgets.js index 5f5043cd0..98a7c9e93 100644 --- a/web/scripts/widgets.js +++ b/web/scripts/widgets.js @@ -10,37 +10,56 @@ function getNumberDefaults(inputData, defaultStep) { return { val: defaultVal, config: { min, max, step: 10.0 * step } }; } -export function addRandomizeWidget(node, targetWidget, name, defaultValue = false) { - const randomize = node.addWidget("toggle", name, defaultValue, function (v) {}, { - on: "enabled", - off: "disabled", +export function addSeedControlWidget(node, targetWidget, defaultValue = "randomize", values) { + const seedControl = node.addWidget("combo", "seed control after generating", defaultValue, function (v) { }, { + values: ["fixed seed", "increment", "decrement", "randomize"], serialize: false, // Don't include this in prompt. - }); + }) + seedControl.afterQueued = () => { - randomize.afterQueued = () => { - if (randomize.value) { - const min = targetWidget.options?.min; - let max = targetWidget.options?.max; - if (min != null || max != null) { - if (max) { - // limit max to something that javascript can handle - max = Math.min(1125899906842624, max); + var v = seedControl.value; + + switch (v) { + case ("fixed seed"): + console.log("Fixed Seed"); + break; + case ("increment"): + targetWidget.value += 1; + console.log("increment"); + break; + case ("decrement"): + targetWidget.value -= 1; + console.log("decrement"); + break; + case ("randomize"): + const min = targetWidget.options?.min; + let max = targetWidget.options?.max; + if (min != null || max != null) { + if (max) { + // limit max to something that javascript can handle + max = Math.min(1125899906842624, max); + console.log("Random"); + } + targetWidget.value = Math.floor(Math.random() * ((max ?? 9999999999) - (min ?? 0) + 1) + (min ?? 0)); + console.log("Random"); + } else { + targetWidget.value = Math.floor(Math.random() * 1125899906842624); + console.log("Random"); } - targetWidget.value = Math.floor(Math.random() * ((max ?? 9999999999) - (min ?? 0) + 1) + (min ?? 0)); - } else { - targetWidget.value = Math.floor(Math.random() * 1125899906842624); - } + break; + default: + console.log("default (fail)"); } }; - return randomize; + return seedControl; } function seedWidget(node, inputName, inputData) { const seed = ComfyWidgets.INT(node, inputName, inputData); - const randomize = addRandomizeWidget(node, seed.widget, "Random seed after every gen", true); + const seedControl = addSeedControlWidget(node, seed.widget, "randomize"); - seed.widget.linkedWidgets = [randomize]; - return { widget: seed, randomize }; + seed.widget.linkedWidgets = [seedControl]; + return seed; } const MultilineSymbol = Symbol();