Spaces:
Runtime error
Runtime error
// @ts-check | |
import { ComfyButton } from "../components/button.js"; | |
import { $el } from "../../ui.js"; | |
import { api } from "../../api.js"; | |
import { ComfySplitButton } from "../components/splitButton.js"; | |
import { ComfyQueueOptions } from "./queueOptions.js"; | |
import { prop } from "../../utils.js"; | |
export class ComfyQueueButton { | |
element = $el("div.comfyui-queue-button"); | |
#internalQueueSize = 0; | |
queuePrompt = async (e) => { | |
this.#internalQueueSize += this.queueOptions.batchCount; | |
// Hold shift to queue front, event is undefined when auto-queue is enabled | |
await this.app.queuePrompt(e?.shiftKey ? -1 : 0, this.queueOptions.batchCount); | |
}; | |
constructor(app) { | |
this.app = app; | |
this.queueSizeElement = $el("span.comfyui-queue-count", { | |
textContent: "?", | |
}); | |
const queue = new ComfyButton({ | |
content: $el("div", [ | |
$el("span", { | |
textContent: "Queue", | |
}), | |
this.queueSizeElement, | |
]), | |
icon: "play", | |
classList: "comfyui-button", | |
action: this.queuePrompt, | |
}); | |
this.queueOptions = new ComfyQueueOptions(app); | |
const btn = new ComfySplitButton( | |
{ | |
primary: queue, | |
mode: "click", | |
position: "absolute", | |
horizontal: "right", | |
}, | |
this.queueOptions.element | |
); | |
btn.element.classList.add("primary"); | |
this.element.append(btn.element); | |
this.autoQueueMode = prop(this, "autoQueueMode", "", () => { | |
switch (this.autoQueueMode) { | |
case "instant": | |
queue.icon = "infinity"; | |
break; | |
case "change": | |
queue.icon = "auto-mode"; | |
break; | |
default: | |
queue.icon = "play"; | |
break; | |
} | |
}); | |
this.queueOptions.addEventListener("autoQueueMode", (e) => (this.autoQueueMode = e["detail"])); | |
api.addEventListener("graphChanged", () => { | |
if (this.autoQueueMode === "change") { | |
if (this.#internalQueueSize) { | |
this.graphHasChanged = true; | |
} else { | |
this.graphHasChanged = false; | |
this.queuePrompt(); | |
} | |
} | |
}); | |
api.addEventListener("status", ({ detail }) => { | |
this.#internalQueueSize = detail?.exec_info?.queue_remaining; | |
if (this.#internalQueueSize != null) { | |
this.queueSizeElement.textContent = this.#internalQueueSize > 99 ? "99+" : this.#internalQueueSize + ""; | |
this.queueSizeElement.title = `${this.#internalQueueSize} prompts in queue`; | |
if (!this.#internalQueueSize && !app.lastExecutionError) { | |
if (this.autoQueueMode === "instant" || (this.autoQueueMode === "change" && this.graphHasChanged)) { | |
this.graphHasChanged = false; | |
this.queuePrompt(); | |
} | |
} | |
} | |
}); | |
} | |
} | |