|
import { app } from "../../scripts/app.js"; |
|
import { DynamicContextNodeBase } from "./dynamic_context_base.js"; |
|
import { NodeTypesString } from "./constants.js"; |
|
import { SERVICE as CONTEXT_SERVICE, getContextOutputName, } from "./services/context_service.js"; |
|
import { getConnectedInputNodesAndFilterPassThroughs } from "./utils.js"; |
|
import { debounce, moveArrayItem } from "../../rgthree/common/shared_utils.js"; |
|
import { measureText } from "./utils_canvas.js"; |
|
import { SERVICE as CONFIG_SERVICE } from "./services/config_service.js"; |
|
class DynamicContextSwitchNode extends DynamicContextNodeBase { |
|
constructor(title = DynamicContextSwitchNode.title) { |
|
super(title); |
|
this.hasShadowInputs = true; |
|
this.lastInputsList = []; |
|
this.shadowInputs = [ |
|
{ name: "base_ctx", type: "RGTHREE_DYNAMIC_CONTEXT", link: null, count: 0 }, |
|
]; |
|
} |
|
getContextInputsList() { |
|
return this.shadowInputs; |
|
} |
|
handleUpstreamMutation(mutation) { |
|
this.scheduleHardRefresh(); |
|
} |
|
onConnectionsChange(type, slotIndex, isConnected, link, ioSlot) { |
|
var _a; |
|
(_a = super.onConnectionsChange) === null || _a === void 0 ? void 0 : _a.call(this, type, slotIndex, isConnected, link, ioSlot); |
|
if (this.configuring) { |
|
return; |
|
} |
|
if (type === LiteGraph.INPUT) { |
|
this.scheduleHardRefresh(); |
|
} |
|
} |
|
scheduleHardRefresh(ms = 64) { |
|
return debounce(() => { |
|
this.refreshInputsAndOutputs(); |
|
}, ms); |
|
} |
|
onNodeCreated() { |
|
this.addInput("ctx_1", "RGTHREE_DYNAMIC_CONTEXT"); |
|
this.addInput("ctx_2", "RGTHREE_DYNAMIC_CONTEXT"); |
|
this.addInput("ctx_3", "RGTHREE_DYNAMIC_CONTEXT"); |
|
this.addInput("ctx_4", "RGTHREE_DYNAMIC_CONTEXT"); |
|
this.addInput("ctx_5", "RGTHREE_DYNAMIC_CONTEXT"); |
|
super.onNodeCreated(); |
|
} |
|
addContextInput(name, type, slot) { } |
|
refreshInputsAndOutputs() { |
|
var _a; |
|
const inputs = [ |
|
{ name: "base_ctx", type: "RGTHREE_DYNAMIC_CONTEXT", link: null, count: 0 }, |
|
]; |
|
let numConnected = 0; |
|
for (let i = 0; i < this.inputs.length; i++) { |
|
const childCtxs = getConnectedInputNodesAndFilterPassThroughs(this, this, i); |
|
if (childCtxs.length > 1) { |
|
throw new Error("How is there more than one input?"); |
|
} |
|
const ctx = childCtxs[0]; |
|
if (!ctx) |
|
continue; |
|
numConnected++; |
|
const slotsData = CONTEXT_SERVICE.getDynamicContextInputsData(ctx); |
|
console.log(slotsData); |
|
for (const slotData of slotsData) { |
|
const found = inputs.find((n) => getContextOutputName(slotData.name) === getContextOutputName(n.name)); |
|
if (found) { |
|
found.count += 1; |
|
continue; |
|
} |
|
inputs.push({ |
|
name: slotData.name, |
|
type: slotData.type, |
|
link: null, |
|
count: 1, |
|
}); |
|
} |
|
} |
|
this.shadowInputs = inputs; |
|
let i = 0; |
|
for (i; i < this.shadowInputs.length; i++) { |
|
const data = this.shadowInputs[i]; |
|
let existing = this.outputs.find((o) => getContextOutputName(o.name) === getContextOutputName(data.name)); |
|
if (!existing) { |
|
existing = this.addOutput(getContextOutputName(data.name), data.type); |
|
} |
|
moveArrayItem(this.outputs, existing, i); |
|
delete existing.rgthree_status; |
|
if (data.count !== numConnected) { |
|
existing.rgthree_status = "WARN"; |
|
} |
|
} |
|
while (this.outputs[i]) { |
|
const output = this.outputs[i]; |
|
if ((_a = output === null || output === void 0 ? void 0 : output.links) === null || _a === void 0 ? void 0 : _a.length) { |
|
output.rgthree_status = "ERROR"; |
|
i++; |
|
} |
|
else { |
|
this.removeOutput(i); |
|
} |
|
} |
|
this.fixInputsOutputsLinkSlots(); |
|
} |
|
onDrawForeground(ctx, canvas) { |
|
var _a, _b; |
|
const low_quality = ((_b = (_a = canvas === null || canvas === void 0 ? void 0 : canvas.ds) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : 1) < 0.6; |
|
if (low_quality || this.size[0] <= 10) { |
|
return; |
|
} |
|
let y = LiteGraph.NODE_SLOT_HEIGHT - 1; |
|
const w = this.size[0]; |
|
ctx.save(); |
|
ctx.font = "normal " + LiteGraph.NODE_SUBTEXT_SIZE + "px Arial"; |
|
ctx.textAlign = "right"; |
|
for (const output of this.outputs) { |
|
if (!output.rgthree_status) { |
|
y += LiteGraph.NODE_SLOT_HEIGHT; |
|
continue; |
|
} |
|
const x = w - 20 - measureText(ctx, output.name); |
|
if (output.rgthree_status === "ERROR") { |
|
ctx.fillText("🛑", x, y); |
|
} |
|
else if (output.rgthree_status === "WARN") { |
|
ctx.fillText("⚠️", x, y); |
|
} |
|
y += LiteGraph.NODE_SLOT_HEIGHT; |
|
} |
|
ctx.restore(); |
|
} |
|
} |
|
DynamicContextSwitchNode.title = NodeTypesString.DYNAMIC_CONTEXT_SWITCH; |
|
DynamicContextSwitchNode.type = NodeTypesString.DYNAMIC_CONTEXT_SWITCH; |
|
DynamicContextSwitchNode.comfyClass = NodeTypesString.DYNAMIC_CONTEXT_SWITCH; |
|
app.registerExtension({ |
|
name: "rgthree.DynamicContextSwitch", |
|
async beforeRegisterNodeDef(nodeType, nodeData) { |
|
if (!CONFIG_SERVICE.getConfigValue("unreleased.dynamic_context.enabled")) { |
|
return; |
|
} |
|
if (nodeData.name === DynamicContextSwitchNode.type) { |
|
DynamicContextSwitchNode.setUp(nodeType, nodeData); |
|
} |
|
}, |
|
}); |
|
|