Files

95 lines
3.7 KiB
JavaScript

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 { addHelp, getConnectedInputNodesAndFilterPassThroughs } from "./utils.js";
const MODE_MUTE = 2;
const MODE_ALWAYS = 0;
class RandomUnmuterNode extends BaseAnyInputConnectedNode {
constructor(title = RandomUnmuterNode.title) {
super(title);
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);
}
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;
}
}
static setUp(clazz) {
BaseAnyInputConnectedNode.setUp(clazz);
addHelp(clazz);
}
handleLinkedNodesStabilization(linkedNodes) {
}
}
RandomUnmuterNode.exposedActions = ['Mute all', 'Enable all'];
RandomUnmuterNode.type = NodeTypesString.RANDOM_UNMUTER;
RandomUnmuterNode.title = RandomUnmuterNode.type;
RandomUnmuterNode.help = [
`Use this node to unmute on of its inputs randomly when the graph is queued (and, immediately`,
`mute it back).`,
`\n`,
`\n- NOTE: All input nodes MUST be muted to start; if not this node will not randomly unmute another.`,
`\n(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.)`,
`\n- 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.`,
].join(" ");
app.registerExtension({
name: "rgthree.RandomUnmuter",
registerCustomNodes() {
RandomUnmuterNode.setUp(RandomUnmuterNode);
},
loadedGraphNode(node) {
if (node.type == RandomUnmuterNode.title) {
node._tempWidth = node.size[0];
}
}
});