Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
Python Linting / Run Pylint (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.10, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.11, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.12, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-unix-nightly (12.1, , linux, 3.11, [self-hosted Linux], nightly) (push) Has been cancelled
Execution Tests / test (macos-latest) (push) Has been cancelled
Execution Tests / test (ubuntu-latest) (push) Has been cancelled
Execution Tests / test (windows-latest) (push) Has been cancelled
Test server launches without errors / test (push) Has been cancelled
Unit Tests / test (macos-latest) (push) Has been cancelled
Unit Tests / test (ubuntu-latest) (push) Has been cancelled
Unit Tests / test (windows-2022) (push) Has been cancelled
Includes 30 custom nodes committed directly, 7 Civitai-exclusive loras stored via Git LFS, and a setup script that installs all dependencies and downloads HuggingFace-hosted models on vast.ai. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
127 lines
5.2 KiB
JavaScript
127 lines
5.2 KiB
JavaScript
// ComfyUI.mxToolkit.Stop v.0.9.7 - Max Smirnov 2024
|
|
import { app } from "../../scripts/app.js";
|
|
|
|
class MXStop
|
|
{
|
|
constructor(node)
|
|
{
|
|
this.node = node;
|
|
this.node.properties = this.node.properties || {};
|
|
|
|
this.node.onGraphConfigured = function ()
|
|
{
|
|
this.configured = true;
|
|
}
|
|
|
|
this.node.onConnectionsChange = function (type, index, connected, link_info)
|
|
{
|
|
if (link_info)
|
|
{
|
|
if (connected)
|
|
{
|
|
if (type === LiteGraph.INPUT)
|
|
{
|
|
const cnode = app.graph.getNodeById(link_info.origin_id);
|
|
const ctype = cnode.outputs[link_info.origin_slot].type;
|
|
const color = LGraphCanvas.link_type_colors[ctype];
|
|
this.outputs[0].type = ctype;
|
|
this.outputs[0].name = ctype;
|
|
this.inputs[0].type = ctype;
|
|
if (link_info.id) { app.graph.links[link_info.id].color = color; }
|
|
if (this.outputs[0].links !== null)
|
|
for (let i = this.outputs[0].links.length; i > 0; i--)
|
|
{
|
|
const tlinkId = this.outputs[0].links[i-1];
|
|
const tlink = app.graph.links[tlinkId];
|
|
if (this.configured) if ( ctype !== tlink.type ) app.graph.getNodeById(tlink.target_id).disconnectInput(tlink.target_slot);
|
|
}
|
|
}
|
|
if (type === LiteGraph.OUTPUT && this.inputs[0].link === null)
|
|
{
|
|
this.inputs[0].type = link_info.type;
|
|
this.outputs[0].type = link_info.type;
|
|
this.outputs[0].name = link_info.type;
|
|
}
|
|
}
|
|
else if ((( type === LiteGraph.INPUT ) && ( this.outputs[0].links === null || this.outputs[0].links.length === 0 )) || (( type === LiteGraph.OUTPUT) && ( this.inputs[0].link === null ))) this.onAdded();
|
|
}
|
|
this.computeSize();
|
|
};
|
|
|
|
this.node.onAdded = function ()
|
|
{
|
|
this.inputs[0].type = "*";
|
|
this.outputs[0].name = "";
|
|
this.outputs[0].type = "*";
|
|
};
|
|
|
|
this.node.onMouseDown = function(e, pos, canvas)
|
|
{
|
|
let cWidth = this._collapsed_width || LiteGraph.NODE_COLLAPSED_WIDTH;
|
|
if ( e.canvasY-this.pos[1] > 0 ) return false;
|
|
if (this.flags.collapsed && (e.canvasX-this.pos[0] < LiteGraph.NODE_TITLE_HEIGHT)) return false;
|
|
if (!this.flags.collapsed && ((e.canvasX-this.pos[0]) < (this.size[0]-cWidth+LiteGraph.NODE_TITLE_HEIGHT))) return false;
|
|
this.updateThisNodeGraph?.();
|
|
this.onTmpMouseUp(e, pos, canvas);
|
|
return true;
|
|
}
|
|
|
|
this.node.onTmpMouseUp = function(e, pos, canvas)
|
|
{
|
|
app.queuePrompt(0);
|
|
}
|
|
|
|
this.node.onDrawForeground = function(ctx)
|
|
{
|
|
this.configured = true;
|
|
if (this.size[1] > LiteGraph.NODE_SLOT_HEIGHT*1.3) this.size[1] = LiteGraph.NODE_SLOT_HEIGHT*1.3;
|
|
let titleHeight = LiteGraph.NODE_TITLE_HEIGHT;
|
|
let cWidth = this._collapsed_width || LiteGraph.NODE_COLLAPSED_WIDTH;
|
|
let buttonWidth = cWidth-titleHeight-6;
|
|
let cx = (this.flags.collapsed?cWidth:this.size[0])-buttonWidth-6;
|
|
|
|
ctx.fillStyle = this.color || LiteGraph.NODE_DEFAULT_COLOR;
|
|
ctx.beginPath();
|
|
ctx.rect(cx, 2-titleHeight, buttonWidth, titleHeight-4);
|
|
ctx.fill();
|
|
|
|
cx += buttonWidth/2;
|
|
|
|
ctx.lineWidth = 1;
|
|
if (this.mouseOver)
|
|
{
|
|
ctx.fillStyle = LiteGraph.NODE_SELECTED_TITLE_COLOR
|
|
ctx.beginPath(); ctx.moveTo(cx-8,-titleHeight/2-8); ctx.lineTo(cx+0,-titleHeight/2); ctx.lineTo(cx-8,-titleHeight/2+8); ctx.fill();
|
|
ctx.beginPath(); ctx.moveTo(cx+1,-titleHeight/2-8); ctx.lineTo(cx+9,-titleHeight/2); ctx.lineTo(cx+1,-titleHeight/2+8); ctx.fill();
|
|
}
|
|
else
|
|
{
|
|
ctx.fillStyle = (this.boxcolor || LiteGraph.NODE_DEFAULT_BOXCOLOR);
|
|
ctx.beginPath(); ctx.rect(cx-10,-titleHeight/2-8, 4, 16); ctx.fill();
|
|
ctx.beginPath(); ctx.rect(cx-2,-titleHeight/2-8, 4, 16); ctx.fill();
|
|
}
|
|
}
|
|
|
|
this.node.computeSize = function()
|
|
{
|
|
return [ (this.properties.showOutputText && this.outputs && this.outputs.length) ? LiteGraph.NODE_TEXT_SIZE * (this.outputs[0].name.length+5) * 0.6 + 140 : 140, LiteGraph.NODE_SLOT_HEIGHT*1.3 ];
|
|
}
|
|
}
|
|
}
|
|
|
|
app.registerExtension(
|
|
{
|
|
name: "mxStop",
|
|
async beforeRegisterNodeDef(nodeType, nodeData, _app)
|
|
{
|
|
if (nodeData.name === "mxStop")
|
|
{
|
|
const onNodeCreated = nodeType.prototype.onNodeCreated;
|
|
nodeType.prototype.onNodeCreated = function () {
|
|
if (onNodeCreated) onNodeCreated.apply(this, []);
|
|
this.mxStop = new MXStop(this);
|
|
}
|
|
}
|
|
}
|
|
});
|