import { app } from "../../scripts/app.js"; import { ComfyButtonGroup } from "../../scripts/ui/components/buttonGroup.js"; import { ComfyButton } from "../../scripts/ui/components/button.js"; const BUTTON_GROUP_CLASS = "lora-manager-top-menu-group"; const BUTTON_TOOLTIP = "Launch LoRA Manager (Shift+Click opens in new window)"; const LORA_MANAGER_PATH = "/loras"; const NEW_WINDOW_FEATURES = "width=1200,height=800,resizable=yes,scrollbars=yes,status=yes"; const MAX_ATTACH_ATTEMPTS = 120; const openLoraManager = (event) => { const url = `${window.location.origin}${LORA_MANAGER_PATH}`; if (event.shiftKey) { window.open(url, "_blank", NEW_WINDOW_FEATURES); return; } window.open(url, "_blank"); }; const createTopMenuButton = () => { const button = new ComfyButton({ icon: "loramanager", tooltip: BUTTON_TOOLTIP, app, enabled: true, classList: "comfyui-button comfyui-menu-mobile-collapse primary", }); button.element.setAttribute("aria-label", BUTTON_TOOLTIP); button.element.title = BUTTON_TOOLTIP; if (button.iconElement) { button.iconElement.innerHTML = getLoraManagerIcon(); button.iconElement.style.width = "1.2rem"; button.iconElement.style.height = "1.2rem"; } button.element.addEventListener("click", openLoraManager); return button; }; const attachTopMenuButton = (attempt = 0) => { if (document.querySelector(`.${BUTTON_GROUP_CLASS}`)) { return; } const settingsGroup = app.menu?.settingsGroup; if (!settingsGroup?.element?.parentElement) { if (attempt >= MAX_ATTACH_ATTEMPTS) { console.warn("LoRA Manager: unable to locate the ComfyUI settings button group."); return; } requestAnimationFrame(() => attachTopMenuButton(attempt + 1)); return; } const loraManagerButton = createTopMenuButton(); const buttonGroup = new ComfyButtonGroup(loraManagerButton); buttonGroup.element.classList.add(BUTTON_GROUP_CLASS); settingsGroup.element.before(buttonGroup.element); }; const fetchVersionInfo = async () => { try { const response = await fetch("/api/lm/version-info"); const data = await response.json(); if (data.success) { return data.version; } } catch (error) { console.error("LoRA Manager: error fetching version info:", error); } return ""; }; const createAboutBadge = (version) => { const label = version ? `LoRA Manager v${version}` : "LoRA Manager"; return { label, url: "https://github.com/willmiao/ComfyUI-Lora-Manager", icon: "pi pi-tags", }; }; app.registerExtension({ name: "LoraManager.TopMenu", aboutPageBadges: [createAboutBadge()], async setup() { attachTopMenuButton(); const version = await fetchVersionInfo(); this.aboutPageBadges = [createAboutBadge(version)]; }, }); const getLoraManagerIcon = () => { return ` `; };