|
import { app } from "../../scripts/app.js"; |
|
import { BaseAnyInputConnectedNode } from "./base_any_input_connected_node.js"; |
|
import { NodeTypesString } from "./constants.js"; |
|
import { rgthree } from "./rgthree.js"; |
|
import { getConnectedInputNodesAndFilterPassThroughs } from "./utils.js"; |
|
const MODE_MUTE = 2; |
|
const MODE_ALWAYS = 0; |
|
class RandomUnmuterNode extends BaseAnyInputConnectedNode { |
|
constructor(title = RandomUnmuterNode.title) { |
|
super(title); |
|
this.comfyClass = NodeTypesString.RANDOM_UNMUTER; |
|
this.modeOn = MODE_ALWAYS; |
|
this.modeOff = MODE_MUTE; |
|
this.tempEnabledNode = null; |
|
this.processingQueue = false; |
|
this.onQueueBound = this.onQueue.bind(this); |
|
this.onQueueEndBound = this.onQueueEnd.bind(this); |
|
this.onGraphtoPromptBound = this.onGraphtoPrompt.bind(this); |
|
this.onGraphtoPromptEndBound = this.onGraphtoPromptEnd.bind(this); |
|
rgthree.addEventListener("queue", this.onQueueBound); |
|
rgthree.addEventListener("queue-end", this.onQueueEndBound); |
|
rgthree.addEventListener("graph-to-prompt", this.onGraphtoPromptBound); |
|
rgthree.addEventListener("graph-to-prompt-end", this.onGraphtoPromptEndBound); |
|
this.onConstructed(); |
|
} |
|
onRemoved() { |
|
rgthree.removeEventListener("queue", this.onQueueBound); |
|
rgthree.removeEventListener("queue-end", this.onQueueEndBound); |
|
rgthree.removeEventListener("graph-to-prompt", this.onGraphtoPromptBound); |
|
rgthree.removeEventListener("graph-to-prompt-end", this.onGraphtoPromptEndBound); |
|
} |
|
onQueue(event) { |
|
this.processingQueue = true; |
|
} |
|
onQueueEnd(event) { |
|
this.processingQueue = false; |
|
} |
|
onGraphtoPrompt(event) { |
|
if (!this.processingQueue) { |
|
return; |
|
} |
|
this.tempEnabledNode = null; |
|
const linkedNodes = getConnectedInputNodesAndFilterPassThroughs(this); |
|
let allMuted = true; |
|
if (linkedNodes.length) { |
|
for (const node of linkedNodes) { |
|
if (node.mode !== this.modeOff) { |
|
allMuted = false; |
|
break; |
|
} |
|
} |
|
if (allMuted) { |
|
this.tempEnabledNode = linkedNodes[Math.floor(Math.random() * linkedNodes.length)] || null; |
|
if (this.tempEnabledNode) { |
|
this.tempEnabledNode.mode = this.modeOn; |
|
} |
|
} |
|
} |
|
} |
|
onGraphtoPromptEnd(event) { |
|
if (this.tempEnabledNode) { |
|
this.tempEnabledNode.mode = this.modeOff; |
|
this.tempEnabledNode = null; |
|
} |
|
} |
|
handleLinkedNodesStabilization(linkedNodes) { |
|
} |
|
getHelp() { |
|
return ` |
|
<p> |
|
Use this node to unmute on of its inputs randomly when the graph is queued (and, immediately |
|
mute it back). |
|
</p> |
|
<ul> |
|
<li><p> |
|
NOTE: All input nodes MUST be muted to start; if not this node will not randomly unmute |
|
another. (This is powerful, as the generated image can be dragged in and the chosen input |
|
will already by unmuted and work w/o any further action.) |
|
</p></li> |
|
<li><p> |
|
TIP: Connect a Repeater's output to this nodes input and place that Repeater on a group |
|
without any other inputs, and it will mute/unmute the entire group. |
|
</p></li> |
|
</ul> |
|
`; |
|
} |
|
} |
|
RandomUnmuterNode.exposedActions = ["Mute all", "Enable all"]; |
|
RandomUnmuterNode.type = NodeTypesString.RANDOM_UNMUTER; |
|
RandomUnmuterNode.title = RandomUnmuterNode.type; |
|
app.registerExtension({ |
|
name: "rgthree.RandomUnmuter", |
|
registerCustomNodes() { |
|
RandomUnmuterNode.setUp(); |
|
}, |
|
loadedGraphNode(node) { |
|
if (node.type == RandomUnmuterNode.title) { |
|
node._tempWidth = node.size[0]; |
|
} |
|
}, |
|
}); |
|
|