Spaces:
Configuration error
Configuration error
| import { app } from "../../../scripts/app.js"; | |
| // Node that allows you to tunnel connections for cleaner graphs | |
| app.registerExtension({ | |
| name: "easy setNode", | |
| registerCustomNodes() { | |
| class SetNode { | |
| defaultVisibility = true; | |
| serialize_widgets = true; | |
| constructor() { | |
| if (!this.properties) { | |
| this.properties = { | |
| "previousName": "" | |
| }; | |
| } | |
| this.properties.showOutputText = SetNode.defaultVisibility; | |
| const node = this; | |
| node.color = LGraphCanvas.node_colors.blue.color; | |
| this.addWidget( | |
| "text", | |
| "Constant", | |
| '', | |
| (s, t, u, v, x) => { | |
| node.validateName(node.graph); | |
| if(this.widgets[0].value !== ''){ | |
| this.title = "Set_" + this.widgets[0].value; | |
| } | |
| this.update(); | |
| this.properties.previousName = this.widgets[0].value; | |
| }, | |
| {} | |
| ) | |
| this.addInput("*", "*"); | |
| this.onConnectionsChange = function( | |
| slotType, //1 = input, 2 = output | |
| slot, | |
| isChangeConnect, | |
| link_info, | |
| output | |
| ) { | |
| // console.log("onConnectionsChange"); | |
| //On Disconnect | |
| if (slotType == 1 && !isChangeConnect) { | |
| this.inputs[slot].type = '*'; | |
| this.inputs[slot].name = '*'; | |
| } | |
| //On Connect | |
| if (link_info && node.graph && slotType == 1 && isChangeConnect) { | |
| const fromNode = node.graph._nodes.find((otherNode) => otherNode.id == link_info.origin_id); | |
| const type = fromNode.outputs[link_info.origin_slot].type; | |
| if (this.title === "Set"){ | |
| this.title = "Set_" + type; | |
| } | |
| if (this.widgets[0].value === '*'){ | |
| this.widgets[0].value = type | |
| } | |
| this.validateName(node.graph); | |
| this.inputs[0].type = type; | |
| this.inputs[0].name = type; | |
| setTimeout(_=>{ | |
| if(type != this.widgets[0].value){ | |
| this.title = "Set_" + this.widgets[0].value; | |
| } | |
| },1) | |
| } | |
| //Update either way | |
| this.update(); | |
| } | |
| this.validateName = function(graph) { | |
| let widgetValue = node.widgets[0].value; | |
| if (widgetValue != '') { | |
| let tries = 0; | |
| let collisions = []; | |
| do { | |
| collisions = graph._nodes.filter((otherNode) => { | |
| if (otherNode == this) { | |
| return false; | |
| } | |
| if (otherNode.type == 'easy setNode' && otherNode.widgets[0].value === widgetValue) { | |
| return true; | |
| } | |
| return false; | |
| }) | |
| if (collisions.length > 0) { | |
| widgetValue = node.widgets[0].value + "_" + tries; | |
| } | |
| tries++; | |
| } while (collisions.length > 0) | |
| node.widgets[0].value = widgetValue; | |
| this.update(); | |
| } | |
| } | |
| this.clone = function () { | |
| const cloned = SetNode.prototype.clone.apply(this); | |
| cloned.inputs[0].name = '*'; | |
| cloned.inputs[0].type = '*'; | |
| cloned.properties.previousName = ''; | |
| cloned.size = cloned.computeSize(); | |
| return cloned; | |
| }; | |
| this.onAdded = function(graph) { | |
| this.validateName(graph); | |
| } | |
| this.update = function() { | |
| if (node.graph) { | |
| this.findGetters(node.graph).forEach((getter) => { | |
| getter.setType(this.inputs[0].type); | |
| }); | |
| if (this.widgets[0].value) { | |
| this.findGetters(node.graph, true).forEach((getter) => { | |
| getter.setName(this.widgets[0].value) | |
| }); | |
| } | |
| const allGetters = node.graph._nodes.filter((otherNode) => otherNode.type == "easy getNode"); | |
| allGetters.forEach((otherNode) => { | |
| if (otherNode.setComboValues) { | |
| otherNode.setComboValues(); | |
| } | |
| }) | |
| } | |
| } | |
| this.findGetters = function(graph, checkForPreviousName) { | |
| const name = checkForPreviousName ? this.properties.previousName : this.widgets[0].value; | |
| return graph._nodes.filter((otherNode) => { | |
| if (otherNode.type == 'easy getNode' && otherNode.widgets[0].value === name && name != '') { | |
| return true; | |
| } | |
| return false; | |
| }) | |
| } | |
| // This node is purely frontend and does not impact the resulting prompt so should not be serialized | |
| this.isVirtualNode = true; | |
| } | |
| onRemoved() { | |
| const allGetters = this.graph._nodes.filter((otherNode) => otherNode.type == "easy getNode"); | |
| allGetters.forEach((otherNode) => { | |
| if (otherNode.setComboValues) { | |
| otherNode.setComboValues([this]); | |
| } | |
| }) | |
| } | |
| } | |
| LiteGraph.registerNodeType( | |
| "easy setNode", | |
| Object.assign(SetNode, { | |
| title: "Set", | |
| }) | |
| ); | |
| SetNode.category = "EasyUse/Util"; | |
| }, | |
| }); | |
| app.registerExtension({ | |
| name: "easy getNode", | |
| registerCustomNodes() { | |
| class GetNode { | |
| defaultVisibility = true; | |
| serialize_widgets = true; | |
| constructor() { | |
| if (!this.properties) { | |
| this.properties = {}; | |
| } | |
| this.properties.showOutputText = GetNode.defaultVisibility; | |
| const node = this; | |
| node.color = LGraphCanvas.node_colors.blue.color; | |
| this.addWidget( | |
| "combo", | |
| "Constant", | |
| "", | |
| (e) => { | |
| this.onRename(); | |
| }, | |
| { | |
| values: () => { | |
| const setterNodes = node.graph._nodes.filter((otherNode) => otherNode.type == 'easy setNode'); | |
| return setterNodes.map((otherNode) => otherNode.widgets[0].value).sort(); | |
| } | |
| } | |
| ) | |
| this.addOutput("*", '*'); | |
| this.onConnectionsChange = function( | |
| slotType, //0 = output, 1 = input | |
| slot, //self-explanatory | |
| isChangeConnect, | |
| link_info, | |
| output | |
| ) { | |
| this.validateLinks(); | |
| setTimeout(_=>{ | |
| this.title = 'Get_' + this.widgets[0].value | |
| },1) | |
| } | |
| this.setName = function(name) { | |
| node.widgets[0].value = name; | |
| node.onRename(); | |
| node.serialize(); | |
| } | |
| this.onRename = function() { | |
| const setter = this.findSetter(node.graph); | |
| if (setter) { | |
| this.setType(setter.inputs[0].type); | |
| this.title = "Get_" + setter.widgets[0].value; | |
| } else { | |
| this.setType('*'); | |
| } | |
| } | |
| this.clone = function () { | |
| const cloned = GetNode.prototype.clone.apply(this); | |
| cloned.size = cloned.computeSize(); | |
| return cloned; | |
| }; | |
| this.validateLinks = function() { | |
| if (this.outputs[0].type != '*' && this.outputs[0].links) { | |
| this.outputs[0].links.forEach((linkId) => { | |
| const link = node.graph.links[linkId]; | |
| if (link && link.type != this.outputs[0].type && link.type != '*') { | |
| node.graph.removeLink(linkId) | |
| } | |
| }) | |
| } | |
| } | |
| this.setType = function(type) { | |
| this.outputs[0].name = type; | |
| this.outputs[0].type = type; | |
| this.validateLinks(); | |
| } | |
| this.findSetter = function(graph) { | |
| const name = this.widgets[0].value; | |
| return graph._nodes.find((otherNode) => { | |
| if (otherNode.type == 'easy setNode' && otherNode.widgets[0].value === name && name != '') { | |
| return true; | |
| } | |
| return false; | |
| }) | |
| } | |
| // This node is purely frontend and does not impact the resulting prompt so should not be serialized | |
| this.isVirtualNode = true; | |
| } | |
| getInputLink(slot) { | |
| const setter = this.findSetter(this.graph); | |
| if (setter) { | |
| const slot_info = setter.inputs[slot]; | |
| const link = this.graph.links[ slot_info.link ]; | |
| return link; | |
| } else { | |
| throw new Error("No setter found for " + this.widgets[0].value + "(" + this.type + ")"); | |
| } | |
| } | |
| onAdded(graph) { | |
| //this.setComboValues(); | |
| //this.validateName(graph); | |
| } | |
| } | |
| LiteGraph.registerNodeType( | |
| "easy getNode", | |
| Object.assign(GetNode, { | |
| title: "Get", | |
| }) | |
| ); | |
| GetNode.category = "EasyUse/Util"; | |
| }, | |
| }); |