import { app } from "/scripts/app.js"; import { ComfyWidgets } from "/scripts/widgets.js"; import {CUSTOM_INT,CUSTOM_COMBO, recursiveLinkUpstream, transformFunc, swapInputs,swapOutputs, renameNodeInputs,renameNodeOutputs, removeNodeInputs,removeNodeOutputs, getDrawColor, computeCanvasSize} from "./utils.js" function addMultiTextSetMaskSelectCanvas(node, app) { const widget = { type: "customLamCanvas", name: "MultiTextSetMask-Canvas", get value() { return this.canvas.value; }, set value(x) { this.canvas.value = x; }, draw: function (ctx, node, widgetWidth, widgetY) { const values = node.properties["values"] const index = Math.round(node.widgets[node.index].value) const selectedColor = getDrawColor(index/values.length, "FF") ctx.fillStyle = selectedColor ctx.beginPath(); ctx.arc(LiteGraph.NODE_SLOT_HEIGHT*0.5, LiteGraph.NODE_SLOT_HEIGHT*(index+node.originalsize + 0.5)+4, 4, 0, Math.PI * 2); ctx.fill(); ctx.lineWidth = 1; ctx.strokeStyle = "white"; ctx.stroke(); if (node.selected) { const connectedNodes = recursiveLinkUpstream(node, node.inputs[index+node.originalsize].type, 0, index+node.originalsize) if (connectedNodes.length !== 0) { for(let i=0;i=0) { const onNodeCreated = nodeType.prototype.onNodeCreated; nodeType.prototype.onNodeCreated = function () { const r = onNodeCreated ? onNodeCreated.apply(this, arguments) : undefined; this.selected=false; this.defaultValue=null this.index=0 this.originalsize=4 this.inputType="STRING" this.inputPrefix="text" this.outputPrefix="" if('MultiTextSetGligen'==nodeData.name){ this.originalsize=5 this.defaultValue=1.0; }else if('MultiTextSetArea'==nodeData.name){ this.defaultValue=1.0; }else if('MultiTextSetMask'==nodeData.name){ this.defaultValue=[1.0,"default"]; }else if('MultiIPAdapterRegional'==nodeData.name){ this.originalsize=1 this.inputType="IMAGE" this.inputPrefix="image" this.defaultValue=[1.0,"linear",0.0,1.0] } if(this.defaultValue){ this.setProperty("values", [this.defaultValue,this.defaultValue]) } CUSTOM_INT( this, "index", 0, function (v, _, node) { let values = node.properties["values"] if(Array.isArray(values[v])){ for(let i=0;i obj.name === 'index') this.getExtraMenuOptions = function(_, options) { options.unshift( { content: `最前插入参 /\\`, callback: () => { this.addInput(this.inputPrefix, this.inputType) const inputLenth = this.inputs.length-1-this.originalsize const index = 0+this.originalsize for (let i = inputLenth; i > index; i--) { swapInputs(this, i, i-1) } renameNodeInputs(this, this.inputPrefix,this.originalsize) this.properties["values"].splice(index, 0, this.defaultValue) this.widgets[this.index].options.max = inputLenth this.setDirtyCanvas(true); }, }, { content: `最后插入参 \\/`, callback: () => { this.addInput(this.inputPrefix, this.inputType) const inputLenth = this.inputs.length-1-this.originalsize const index = this.widgets[this.index].value+this.originalsize renameNodeInputs(this, this.inputPrefix,this.originalsize) this.properties["values"].splice(index, 0, this.defaultValue) this.widgets[this.index].options.max = inputLenth this.setDirtyCanvas(true); }, }, { content: "删除全部未连接的入参框", callback: () => { let indexesToRemove = [] for (let i = 0; i < this.inputs.length; i++) { if(this.inputs[i].widget){ continue; } if (!this.inputs[i].link&&i>=this.originalsize) { indexesToRemove.push(i) } } removeNodeInputs(this, indexesToRemove,this.originalsize) renameNodeInputs(this, this.inputPrefix,this.originalsize) }, } ); } this.onSelected = function () { this.selected = true } this.onDeselected = function () { this.selected = false } return r; } } }, loadedGraphNode(node, _) { var names=["MultiTextSetMask","MultiTextSetArea","MultiTextSetGligen","MultiIPAdapterRegional"] if (names.indexOf(node.type)>=0) { node.widgets[node.index].options["max"] = node.properties["values"].length-1 } }, });