|
import { ComfyWidgets } from "../../scripts/widgets.js";
|
|
import { SERVICE as KEY_EVENT_SERVICE } from "./services/key_events_services.js";
|
|
import { app } from "../../scripts/app.js";
|
|
import { LogLevel, rgthree } from "./rgthree.js";
|
|
import { addHelpMenuItem } from "./utils.js";
|
|
import { RgthreeHelpDialog } from "../../rgthree/common/dialog.js";
|
|
import { importIndividualNodesInnerOnDragDrop, importIndividualNodesInnerOnDragOver, } from "./feature_import_individual_nodes.js";
|
|
import { defineProperty } from "../../rgthree/common/shared_utils.js";
|
|
export class RgthreeBaseNode extends LGraphNode {
|
|
constructor(title = RgthreeBaseNode.title, skipOnConstructedCall = true) {
|
|
super(title);
|
|
this.comfyClass = "__NEED_COMFY_CLASS__";
|
|
this.nickname = "rgthree";
|
|
this.isVirtualNode = false;
|
|
this.isDropEnabled = false;
|
|
this.removed = false;
|
|
this.configuring = false;
|
|
this._tempWidth = 0;
|
|
this.__constructed__ = false;
|
|
this.helpDialog = null;
|
|
if (title == "__NEED_CLASS_TITLE__") {
|
|
throw new Error("RgthreeBaseNode needs overrides.");
|
|
}
|
|
this.widgets = this.widgets || [];
|
|
this.properties = this.properties || {};
|
|
setTimeout(() => {
|
|
if (this.comfyClass == "__NEED_COMFY_CLASS__") {
|
|
throw new Error("RgthreeBaseNode needs a comfy class override.");
|
|
}
|
|
this.checkAndRunOnConstructed();
|
|
});
|
|
defineProperty(this, 'mode', {
|
|
get: () => {
|
|
return this.rgthree_mode;
|
|
},
|
|
set: (mode) => {
|
|
if (this.rgthree_mode != mode) {
|
|
const oldMode = this.rgthree_mode;
|
|
this.rgthree_mode = mode;
|
|
this.onModeChange(oldMode, mode);
|
|
}
|
|
},
|
|
});
|
|
}
|
|
checkAndRunOnConstructed() {
|
|
var _a;
|
|
if (!this.__constructed__) {
|
|
this.onConstructed();
|
|
const [n, v] = rgthree.logger.logParts(LogLevel.DEV, `[RgthreeBaseNode] Child class did not call onConstructed for "${this.type}.`);
|
|
(_a = console[n]) === null || _a === void 0 ? void 0 : _a.call(console, ...v);
|
|
}
|
|
return this.__constructed__;
|
|
}
|
|
onDragOver(e) {
|
|
if (!this.isDropEnabled)
|
|
return false;
|
|
return importIndividualNodesInnerOnDragOver(this, e);
|
|
}
|
|
async onDragDrop(e) {
|
|
if (!this.isDropEnabled)
|
|
return false;
|
|
return importIndividualNodesInnerOnDragDrop(this, e);
|
|
}
|
|
onConstructed() {
|
|
var _a;
|
|
if (this.__constructed__)
|
|
return false;
|
|
this.type = (_a = this.type) !== null && _a !== void 0 ? _a : undefined;
|
|
this.__constructed__ = true;
|
|
rgthree.invokeExtensionsAsync("nodeCreated", this);
|
|
return this.__constructed__;
|
|
}
|
|
configure(info) {
|
|
this.configuring = true;
|
|
super.configure(info);
|
|
for (const w of this.widgets || []) {
|
|
w.last_y = w.last_y || 0;
|
|
}
|
|
this.configuring = false;
|
|
}
|
|
clone() {
|
|
const cloned = super.clone();
|
|
if (cloned.properties && !!window.structuredClone) {
|
|
cloned.properties = structuredClone(cloned.properties);
|
|
}
|
|
return cloned;
|
|
}
|
|
onModeChange(from, to) {
|
|
}
|
|
async handleAction(action) {
|
|
action;
|
|
}
|
|
removeWidget(widgetOrSlot) {
|
|
if (typeof widgetOrSlot === "number") {
|
|
this.widgets.splice(widgetOrSlot, 1);
|
|
}
|
|
else if (widgetOrSlot) {
|
|
const index = this.widgets.indexOf(widgetOrSlot);
|
|
if (index > -1) {
|
|
this.widgets.splice(index, 1);
|
|
}
|
|
}
|
|
}
|
|
defaultGetSlotMenuOptions(slot) {
|
|
var _a, _b;
|
|
const menu_info = [];
|
|
if ((_b = (_a = slot === null || slot === void 0 ? void 0 : slot.output) === null || _a === void 0 ? void 0 : _a.links) === null || _b === void 0 ? void 0 : _b.length) {
|
|
menu_info.push({ content: "Disconnect Links", slot: slot });
|
|
}
|
|
let inputOrOutput = slot.input || slot.output;
|
|
if (inputOrOutput) {
|
|
if (inputOrOutput.removable) {
|
|
menu_info.push(inputOrOutput.locked ? { content: "Cannot remove" } : { content: "Remove Slot", slot });
|
|
}
|
|
if (!inputOrOutput.nameLocked) {
|
|
menu_info.push({ content: "Rename Slot", slot });
|
|
}
|
|
}
|
|
return menu_info;
|
|
}
|
|
onRemoved() {
|
|
var _a;
|
|
(_a = super.onRemoved) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
this.removed = true;
|
|
}
|
|
static setUp(...args) {
|
|
}
|
|
getHelp() {
|
|
return "";
|
|
}
|
|
showHelp() {
|
|
const help = this.getHelp() || this.constructor.help;
|
|
if (help) {
|
|
this.helpDialog = new RgthreeHelpDialog(this, help).show();
|
|
this.helpDialog.addEventListener("close", (e) => {
|
|
this.helpDialog = null;
|
|
});
|
|
}
|
|
}
|
|
onKeyDown(event) {
|
|
KEY_EVENT_SERVICE.handleKeyDownOrUp(event);
|
|
if (event.key == "?" && !this.helpDialog) {
|
|
this.showHelp();
|
|
}
|
|
}
|
|
onKeyUp(event) {
|
|
KEY_EVENT_SERVICE.handleKeyDownOrUp(event);
|
|
}
|
|
getExtraMenuOptions(canvas, options) {
|
|
var _a, _b, _c, _d, _e, _f;
|
|
if (super.getExtraMenuOptions) {
|
|
(_a = super.getExtraMenuOptions) === null || _a === void 0 ? void 0 : _a.apply(this, [canvas, options]);
|
|
}
|
|
else if ((_c = (_b = this.constructor.nodeType) === null || _b === void 0 ? void 0 : _b.prototype) === null || _c === void 0 ? void 0 : _c.getExtraMenuOptions) {
|
|
(_f = (_e = (_d = this.constructor.nodeType) === null || _d === void 0 ? void 0 : _d.prototype) === null || _e === void 0 ? void 0 : _e.getExtraMenuOptions) === null || _f === void 0 ? void 0 : _f.apply(this, [
|
|
canvas,
|
|
options,
|
|
]);
|
|
}
|
|
const help = this.getHelp() || this.constructor.help;
|
|
if (help) {
|
|
addHelpMenuItem(this, help, options);
|
|
}
|
|
}
|
|
}
|
|
RgthreeBaseNode.exposedActions = [];
|
|
RgthreeBaseNode.title = "__NEED_CLASS_TITLE__";
|
|
RgthreeBaseNode.category = "rgthree";
|
|
RgthreeBaseNode._category = "rgthree";
|
|
export class RgthreeBaseVirtualNode extends RgthreeBaseNode {
|
|
constructor(title = RgthreeBaseNode.title) {
|
|
super(title, false);
|
|
this.isVirtualNode = true;
|
|
}
|
|
static setUp() {
|
|
if (!this.type) {
|
|
throw new Error(`Missing type for RgthreeBaseVirtualNode: ${this.title}`);
|
|
}
|
|
LiteGraph.registerNodeType(this.type, this);
|
|
if (this._category) {
|
|
this.category = this._category;
|
|
}
|
|
}
|
|
}
|
|
export class RgthreeBaseServerNode extends RgthreeBaseNode {
|
|
constructor(title) {
|
|
super(title, true);
|
|
this.isDropEnabled = true;
|
|
this.serialize_widgets = true;
|
|
this.setupFromServerNodeData();
|
|
this.onConstructed();
|
|
}
|
|
getWidgets() {
|
|
return ComfyWidgets;
|
|
}
|
|
async setupFromServerNodeData() {
|
|
var _a, _b, _c;
|
|
const nodeData = this.constructor.nodeData;
|
|
if (!nodeData) {
|
|
throw Error("No node data");
|
|
}
|
|
this.comfyClass = nodeData.name;
|
|
let inputs = nodeData["input"]["required"];
|
|
if (nodeData["input"]["optional"] != undefined) {
|
|
inputs = Object.assign({}, inputs, nodeData["input"]["optional"]);
|
|
}
|
|
const WIDGETS = this.getWidgets();
|
|
const config = {
|
|
minWidth: 1,
|
|
minHeight: 1,
|
|
widget: null,
|
|
};
|
|
for (const inputName in inputs) {
|
|
const inputData = inputs[inputName];
|
|
const type = inputData[0];
|
|
if ((_a = inputData[1]) === null || _a === void 0 ? void 0 : _a.forceInput) {
|
|
this.addInput(inputName, type);
|
|
}
|
|
else {
|
|
let widgetCreated = true;
|
|
if (Array.isArray(type)) {
|
|
Object.assign(config, WIDGETS.COMBO(this, inputName, inputData, app) || {});
|
|
}
|
|
else if (`${type}:${inputName}` in WIDGETS) {
|
|
Object.assign(config, WIDGETS[`${type}:${inputName}`](this, inputName, inputData, app) || {});
|
|
}
|
|
else if (type in WIDGETS) {
|
|
Object.assign(config, WIDGETS[type](this, inputName, inputData, app) || {});
|
|
}
|
|
else {
|
|
this.addInput(inputName, type);
|
|
widgetCreated = false;
|
|
}
|
|
if (widgetCreated && ((_b = inputData[1]) === null || _b === void 0 ? void 0 : _b.forceInput) && (config === null || config === void 0 ? void 0 : config.widget)) {
|
|
if (!config.widget.options)
|
|
config.widget.options = {};
|
|
config.widget.options.forceInput = inputData[1].forceInput;
|
|
}
|
|
if (widgetCreated && ((_c = inputData[1]) === null || _c === void 0 ? void 0 : _c.defaultInput) && (config === null || config === void 0 ? void 0 : config.widget)) {
|
|
if (!config.widget.options)
|
|
config.widget.options = {};
|
|
config.widget.options.defaultInput = inputData[1].defaultInput;
|
|
}
|
|
}
|
|
}
|
|
for (const o in nodeData["output"]) {
|
|
let output = nodeData["output"][o];
|
|
if (output instanceof Array)
|
|
output = "COMBO";
|
|
const outputName = nodeData["output_name"][o] || output;
|
|
const outputShape = nodeData["output_is_list"][o]
|
|
? LiteGraph.GRID_SHAPE
|
|
: LiteGraph.CIRCLE_SHAPE;
|
|
this.addOutput(outputName, output, { shape: outputShape });
|
|
}
|
|
const s = this.computeSize();
|
|
s[0] = Math.max(config.minWidth, s[0] * 1.5);
|
|
s[1] = Math.max(config.minHeight, s[1]);
|
|
this.size = s;
|
|
this.serialize_widgets = true;
|
|
}
|
|
static registerForOverride(comfyClass, nodeData, rgthreeClass) {
|
|
if (OVERRIDDEN_SERVER_NODES.has(comfyClass)) {
|
|
throw Error(`Already have a class to override ${comfyClass.type || comfyClass.name || comfyClass.title}`);
|
|
}
|
|
OVERRIDDEN_SERVER_NODES.set(comfyClass, rgthreeClass);
|
|
if (!rgthreeClass.__registeredForOverride__) {
|
|
rgthreeClass.__registeredForOverride__ = true;
|
|
rgthreeClass.nodeType = comfyClass;
|
|
rgthreeClass.nodeData = nodeData;
|
|
rgthreeClass.onRegisteredForOverride(comfyClass, rgthreeClass);
|
|
}
|
|
}
|
|
static onRegisteredForOverride(comfyClass, rgthreeClass) {
|
|
}
|
|
}
|
|
RgthreeBaseServerNode.nodeData = null;
|
|
RgthreeBaseServerNode.nodeType = null;
|
|
RgthreeBaseServerNode.__registeredForOverride__ = false;
|
|
const OVERRIDDEN_SERVER_NODES = new Map();
|
|
const oldregisterNodeType = LiteGraph.registerNodeType;
|
|
LiteGraph.registerNodeType = async function (nodeId, baseClass) {
|
|
var _a;
|
|
const clazz = OVERRIDDEN_SERVER_NODES.get(baseClass) || baseClass;
|
|
if (clazz !== baseClass) {
|
|
const classLabel = clazz.type || clazz.name || clazz.title;
|
|
const [n, v] = rgthree.logger.logParts(LogLevel.DEBUG, `${nodeId}: replacing default ComfyNode implementation with custom ${classLabel} class.`);
|
|
(_a = console[n]) === null || _a === void 0 ? void 0 : _a.call(console, ...v);
|
|
}
|
|
return oldregisterNodeType.call(LiteGraph, nodeId, clazz);
|
|
};
|
|
|