| 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
|
| });
|
| });
|
| }
|
| },
|
| });
|
|
|
|
|