| import { app } from "../../../scripts/app.js"; |
| import { addMenuHandler } from "./common/utils.js"; |
| import { addNode } from "./common/utils.js"; |
|
|
| const connectionMap = { |
| "KSampler (Efficient)": ["input", 5], |
| "KSampler Adv. (Efficient)": ["input", 5], |
| "KSampler SDXL (Eff.)": ["input", 3], |
| "XY Plot": ["output", 0], |
| "Noise Control Script": ["input & output", 0], |
| "HighRes-Fix Script": ["input & output", 0], |
| "Tiled Upscaler Script": ["input & output", 0], |
| "AnimateDiff Script": ["output", 0] |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| function addAndConnectScriptNode(scriptType, selectedNode) { |
| const selectedNodeType = connectionMap[selectedNode.type]; |
| const newNodeType = connectionMap[scriptType]; |
|
|
| |
| const newNode = addNode(scriptType, selectedNode, { shiftX: 0, shiftY: 0 }); |
|
|
| |
| if (newNodeType[0].includes("input") && selectedNodeType[0].includes("output")) { |
| newNode.pos[0] += selectedNode.size[0] + 50; |
| } else if (newNodeType[0].includes("output") && selectedNodeType[0].includes("input")) { |
| newNode.pos[0] -= (newNode.size[0] + 50); |
| } |
|
|
| |
| switch (selectedNodeType[0]) { |
| case "output": |
| if (newNodeType[0] === "input & output") { |
| |
| const connectedNodes = selectedNode.getOutputNodes(selectedNodeType[1]); |
| if (connectedNodes && connectedNodes.length) { |
| for (let connectedNode of connectedNodes) { |
| |
| selectedNode.disconnectOutput(selectedNodeType[1]); |
| |
| |
| const targetSlot = (connectedNode.type in connectionMap) ? connectionMap[connectedNode.type][1] : 0; |
| newNode.connect(0, connectedNode, targetSlot); |
| } |
| } |
| |
| selectedNode.connect(selectedNodeType[1], newNode, newNodeType[1]); |
| } |
| break; |
|
|
| case "input": |
| if (newNodeType[0] === "output") { |
| newNode.connect(0, selectedNode, selectedNodeType[1]); |
| } else if (newNodeType[0] === "input & output") { |
| const ogInputNode = selectedNode.getInputNode(selectedNodeType[1]); |
| if (ogInputNode) { |
| ogInputNode.connect(0, newNode, 0); |
| } |
| newNode.connect(0, selectedNode, selectedNodeType[1]); |
| } |
| break; |
| case "input & output": |
| if (newNodeType[0] === "output") { |
| newNode.connect(0, selectedNode, 0); |
| } else if (newNodeType[0] === "input & output") { |
|
|
| const connectedNodes = selectedNode.getOutputNodes(0); |
| if (connectedNodes && connectedNodes.length) { |
| for (let connectedNode of connectedNodes) { |
| selectedNode.disconnectOutput(0); |
| newNode.connect(0, connectedNode, connectedNode.type in connectionMap ? connectionMap[connectedNode.type][1] : 0); |
| } |
| } |
| |
| selectedNode.connect(selectedNodeType[1], newNode, newNodeType[1]); |
| } |
| break; |
| } |
|
|
| return newNode; |
| } |
|
|
| function createScriptEntry(node, scriptType) { |
| return { |
| content: scriptType, |
| callback: function() { |
| addAndConnectScriptNode(scriptType, node); |
| }, |
| }; |
| } |
|
|
| function getScriptOptions(nodeType, node) { |
| const allScriptTypes = [ |
| "XY Plot", |
| "Noise Control Script", |
| "HighRes-Fix Script", |
| "Tiled Upscaler Script", |
| "AnimateDiff Script" |
| ]; |
|
|
| |
| const scriptTypes = allScriptTypes.filter(scriptType => { |
| const scriptBehavior = connectionMap[scriptType][0]; |
| |
| if (connectionMap[nodeType][0] === "output") { |
| return scriptBehavior.includes("input"); |
| } else { |
| return true; |
| } |
| }); |
|
|
| return scriptTypes.map(script => createScriptEntry(node, script)); |
| } |
|
|
|
|
| function showAddScriptMenu(_, options, e, menu, node) { |
| const scriptOptions = getScriptOptions(node.type, node); |
| new LiteGraph.ContextMenu(scriptOptions, { |
| event: e, |
| callback: null, |
| parentMenu: menu, |
| node: node |
| }); |
| return false; |
| } |
|
|
| |
| app.registerExtension({ |
| name: "efficiency.addScripts", |
| async beforeRegisterNodeDef(nodeType, nodeData, app) { |
| if (connectionMap[nodeData.name]) { |
| addMenuHandler(nodeType, function(insertOption) { |
| insertOption({ |
| content: "📜 Add script...", |
| has_submenu: true, |
| callback: showAddScriptMenu |
| }); |
| }); |
| } |
| }, |
| }); |
|
|
|
|