// @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(); } } } }); } }