147 lines
5.0 KiB
JavaScript
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
|
|
} |