Spaces:
Running
on
Zero
Running
on
Zero
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); | |
}; | |