Files

73 lines
2.1 KiB
JavaScript

/** @type {import("@comfyorg/comfyui-frontend-types").ComfyExtension} */
export default {
name: "dynamicInputs",
beforeRegisterNodeDef(nodeType, nodeData, app) {
if (nodeType.comfyClass === "DrawThingsLoRA") {
// update inputs when a new node is added
setCallback(nodeType.prototype, "onAdded", function (graph) {
updateInputs(this)
})
// or when the model changes
setCallback(nodeType.prototype, "onWidgetChanged", function (name, value, old_Value, widget) {
updateInputs(this)
})
}
},
}
/** @param {LGraphNode} node */
function updateInputs(node) {
const s = saveSize(node)
// the first input should always be lora
if (node.inputs.length < 1 || node.inputs.length > 2 || node.inputs[0].type !== "DT_LORA") {
for (let i = node.inputs.length - 1; i >= 0; i--) {
node.removeInput(i)
}
node.addInput("lora", "DT_LORA")
}
const modelWidget = node?.widgets?.find((w) => w.options?.modelType)
if (!modelWidget) return
const modifier = modelWidget.value?.value?.modifier
if (modifier) {
if (node.inputs.length < 2 || node.inputs[1]?.type !== "IMAGE") {
node.removeInput(1)
node.addInput("control_image", "IMAGE")
}
} else {
while (node.inputs.length > 1) {
node.removeInput(1)
}
}
s()
}
/** @param {LGraphNode} node */
function saveSize(node) {
const width = node.width
return () => node.setSize([width, node.computeSize()[1]])
}
/**
* @template {Object} T
* @template {keyof T} K
* @param {T} target
* @param {K} callbackName
* @param {T[K]} callback
*/
export function setCallback(target, callbackName, callback) {
const originalCallback = target[callbackName]
target[callbackName] = function (...args) {
const r = originalCallback?.apply(this, args)
callback?.apply(this, args)
return r
}
}
/** @import { ComfyApi, ComfyApp } from "@comfyorg/comfyui-frontend-types"; */
/** @import { LGraphNode } from "@comfyorg/litegraph" */