Files
numz-Comfyui-FlowChain/web/js/widgets.js
T

147 lines
5.0 KiB
JavaScript

import { ComfyWidgets } from '../../../scripts/widgets.js'
export function getDefaultOptions(type, value = 0){
let options = {};
switch(type){
case "INT":
options = {default: value, "min": 0, "max": 18446744073709551616, "step": 1};
break;
case "FLOAT":
options = {default: value, "min": 0.00, "max": 2048.00, "step": 0.01};
break;
default:
options = {};
}
return options;
}
export function addWidgets(root_obj, field_name, value, app){
let type = value.type;
if (type == "converted-widget"){
type = value.origType;
}
// S'assurer que le nœud a un objet de stockage local pour ses définitions d'entrée
if (!root_obj.local_input_defs) {
root_obj.local_input_defs = {
required: {},
optional: {}
};
}
if ((type == "STRING" || type =="text") && field_name != "workflow"){
ComfyWidgets.STRING(root_obj, field_name, ['STRING', getDefaultOptions("STRING", value.value),],app,)
// Stocker la définition localement au lieu de modifier nodeData
root_obj.local_input_defs.required[field_name] = ["STRING", getDefaultOptions("STRING", value.value)];
}
if (type == "INT" || type == "number"){
ComfyWidgets.INT(
root_obj,
field_name,
['INT', getDefaultOptions("INT", value.value),],
app,
)
// Stocker la définition localement
root_obj.local_input_defs.required[field_name] = ["INT", getDefaultOptions("INT", value.value)];
}
if (type == "FLOAT"){
ComfyWidgets.FLOAT(
root_obj,
field_name,
['FLOAT',getDefaultOptions("FLOAT", value.value),],
app,
)
// Stocker la définition localement
root_obj.local_input_defs.required[field_name] = ["FLOAT", getDefaultOptions("FLOAT", value.value)];
}
if (type == "BOOLEAN" || type == "toggle"){
root_obj.addWidget("toggle",field_name, value.value, ()=>{});
// Stocker la définition localement
root_obj.local_input_defs.required[field_name] = ["BOOLEAN", getDefaultOptions("BOOLEAN", value.value)];
}
/*
if (field_name == "workflow"){
root_obj.addWidget("STRING", field_name, value.value, ()=>{});
root_obj.widgets[root_obj.widgets.length - 1].hidden = true;
// Stocker la définition localement
root_obj.local_input_defs.required[field_name] = ["STRING", {}];
}*/
if (type == "IMAGE") root_obj.addInput(field_name, "IMAGE");
if (type == "LATENT") root_obj.addInput(field_name, "LATENT");
if (type == "MODEL") root_obj.addInput(field_name, "MODEL");
if (type == "CLIP") root_obj.addInput(field_name, "CLIP");
if (type == "MASK") root_obj.addInput(field_name, "MASK");
if (type == "CONDITIONING") root_obj.addInput(field_name, "CONDITIONING");
if (type == "VAE") root_obj.addInput(field_name, "VAE");
}
export function hideWidget(
node,
widget,
options = {}
) {
const { suffix = '', holdSpace = true } = options
if (widget.type?.startsWith("converted-widget")) return
widget.origType = widget.type
widget.origComputeSize = widget.computeSize
widget.origSerializeValue = widget.serializeValue
// @ts-expect-error custom widget type
widget.type = "converted-widget" + suffix
if (holdSpace) {
widget.computeSize = () => [0, LiteGraph.NODE_WIDGET_HEIGHT]
widget.serializeValue = (node, index) => {
// Prevent serializing the widget if we have no input linked
if (!node.inputs) {
return undefined
}
let node_input = node.inputs.find((i) => i.widget?.name === widget.name)
if (!node_input || !node_input.link) {
return undefined
}
return widget.origSerializeValue
? widget.origSerializeValue(node, index)
: widget.value
}
} else {
// -4 is due to the gap litegraph adds between widgets automatically
widget.computeSize = () => [0, -4]
widget.serializeValue = (node, index) => {
return widget.origSerializeValue
? widget.origSerializeValue(node, index)
: widget.value
}
}
// Hide any linked widgets, e.g. seed+seedControl
if (widget.linkedWidgets) {
for (const w of widget.linkedWidgets) {
hideWidget(node, w, { suffix: ':' + widget.name, holdSpace: false })
}
}
}
export function convertToInput(
node,
widget
) {
hideWidget(node, widget)
// Add input and store widget config for creating on primitive node
const [oldWidth, oldHeight] = node.size
for (const widget of node.widgets) {
widget.last_y += LiteGraph.NODE_SLOT_HEIGHT
}
// Restore original size but grow if needed
node.setSize([
Math.max(oldWidth, node.size[0]),
Math.max(oldHeight, node.size[1])
])
return node
}