Skip to content

Commit 3f52e7c

Browse files
Seed controls added to Ksamplers (#296)
Co-authored-by: flyingshutter <[email protected]>
1 parent bada50f commit 3f52e7c

File tree

4 files changed

+53
-30
lines changed

4 files changed

+53
-30
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ temp/
88
custom_nodes/
99
!custom_nodes/example_node.py.example
1010
extra_model_paths.yaml
11+
/.vs

web/extensions/core/widgetInputs.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ComfyWidgets, addRandomizeWidget } from "/scripts/widgets.js";
1+
import { ComfyWidgets, addValueControlWidget } from "/scripts/widgets.js";
22
import { app } from "/scripts/app.js";
33

44
const CONVERTED_TYPE = "converted-widget";
@@ -23,7 +23,7 @@ function hideWidget(node, widget, suffix = "") {
2323
return widget.origSerializeValue ? widget.origSerializeValue() : widget.value;
2424
};
2525

26-
// Hide any linked widgets, e.g. seed+randomize
26+
// Hide any linked widgets, e.g. seed+seedControl
2727
if (widget.linkedWidgets) {
2828
for (const w of widget.linkedWidgets) {
2929
hideWidget(node, w, ":" + widget.name);
@@ -40,7 +40,7 @@ function showWidget(widget) {
4040
delete widget.origComputeSize;
4141
delete widget.origSerializeValue;
4242

43-
// Hide any linked widgets, e.g. seed+randomize
43+
// Hide any linked widgets, e.g. seed+seedControl
4444
if (widget.linkedWidgets) {
4545
for (const w of widget.linkedWidgets) {
4646
showWidget(w);
@@ -285,7 +285,7 @@ app.registerExtension({
285285
}
286286

287287
if (widget.type === "number") {
288-
addRandomizeWidget(this, widget, "Random after every gen");
288+
addValueControlWidget(this, widget, "fixed");
289289
}
290290

291291
// When our value changes, update other widgets to reflect our changes

web/scripts/app.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,11 @@ class ComfyApp {
949949
widget.value = widget.value.slice(7);
950950
}
951951
}
952+
if (widget.name == "control_after_generate") {
953+
if (widget.value == true) {
954+
widget.value = "randomize";
955+
}
956+
}
952957
}
953958
}
954959
}

web/scripts/widgets.js

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,54 @@ function getNumberDefaults(inputData, defaultStep) {
1010
return { val: defaultVal, config: { min, max, step: 10.0 * step } };
1111
}
1212

13-
export function addRandomizeWidget(node, targetWidget, name, defaultValue = false) {
14-
const randomize = node.addWidget("toggle", name, defaultValue, function (v) {}, {
15-
on: "enabled",
16-
off: "disabled",
17-
serialize: false, // Don't include this in prompt.
18-
});
19-
20-
randomize.afterQueued = () => {
21-
if (randomize.value) {
22-
const min = targetWidget.options?.min;
23-
let max = targetWidget.options?.max;
24-
if (min != null || max != null) {
25-
if (max) {
26-
// limit max to something that javascript can handle
27-
max = Math.min(1125899906842624, max);
28-
}
29-
targetWidget.value = Math.floor(Math.random() * ((max ?? 9999999999) - (min ?? 0) + 1) + (min ?? 0));
30-
} else {
31-
targetWidget.value = Math.floor(Math.random() * 1125899906842624);
32-
}
13+
export function addValueControlWidget(node, targetWidget, defaultValue = "randomize", values) {
14+
const valueControl = node.addWidget("combo", "control_after_generate", defaultValue, function (v) { }, {
15+
values: ["fixed", "increment", "decrement", "randomize"],
16+
serialize: false, // Don't include this in prompt.
17+
});
18+
valueControl.afterQueued = () => {
19+
20+
var v = valueControl.value;
21+
22+
let min = targetWidget.options.min;
23+
let max = targetWidget.options.max;
24+
// limit to something that javascript can handle
25+
max = Math.min(1125899906842624, max);
26+
min = Math.max(-1125899906842624, min);
27+
let range = (max - min) / (targetWidget.options.step / 10);
28+
29+
//adjust values based on valueControl Behaviour
30+
switch (v) {
31+
case "fixed":
32+
break;
33+
case "increment":
34+
targetWidget.value += targetWidget.options.step / 10;
35+
break;
36+
case "decrement":
37+
targetWidget.value -= targetWidget.options.step / 10;
38+
break;
39+
case "randomize":
40+
targetWidget.value = Math.floor(Math.random() * range) * (targetWidget.options.step / 10) + min;
41+
default:
42+
break;
3343
}
34-
};
35-
return randomize;
36-
}
44+
/*check if values are over or under their respective
45+
* ranges and set them to min or max.*/
46+
if (targetWidget.value < min)
47+
targetWidget.value = min;
48+
49+
if (targetWidget.value > max)
50+
targetWidget.value = max;
51+
}
52+
return valueControl;
53+
};
3754

3855
function seedWidget(node, inputName, inputData) {
3956
const seed = ComfyWidgets.INT(node, inputName, inputData);
40-
const randomize = addRandomizeWidget(node, seed.widget, "Random seed after every gen", true);
57+
const seedControl = addValueControlWidget(node, seed.widget, "randomize");
4158

42-
seed.widget.linkedWidgets = [randomize];
43-
return { widget: seed, randomize };
59+
seed.widget.linkedWidgets = [seedControl];
60+
return seed;
4461
}
4562

4663
const MultilineSymbol = Symbol();

0 commit comments

Comments
 (0)