258 lines
8.3 KiB
JavaScript
258 lines
8.3 KiB
JavaScript
import { app } from "../../scripts/app.js";
|
|
import { setCallback } from "./dynamicInputs.js";
|
|
|
|
const teaCacheVersions = ["svd_i2v", "Video", "wan", "flux1", "wan_v2.1_1.3b"];
|
|
const numFramesVersions = ["svd_i2v", "Video", "wan", "wan_v2.1_1.3b"];
|
|
|
|
const allWidgets = [
|
|
"settings",
|
|
"server",
|
|
"port",
|
|
"model",
|
|
"strength",
|
|
"seed",
|
|
"seed_mode",
|
|
"width",
|
|
"height",
|
|
"steps",
|
|
// "num_frames", // For now not touching widgets that are hidden/shown by other widgets
|
|
"cfg",
|
|
// "speed_up",
|
|
"sampler_name",
|
|
// "res_dpt_shift",
|
|
"shift",
|
|
// zero neg
|
|
// sep clip
|
|
"clip_skip",
|
|
"sharpness",
|
|
"mask_blur",
|
|
"mask_blur_outset",
|
|
"preserve_original",
|
|
// ti embed
|
|
];
|
|
const basicWidgets = [
|
|
"server",
|
|
"port",
|
|
// "model",
|
|
"strength",
|
|
"seed",
|
|
"width",
|
|
"height",
|
|
"steps",
|
|
"cfg",
|
|
"sampler_name",
|
|
// "res_dpt_shift",
|
|
"shift",
|
|
];
|
|
const advancedWidgets = [
|
|
"seed_mode",
|
|
// "speed_up",
|
|
// zero neg
|
|
// sep clip
|
|
"clip_skip",
|
|
"sharpness",
|
|
"mask_blur",
|
|
"mask_blur_outset",
|
|
"preserve_original",
|
|
// ti embed
|
|
];
|
|
|
|
const getSetWidgets = [
|
|
"settings",
|
|
"model",
|
|
"high_res_fix",
|
|
"tiled_decoding",
|
|
"tiled_diffusion",
|
|
"tea_cache",
|
|
|
|
"control_name",
|
|
];
|
|
const getSetTypes = ["DrawThingsSampler", "DrawThingsControlNet"];
|
|
|
|
let origProps = {};
|
|
|
|
function findWidgetByName(node, name) {
|
|
return node.widgets.find((w) => w.name === name);
|
|
}
|
|
|
|
function doesInputWithNameExist(node, name) {
|
|
return node.inputs ? node.inputs.some((input) => input.name === name) : false;
|
|
}
|
|
|
|
function showWidget(node, widget, show = false, suffix = "") {
|
|
widget = findWidgetByName(node, widget);
|
|
if (!widget || !doesInputWithNameExist(node, widget.name)) return;
|
|
if (!origProps[widget.name]) {
|
|
origProps[widget.name] = {
|
|
origType: widget.type,
|
|
origComputeSize: widget.computeSize,
|
|
origComputedHeight: widget.computedHeight,
|
|
};
|
|
}
|
|
|
|
widget.type = show ? origProps[widget.name].origType : "hidden" + suffix;
|
|
widget.computeSize = show ? origProps[widget.name].origComputeSize : () => [0, -4];
|
|
widget.computedHeight = show ? origProps[widget.name].origComputedHeight : 0;
|
|
|
|
widget.linkedWidgets?.forEach((w) => showWidget(node, w, ":" + widget.name, show));
|
|
|
|
const minHeight = node.computeSize()[1];
|
|
if (minHeight > node.size[1]) node.setSize([node.size[0], minHeight]);
|
|
app.canvas.dirty_canvas = true;
|
|
}
|
|
|
|
function widgetLogic(node, widget) {
|
|
switch (widget.name) {
|
|
case "settings":
|
|
// First show all, then either hide basic or advanced
|
|
allWidgets.forEach(listAllWidgets);
|
|
function listAllWidgets(listedWidget) {
|
|
// console.log(listedWidget);
|
|
showWidget(node, listedWidget, true);
|
|
}
|
|
|
|
switch (widget.value) {
|
|
case "Basic":
|
|
// Hide advanced
|
|
advancedWidgets.forEach(listAdvancedWidgets);
|
|
function listAdvancedWidgets(listedWidget) {
|
|
showWidget(node, listedWidget, false);
|
|
}
|
|
break;
|
|
case "Advanced":
|
|
// Hide basic
|
|
basicWidgets.forEach(listBasicWidgets);
|
|
function listBasicWidgets(listedWidget) {
|
|
showWidget(node, listedWidget, false);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case "model":
|
|
const selectedModel = widget.value;
|
|
const version = selectedModel?.value?.version;
|
|
if (!version) break;
|
|
|
|
let isSD3 = version === "sd3";
|
|
let isFlux = version === "flux1";
|
|
let isVideo = ["svdI2v", "Video", "wan"].includes(version);
|
|
|
|
let supportTeaCache = teaCacheVersions.includes(version);
|
|
showWidget(node, "tea_cache", supportTeaCache);
|
|
|
|
let teaCacheEnabled = supportTeaCache && findWidgetByName(node, "tea_cache")?.value;
|
|
showWidget(node, "tea_cache_start", teaCacheEnabled);
|
|
showWidget(node, "tea_cache_end", teaCacheEnabled);
|
|
showWidget(node, "tea_cache_threshold", teaCacheEnabled);
|
|
|
|
// if (isFlux === false && isVideo === false) {
|
|
// showWidget(node, "tea_cache", false);
|
|
// showWidget(node, "tea_cache_start", false);
|
|
// showWidget(node, "tea_cache_end", false);
|
|
// showWidget(node, "tea_cache_threshold", false);
|
|
// } else {
|
|
// showWidget(node, "tea_cache", true);
|
|
// if (findWidgetByName(node, "tea_cache").value === false) {
|
|
// showWidget(node, "tea_cache_start", false);
|
|
// showWidget(node, "tea_cache_end", false);
|
|
// showWidget(node, "tea_cache_threshold", false);
|
|
// } else {
|
|
// showWidget(node, "tea_cache_start", true);
|
|
// showWidget(node, "tea_cache_end", true);
|
|
// showWidget(node, "tea_cache_threshold", true);
|
|
// }
|
|
// }
|
|
|
|
if (isSD3 === false && isFlux === false) {
|
|
showWidget(node, "res_dpt_shift", false);
|
|
} else {
|
|
showWidget(node, "res_dpt_shift", true);
|
|
}
|
|
|
|
showWidget(node, "speed_up", isFlux);
|
|
showWidget(node, "num_frames", numFramesVersions.includes(version));
|
|
break;
|
|
|
|
case "high_res_fix":
|
|
showWidget(node, "high_res_fix_start_width", widget.value);
|
|
showWidget(node, "high_res_fix_start_height", widget.value);
|
|
showWidget(node, "high_res_fix_strength", widget.value);
|
|
break;
|
|
|
|
case "tiled_decoding":
|
|
showWidget(node, "decoding_tile_width", widget.value);
|
|
showWidget(node, "decoding_tile_height", widget.value);
|
|
showWidget(node, "decoding_tile_overlap", widget.value);
|
|
break;
|
|
|
|
case "tiled_diffusion":
|
|
showWidget(node, "diffusion_tile_width", widget.value);
|
|
showWidget(node, "diffusion_tile_height", widget.value);
|
|
showWidget(node, "diffusion_tile_overlap", widget.value);
|
|
break;
|
|
|
|
case "tea_cache":
|
|
showWidget(node, "tea_cache_start", widget.value);
|
|
showWidget(node, "tea_cache_end", widget.value);
|
|
showWidget(node, "tea_cache_threshold", widget.value);
|
|
break;
|
|
|
|
case "control_name":
|
|
if (widget.value.value != null) {
|
|
const modifier = widget.value.value.modifier;
|
|
const typeWidget = findWidgetByName(node, "control_input_type");
|
|
const options = typeWidget.options.values;
|
|
const option = options.find((option) => option.toLowerCase() == modifier);
|
|
if (option != null) {
|
|
typeWidget.value = option;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/** @param {import("@comfyorg/litegraph").LGraphNode} node */
|
|
function getSetters(node) {
|
|
if (node.widgets) {
|
|
for (const w of node.widgets) {
|
|
if (getSetWidgets.includes(w.name)) {
|
|
widgetLogic(node, w);
|
|
let widgetValue = w.value;
|
|
|
|
// Define getters and setters for widget values
|
|
Object.defineProperty(w, "value", {
|
|
get() {
|
|
return widgetValue;
|
|
},
|
|
set(newVal) {
|
|
if (newVal !== widgetValue) {
|
|
widgetValue = newVal;
|
|
widgetLogic(node, w);
|
|
}
|
|
},
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
app.registerExtension({
|
|
name: "ComfyUI-DrawThings-gRPC-Widgets",
|
|
|
|
async nodeCreated(node) {
|
|
const nodeType = node.constructor.type;
|
|
if (getSetTypes.includes(nodeType)) {
|
|
getSetters(node);
|
|
}
|
|
},
|
|
async afterConfigureGraph() {
|
|
app.graph._nodes.forEach(listNodes);
|
|
function listNodes(node) {
|
|
const nodeType = node.constructor.type;
|
|
if (getSetTypes.includes(nodeType)) {
|
|
getSetters(node);
|
|
}
|
|
}
|
|
},
|
|
});
|