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