Files
jaidaken f09734b0ee
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
Add custom nodes, Civitai loras (LFS), and vast.ai setup script
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>
2026-02-09 00:56:42 +00:00

166 lines
6.5 KiB
JavaScript

// ComfyUI.mxToolkit.Seed v.0.9.9 - Max Smirnov 2024
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js";
class MXSeed {
constructor(node) {
this.node = node;
this.node.properties = { seed:0, min:0, max:4294967296, autorunQueue: true, interruptQueue: true };
this.node.size = [210,LiteGraph.NODE_SLOT_HEIGHT*3.4];
this.node.widgets[0].hidden = true;
this.node.widgets[0].type = "hidden";
this.seedWidget = this.node.widgets[0];
const fontsize = LiteGraph.NODE_TEXT_SIZE;
this.node.onAdded = function ()
{
this.outputs[0].name = this.outputs[0].localized_name = "";
this.widgets_start_y = 0;
this.resizable = false;
this.lastprocessed = null;
this.configured = false;
this.history=[this.properties.seed];
};
this.node.onConfigure = function ()
{
this.history=[this.properties.seed];
this.configured = true;
}
this.node.onMouseDown = function(e, pos, canvas)
{
let cWidth = this._collapsed_width || LiteGraph.NODE_COLLAPSED_WIDTH;
if (this.flags.collapsed && (( e.canvasY-this.pos[1] > 0 ) || (e.canvasX-this.pos[0] < LiteGraph.NODE_TITLE_HEIGHT))) return false;
if (!this.flags.collapsed && ( e.canvasY-this.pos[1] < 0 ) && ((e.canvasX-this.pos[0]) < (this.size[0]-cWidth+LiteGraph.NODE_TITLE_HEIGHT))) return false;
if ((e.canvasX-this.pos[0]) < LiteGraph.NODE_TITLE_HEIGHT) return false;
this.updateThisNodeGraph?.();
this.onTmpMouseUp(e, pos, canvas);
return true;
}
this.node.onTmpMouseUp = function(e, pos, canvas)
{
if (!this.flags.collapsed && ( e.canvasY-this.pos[1] > 0 ))
{
let ps = Math.floor((e.canvasY-this.pos[1]-(LiteGraph.NODE_SLOT_HEIGHT-fontsize)/2)/LiteGraph.NODE_SLOT_HEIGHT);
if (ps > 0 && ps < this.history.length)
{
this.history.unshift(this.history[ps]);
this.history.splice(ps+1,1);
this.lastprocessed = null;
this.processSeed();
}
else if (ps === 0)
{
if (this.configured) this.lastprocessed = this.history[0];
canvas.prompt("Seed", this.properties.seed, function(v) {if (!isNaN(Number(v))) this.processSeed(Number(v));}.bind(this), e);
return;
}
}
if ( e.canvasY-this.pos[1] < 0 ) if (e.shiftKey) { this.processSeed((this.properties.seed<this.properties.max)?this.properties.seed+1:this.properties.min) } else { this.processSeed() }
}
this.node.onPropertyChanged = function ()
{
if ( this.properties.min < 0 ) this.properties.min = 0;
if ( this.properties.max > 4294967296 ) this.properties.max = 4294967296;
if ( this.properties.max < this.properties.min ) this.properties.max = this.properties.min + 1;
this.randomRange = this.properties.max - this.properties.min;
if (!this.configured) return;
if (this.properties.seed !== this.lastprocessed) this.processSeed(this.properties.seed);
}
this.node.processSeed = function(s)
{
let newSeed;
if (s === undefined)
{
do { newSeed = Math.round( Math.random() * (this.properties.max - this.properties.min) + this.properties.min ) } while (newSeed === this.lastprocessed);
} else newSeed = s;
if (this.lastprocessed === null && this.configured ) newSeed = this.history[0];
if (newSeed !== this.history[0])
{
this.history.unshift(newSeed);
if (this.history.length === 2 && this.lastprocessed === null && !this.configured) { this.history.splice(1); this.configured = true; }
if (this.history.length > 3) { this.history.splice(3) }
}
this.lastprocessed = newSeed;
this.properties.seed = newSeed;
this.widgets[0].value = newSeed;
if (this.properties.interruptQueue) api.interrupt();
if (this.properties.autorunQueue) app.queuePrompt(0);
}
this.node.onDrawForeground = function(ctx)
{
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;
ctx.fillStyle = this.mouseOver?LiteGraph.NODE_SELECTED_TITLE_COLOR:(this.boxcolor || LiteGraph.NODE_DEFAULT_BOXCOLOR);
ctx.beginPath(); ctx.moveTo(cx-8,-titleHeight/2-8); ctx.lineTo(cx+3,-titleHeight/2); ctx.lineTo(cx-8,-titleHeight/2+8); ctx.fill();
if (!this.flags.collapsed)
{
ctx.fillStyle="rgba(20,20,20,0.5)";
ctx.beginPath();
ctx.roundRect( 20, 5, this.size[0]-40, fontsize+6, 6);
ctx.fill();
ctx.strokeStyle=LiteGraph.NODE_TEXT_COLOR;
ctx.beginPath();
ctx.roundRect( 20, 5, this.size[0]-40, fontsize+6, 6);
ctx.stroke();
ctx.fillStyle=LiteGraph.NODE_SELECTED_TITLE_COLOR;
ctx.font = (fontsize) + "px Arial";
ctx.textAlign = "center";
ctx.fillStyle=LiteGraph.NODE_TEXT_COLOR;
for (let i=0; i<this.history.length; i++) ctx.fillText(this.history[i], this.size[0]/2, LiteGraph.NODE_SLOT_HEIGHT*(i+1));
}
}
this.node.computeSize = function()
{
return [210,LiteGraph.NODE_SLOT_HEIGHT*3.4];
}
}
}
app.registerExtension(
{
name: "mxSeed",
async beforeRegisterNodeDef(nodeType, nodeData, _app)
{
if (nodeData.name === "mxSeed")
{
const onNodeCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = function ()
{
if (onNodeCreated) onNodeCreated.apply(this, []);
this.mxSeed = new MXSeed(this);
}
}
}
});