| import { api } from "../../scripts/api.js"; |
| import { app } from "../../scripts/app.js"; |
| |
|
|
| |
| |
| |
| |
| function setNodeState(event) { |
| let nodes = app.graph._nodes_by_id; |
| let node = nodes[event.detail.node_id]; |
| if(node) { |
| if(event.detail.node_mode == 0) |
| node.mode = 0; |
| else if(event.detail.node_mode == 2) |
| node.mode = 2; |
| else if(event.detail.node_mode == 4) |
| node.mode = 4; |
| } |
| } |
|
|
| api.addEventListener("jakeupgrade-node-state", setNodeState); |
|
|
| |
| |
| |
| |
| let origProps = {}; |
|
|
| const doesInputWithNameExist = (node, name) => { |
| return node.inputs ? node.inputs.some((input) => input.name === name) : false; |
| }; |
|
|
| const HIDDEN_TAG = "tschide"; |
|
|
| function toggleWidget(node, widget, show = false, suffix = "") { |
| if (!widget || doesInputWithNameExist(node, widget.name)) return; |
|
|
| |
| if (!origProps[widget.name]) { |
| origProps[widget.name] = { origType: widget.type, origComputeSize: widget.computeSize }; |
| } |
|
|
| const origSize = node.size; |
|
|
| |
| widget.type = show ? origProps[widget.name].origType : HIDDEN_TAG + suffix; |
| widget.computeSize = show ? origProps[widget.name].origComputeSize : () => [0, -4]; |
|
|
| |
| widget.linkedWidgets?.forEach(w => toggleWidget(node, w, ":" + widget.name, show)); |
|
|
| |
| const newHeight = node.computeSize()[1]; |
| node.setSize([node.size[0], newHeight]); |
| } |
| |
| function toggleInput(node, widget, AddOrRemove = false, dataType = "") { |
| if (!widget) return; |
| |
| if (AddOrRemove) { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| this.addInput(widget, dataType); |
| } |
| else { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| this.removeInput(widget); |
| } |
| } |
|
|
| const findWidgetByName = (node, name) => { |
| return node.widgets ? node.widgets.find((w) => w.name === name) : null; |
| }; |
|
|
| function handleInputModeWidgetsVisibility(node, inputModeValue) { |
| |
| function generateWidgetNames(baseName, count) { |
| return Array.from({ length: count }, (_, i) => `${baseName}_${i + 1}`); |
| } |
|
|
| |
| const AnimPromptJKPromptNegWidgets = [...generateWidgetNames("prompt_neg", 20)]; |
| const LoraStackLoraWidgets = [...generateWidgetNames("lora_weight", 6)]; |
| const LoraStackModelWidgets = [...generateWidgetNames("model_weight", 6)]; |
| const LoraStackClipWidgets = [...generateWidgetNames("clip_weight", 6)]; |
| const TIStackAppendWidgets = [...generateWidgetNames("append", 6)]; |
| |
| const InputModeInvisibilityNodesMap = { |
| "Animation Prompt JK": { |
| "simple": ["prompt_neg_pre", "prompt_neg_app", ...AnimPromptJKPromptNegWidgets], |
| "advanced": [] |
| }, |
| "CR Load LoRA JK": { |
| "simple": ["model_weight", "clip_weight"], |
| "advanced": ["lora_weight"] |
| }, |
| "CR LoRA Stack JK": { |
| "simple": [...LoraStackModelWidgets, ...LoraStackClipWidgets], |
| "advanced": [...LoraStackLoraWidgets] |
| }, |
| "Embedding Picker Multi JK": { |
| "simple": [...TIStackAppendWidgets], |
| "advanced": [] |
| }, |
| }; |
|
|
| const InputModeWidgetInvisibilityMap = InputModeInvisibilityNodesMap[node.comfyClass]; |
| |
| if (!InputModeWidgetInvisibilityMap || !InputModeWidgetInvisibilityMap[inputModeValue]) return; |
|
|
| |
| for (const key in InputModeWidgetInvisibilityMap) { |
| for (const widgetName of InputModeWidgetInvisibilityMap[key]) { |
| const widget = findWidgetByName(node, widgetName); |
| toggleWidget(node, widget, true); |
| } |
| } |
|
|
| |
| for (const widgetName of InputModeWidgetInvisibilityMap[inputModeValue]) { |
| const widget = findWidgetByName(node, widgetName); |
| toggleWidget(node, widget, false); |
| } |
| } |
|
|
| function handleWidgetsVisibility(node, countValue, node_type) { |
| |
| const WidgetInvisibilityNodesMap = { |
| "Animation Prompt JK": ["keyframe_frame", "prompt_pos", "prompt_neg"], |
| "Animation Value JK": ["keyframe_frame", "keyframe_value"], |
| "CR LoRA Stack JK": ["lora", "lora_name", "lora_weight", "model_weight", "clip_weight"], |
| "Embedding Picker Multi JK": ["embedding", "embedding_name", "emphasis", "append"], |
| "CR Multi-ControlNet Stack JK": ["ControlNet_Unit", "controlnet", "controlnet_strength", "start_percent", "end_percent"], |
| }; |
| |
| if (node_type === "Animation Prompt JK") { |
| |
| const inputModeValue = findWidgetByName(node, "input_mode").value; |
| const InvisibleWidgetNames = WidgetInvisibilityNodesMap[node_type]; |
| const promptNegPreWidget = findWidgetByName(node, `prompt_neg_pre`); |
| const promptNegPostWidget = findWidgetByName(node, `prompt_neg_app`); |
| |
| if (inputModeValue === "simple") { |
| toggleWidget(node, promptNegPreWidget, false); |
| toggleWidget(node, promptNegPostWidget, false); |
| } |
| else if (inputModeValue === "advanced") { |
| toggleWidget(node, promptNegPreWidget, true); |
| toggleWidget(node, promptNegPostWidget, true); |
| } |
| |
| for (let i = 1; i <= 20; i++) { |
| |
| const InvisibleWidget0 = findWidgetByName(node, `${InvisibleWidgetNames[0]}_${i}`); |
| const InvisibleWidget1 = findWidgetByName(node, `${InvisibleWidgetNames[1]}_${i}`); |
| const InvisibleWidget2 = findWidgetByName(node, `${InvisibleWidgetNames[2]}_${i}`); |
|
|
| if (i <= countValue) { |
| if (inputModeValue === "simple") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, false); |
| } |
| else if (inputModeValue === "advanced") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, true); |
| } |
| } |
| else { |
| toggleWidget(node, InvisibleWidget0, false); |
| toggleWidget(node, InvisibleWidget1, false); |
| toggleWidget(node, InvisibleWidget2, false); |
| } |
| } |
| } |
| else if (node_type === "Animation Value JK") { |
| |
| for (let i = 1; i <= 20; i++) { |
| |
| const InvisibleWidgetNames = WidgetInvisibilityNodesMap[node_type]; |
| const InvisibleWidget0 = findWidgetByName(node, `${InvisibleWidgetNames[0]}_${i}`); |
| const InvisibleWidget1 = findWidgetByName(node, `${InvisibleWidgetNames[1]}_${i}`); |
| |
|
|
| if (i <= countValue) { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| } |
| else { |
| toggleWidget(node, InvisibleWidget0, false); |
| toggleWidget(node, InvisibleWidget1, false); |
| } |
| } |
| } |
| else if (node_type === "CR LoRA Stack JK") { |
| |
| const inputModeValue = findWidgetByName(node, "input_mode").value; |
| const InvisibleWidgetNames = WidgetInvisibilityNodesMap[node_type]; |
| |
| for (let i = 1; i <= 6; i++) { |
| |
| const InvisibleWidget0 = findWidgetByName(node, `${InvisibleWidgetNames[0]}_${i}`); |
| const InvisibleWidget1 = findWidgetByName(node, `${InvisibleWidgetNames[1]}_${i}`); |
| const InvisibleWidget2 = findWidgetByName(node, `${InvisibleWidgetNames[2]}_${i}`); |
| const InvisibleWidget3 = findWidgetByName(node, `${InvisibleWidgetNames[3]}_${i}`); |
| const InvisibleWidget4 = findWidgetByName(node, `${InvisibleWidgetNames[4]}_${i}`); |
|
|
| if (i <= countValue) { |
| if (inputModeValue === "simple") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, true); |
| toggleWidget(node, InvisibleWidget3, false); |
| toggleWidget(node, InvisibleWidget4, false); |
| } |
| else if (inputModeValue === "advanced") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, false); |
| toggleWidget(node, InvisibleWidget3, true); |
| toggleWidget(node, InvisibleWidget4, true); |
| } |
| } |
| else { |
| toggleWidget(node, InvisibleWidget0, false); |
| toggleWidget(node, InvisibleWidget1, false); |
| toggleWidget(node, InvisibleWidget2, false); |
| toggleWidget(node, InvisibleWidget3, false); |
| toggleWidget(node, InvisibleWidget4, false); |
| } |
| } |
| } |
| else if (node_type === "Embedding Picker Multi JK") { |
| |
| const inputModeValue = findWidgetByName(node, "input_mode").value; |
| const InvisibleWidgetNames = WidgetInvisibilityNodesMap[node_type]; |
| |
| for (let i = 1; i <= 6; i++) { |
| |
| const InvisibleWidget0 = findWidgetByName(node, `${InvisibleWidgetNames[0]}_${i}`); |
| const InvisibleWidget1 = findWidgetByName(node, `${InvisibleWidgetNames[1]}_${i}`); |
| const InvisibleWidget2 = findWidgetByName(node, `${InvisibleWidgetNames[2]}_${i}`); |
| const InvisibleWidget3 = findWidgetByName(node, `${InvisibleWidgetNames[3]}_${i}`); |
|
|
| if (i <= countValue) { |
| if (inputModeValue === "simple") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, true); |
| toggleWidget(node, InvisibleWidget3, false); |
| } |
| else if (inputModeValue === "advanced") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, true); |
| toggleWidget(node, InvisibleWidget3, true); |
| } |
| } |
| else { |
| toggleWidget(node, InvisibleWidget0, false); |
| toggleWidget(node, InvisibleWidget1, false); |
| toggleWidget(node, InvisibleWidget2, false); |
| toggleWidget(node, InvisibleWidget3, false); |
| } |
| } |
| } |
| else if (node_type === "CR Multi-ControlNet Stack JK") { |
| |
| const inputModeValue = findWidgetByName(node, "input_mode").value; |
| const InvisibleWidgetNames = WidgetInvisibilityNodesMap[node_type]; |
| |
| for (let i = 0; i <= 5; i++) { |
| |
| const InvisibleWidget0 = findWidgetByName(node, `${InvisibleWidgetNames[0]}_${i}`); |
| const InvisibleWidget1 = findWidgetByName(node, `${InvisibleWidgetNames[1]}_${i}`); |
| const InvisibleWidget2 = findWidgetByName(node, `${InvisibleWidgetNames[2]}_${i}`); |
| const InvisibleWidget3 = findWidgetByName(node, `${InvisibleWidgetNames[3]}_${i}`); |
| const InvisibleWidget4 = findWidgetByName(node, `${InvisibleWidgetNames[4]}_${i}`); |
|
|
| if (i <= countValue) { |
| if (inputModeValue === "simple") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, true); |
| toggleWidget(node, InvisibleWidget3, false); |
| toggleWidget(node, InvisibleWidget4, false); |
| } |
| else if (inputModeValue === "advanced") { |
| toggleWidget(node, InvisibleWidget0, true); |
| toggleWidget(node, InvisibleWidget1, true); |
| toggleWidget(node, InvisibleWidget2, true); |
| toggleWidget(node, InvisibleWidget3, true); |
| toggleWidget(node, InvisibleWidget4, true); |
| } |
| } |
| else { |
| toggleWidget(node, InvisibleWidget0, false); |
| toggleWidget(node, InvisibleWidget1, false); |
| toggleWidget(node, InvisibleWidget2, false); |
| toggleWidget(node, InvisibleWidget3, false); |
| toggleWidget(node, InvisibleWidget4, false); |
| } |
| } |
| } |
| } |
| |
| function handleInputsAddRemove(node, countValue, node_type) { |
| const InputsAddRemoveNodesMap = { |
| "CR Multi-ControlNet Stack JK": ["image", "image_MetaData"], |
| }; |
| |
| if (node_type === "CR Multi-ControlNet Stack JK") { |
| |
| const InputNames = InputsAddRemoveNodesMap[node_type]; |
| |
| for (let i = 1; i <= 5; i++) { |
| |
| const Input0 = findWidgetByName(node, `${InputNames[0]}_${i}`); |
| const Input1 = findWidgetByName(node, `${InputNames[1]}_${i}`); |
| |
| if (Input0 === null) { |
| Input0 = `${InputNames[0]}_${i}`; |
| } |
| |
| if (Input1 === null) { |
| Input1 = `${InputNames[1]}_${i}`; |
| } |
| |
| if (i <= countValue) { |
| toggleInput(node, Input0, true, "image"); |
| toggleInput(node, Input1, true, "string"); |
| } |
| else { |
| toggleInput(node, Input0, false, "image"); |
| toggleInput(node, Input1, false, "string"); |
| } |
| } |
| } |
| } |
|
|
| const nodeWidgetHandlers = { |
| "Animation Prompt JK": { |
| 'input_mode': handleAinmPromptJKInputMode, |
| 'keyframe_count': handleAinmPromptJKFrameCount |
| }, |
| "Animation Value JK": { |
| 'keyframe_count': handleAinmValueJKFrameCount |
| }, |
| "CR Load LoRA JK": { |
| 'input_mode': handleLoraJKInputMode, |
| }, |
| "CR LoRA Stack JK": { |
| 'input_mode': handleLoraStackJKInputMode, |
| 'lora_count': handleLoraStackJKLoraCount |
| }, |
| "Embedding Picker Multi JK": { |
| 'input_mode': handleTIStackJKInputMode, |
| 'embedding_count': handleTIStackJKTICount |
| }, |
| "CR Multi-ControlNet Stack JK": { |
| 'input_mode': handleCNStackJKInputMode, |
| 'controlnet_count': handleCNStackJKCNCount |
| }, |
| }; |
|
|
| function handleAinmPromptJKInputMode(node, widget) { |
| |
| handleWidgetsVisibility(node, findWidgetByName(node, "keyframe_count").value, "Animation Prompt JK"); |
| } |
|
|
| function handleAinmPromptJKFrameCount(node, widget) { |
| handleWidgetsVisibility(node, widget.value, "Animation Prompt JK"); |
| } |
|
|
| function handleAinmValueJKFrameCount(node, widget) { |
| handleWidgetsVisibility(node, widget.value, "Animation Value JK"); |
| } |
|
|
| function handleLoraJKInputMode(node, widget) { |
| handleInputModeWidgetsVisibility(node, widget.value); |
| } |
|
|
| function handleLoraStackJKInputMode(node, widget) { |
| |
| handleWidgetsVisibility(node, findWidgetByName(node, "lora_count").value, "CR LoRA Stack JK"); |
| } |
|
|
| function handleLoraStackJKLoraCount(node, widget) { |
| handleWidgetsVisibility(node, widget.value, "CR LoRA Stack JK"); |
| } |
|
|
| function handleTIStackJKInputMode(node, widget) { |
| |
| handleWidgetsVisibility(node, findWidgetByName(node, "embedding_count").value, "Embedding Picker Multi JK"); |
| } |
|
|
| function handleTIStackJKTICount(node, widget) { |
| handleWidgetsVisibility(node, widget.value, "Embedding Picker Multi JK"); |
| } |
|
|
| function handleTIStackJKCount(node, widget) { |
| handleWidgetsVisibility(node, widget.value, "Embedding Picker Multi JK"); |
| } |
|
|
| function handleCNStackJKInputMode(node, widget) { |
| |
| handleWidgetsVisibility(node, findWidgetByName(node, "controlnet_count").value - 1, "CR Multi-ControlNet Stack JK"); |
| } |
|
|
| function handleCNStackJKCNCount(node, widget) { |
| handleWidgetsVisibility(node, widget.value - 1, "CR Multi-ControlNet Stack JK"); |
| |
| |
| } |
|
|
| function widgetLogic(node, widget) { |
| |
| const handler = nodeWidgetHandlers[node.comfyClass]?.[widget.name]; |
| if (handler) { |
| handler(node, widget); |
| } |
| } |
|
|
| app.registerExtension({ |
| name: "Comfy.JakeUpgrade", |
| |
| nodeCreated(node) { |
| for (const w of node.widgets || []) { |
| let widgetValue = w.value; |
|
|
| |
| let originalDescriptor = Object.getOwnPropertyDescriptor(w, 'value'); |
|
|
| widgetLogic(node, w); |
| |
| Object.defineProperty(w, 'value', { |
| get() { |
| |
| let valueToReturn = originalDescriptor && originalDescriptor.get |
| ? originalDescriptor.get.call(w) |
| : widgetValue; |
|
|
| return valueToReturn; |
| }, |
| set(newVal) { |
|
|
| |
| if (originalDescriptor && originalDescriptor.set) { |
| originalDescriptor.set.call(w, newVal); |
| } else { |
| widgetValue = newVal; |
| } |
|
|
| widgetLogic(node, w); |
| } |
| }); |
| } |
| setTimeout(() => {initialized = true;}, 500); |
| } |
| }); |