3v324v23's picture
lfs
1e3b872
import { app } from "../../../scripts/app.js";
import { addMenuHandler } from "./common/utils.js";
function replaceNode(oldNode, newNodeName) {
const newNode = LiteGraph.createNode(newNodeName);
if (!newNode) {
return;
}
app.graph.add(newNode);
newNode.pos = oldNode.pos.slice();
// Transfer connections from old node to new node
// XY Plot and AnimateDiff have only one output
if(["XY Plot", "AnimateDiff Script"].includes(oldNode.type)) {
if (oldNode.outputs[0] && oldNode.outputs[0].links) {
oldNode.outputs[0].links.forEach(link => {
const targetLinkInfo = oldNode.graph.links[link];
if (targetLinkInfo) {
const targetNode = oldNode.graph.getNodeById(targetLinkInfo.target_id);
if (targetNode) {
newNode.connect(0, targetNode, targetLinkInfo.target_slot);
}
}
});
}
} else {
// Noise Control Script, HighRes-Fix Script, and Tiled Upscaler Script have 1 input and 1 output at index 0
if (oldNode.inputs[0] && oldNode.inputs[0].link !== null) {
const originLinkInfo = oldNode.graph.links[oldNode.inputs[0].link];
if (originLinkInfo) {
const originNode = oldNode.graph.getNodeById(originLinkInfo.origin_id);
if (originNode) {
originNode.connect(originLinkInfo.origin_slot, newNode, 0);
}
}
}
if (oldNode.outputs[0] && oldNode.outputs[0].links) {
oldNode.outputs[0].links.forEach(link => {
const targetLinkInfo = oldNode.graph.links[link];
if (targetLinkInfo) {
const targetNode = oldNode.graph.getNodeById(targetLinkInfo.target_id);
if (targetNode) {
newNode.connect(0, targetNode, targetLinkInfo.target_slot);
}
}
});
}
}
// Remove old node
app.graph.remove(oldNode);
}
function replaceNodeMenuCallback(currentNode, targetNodeName) {
return function() {
replaceNode(currentNode, targetNodeName);
};
}
function showSwapMenu(value, options, e, menu, node) {
const scriptNodes = [
"XY Plot",
"Noise Control Script",
"HighRes-Fix Script",
"Tiled Upscaler Script",
"AnimateDiff Script"
];
const swapOptions = scriptNodes.filter(n => n !== node.type).map(n => ({
content: n,
callback: replaceNodeMenuCallback(node, n)
}));
new LiteGraph.ContextMenu(swapOptions, {
event: e,
callback: null,
parentMenu: menu,
node: node
});
return false;
}
// Extension Definition
app.registerExtension({
name: "efficiency.SwapScripts",
async beforeRegisterNodeDef(nodeType, nodeData, app) {
if (["XY Plot", "Noise Control Script", "HighRes-Fix Script", "Tiled Upscaler Script", "AnimateDiff Script"].includes(nodeData.name)) {
addMenuHandler(nodeType, function (insertOption) {
insertOption({
content: "๐Ÿ”„ Swap with...",
has_submenu: true,
callback: showSwapMenu
});
});
}
},
});