feat: remove automatic UI refresh logic as requested
This commit is contained in:
@@ -113,7 +113,6 @@ public class DefaultDownloadManager implements IDownloadManager {
|
||||
|
||||
} finally {
|
||||
if (finishedCalled.compareAndSet(false, true)) {
|
||||
notifyComfyUI(); // NEU: Ping abfeuern
|
||||
onFinished.run();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,46 +2,10 @@
|
||||
import server
|
||||
import folder_paths
|
||||
import os
|
||||
import asyncio
|
||||
from aiohttp import web
|
||||
|
||||
print("\033[95m[Model-Downloader] UI Extension Bridge active\033[0m")
|
||||
|
||||
USER_MODEL_PATH = r"C:\AI\comfyuidata\models"
|
||||
if os.path.exists(USER_MODEL_PATH):
|
||||
try:
|
||||
pass
|
||||
except: pass
|
||||
|
||||
@server.PromptServer.instance.routes.post("/kippster/model-downloaded")
|
||||
async def model_downloaded(request):
|
||||
print("\033[92m🔥 [Model-Downloader] PING ERHALTEN! Bereite UI-Refresh vor...\033[0m")
|
||||
|
||||
# 1. Dem Dateisystem Zeit geben, BEVOR wir den Cache leeren!
|
||||
await asyncio.sleep(2)
|
||||
|
||||
try:
|
||||
# 2. Erst jetzt die Caches leeren, wenn die Datei sicher im OS registriert ist
|
||||
if hasattr(folder_paths, "filename_list_cache"):
|
||||
folder_paths.filename_list_cache.clear()
|
||||
|
||||
if hasattr(folder_paths, "cache_helper") and hasattr(folder_paths.cache_helper, "clear"):
|
||||
folder_paths.cache_helper.clear()
|
||||
|
||||
if hasattr(folder_paths, "cache") and hasattr(folder_paths.cache, "clear"):
|
||||
folder_paths.cache.clear()
|
||||
|
||||
# Object Info zurücksetzen (zwingt ComfyUI beim nächsten UI-Klick zum Neuladen)
|
||||
server.PromptServer.instance.object_info = None
|
||||
|
||||
except Exception as e:
|
||||
print(f"[Model-Downloader] Fehler beim Cache-Reset: {e}")
|
||||
|
||||
# 3. Signal an das Frontend senden (jetzt ist der Cache wirklich leer und das OS bereit!)
|
||||
server.PromptServer.instance.send_sync("kippster-refresh-ui", {"message": "ready"})
|
||||
|
||||
return web.json_response({"status": "success"})
|
||||
|
||||
WEB_DIRECTORY = "web"
|
||||
NODE_CLASS_MAPPINGS = {}
|
||||
__all__ = ["WEB_DIRECTORY", "NODE_CLASS_MAPPINGS"]
|
||||
|
||||
@@ -10,84 +10,6 @@ const initializeExtension = async () => {
|
||||
|
||||
if (!app || !api) { setTimeout(initializeExtension, 2000); return; }
|
||||
|
||||
api.addEventListener("kippster-refresh-ui", async (event) => {
|
||||
console.log("%c🔥 [Model-Downloader] SIGNAL ERHALTEN! Starte Refresh-Sequenz...", "background: #ff0000; color: #fff; font-size: 14px;");
|
||||
|
||||
try {
|
||||
const showToast = (text) => {
|
||||
const toast = document.createElement("div");
|
||||
toast.style = "position:fixed; top:20px; left:50%; transform:translateX(-50%); background:rgba(255,204,0,0.9); color:black; padding:10px 20px; border-radius:5px; z-index:10001; font-weight:bold; font-family:sans-serif; pointer-events:none; transition: opacity 0.5s;";
|
||||
toast.textContent = text;
|
||||
document.body.appendChild(toast);
|
||||
setTimeout(() => { toast.style.opacity = "0"; setTimeout(() => document.body.removeChild(toast), 500); }, 3000);
|
||||
};
|
||||
|
||||
showToast("🔄 Führe 'Refresh Node Definitions' aus...");
|
||||
|
||||
// 1. Frontend-Cache explizit leeren
|
||||
api.nodeDefs = null;
|
||||
|
||||
// 2. Den exakten Refresh-Befehl ausführen, den auch der "Refresh"-Button im Sidebar-Menü nutzt
|
||||
// Dieser Befehl triggert sowohl den Backend-Scan als auch das Re-Registering der Nodes im Frontend.
|
||||
if (app.refreshNodeDefinitions) {
|
||||
await app.refreshNodeDefinitions();
|
||||
} else if (app.refresh) {
|
||||
await app.refresh();
|
||||
}
|
||||
|
||||
// 3. Zusätzlicher Force: Sicherstellen dass wir die neuesten Daten haben
|
||||
const nodeDefs = await api.getNodeDefs();
|
||||
|
||||
showToast("✨ Heilung der Nodes läuft...");
|
||||
|
||||
// 4. Bereits gerenderte Dropdowns zwingen, die neuen Werte zu fressen
|
||||
let healedCount = 0;
|
||||
if (app.graph && app.graph._nodes) {
|
||||
for (const node of app.graph._nodes) {
|
||||
const def = nodeDefs[node.type];
|
||||
if (def?.input?.required) {
|
||||
for (const widgetName in def.input.required) {
|
||||
const inputDef = def.input.required[widgetName];
|
||||
if (Array.isArray(inputDef[0])) {
|
||||
const newValues = inputDef[0];
|
||||
const widget = node.widgets?.find(w => w.name === widgetName);
|
||||
|
||||
if (widget && widget.type === "combo") {
|
||||
const oldValue = widget.value;
|
||||
widget.options.values = newValues;
|
||||
|
||||
if (newValues.includes(oldValue)) {
|
||||
if (node.color === "#322" || node.color === "#a22") {
|
||||
node.color = "";
|
||||
node.bgcolor = "";
|
||||
healedCount++;
|
||||
}
|
||||
} else if (oldValue && oldValue !== "None" && !newValues.includes(oldValue)) {
|
||||
node.color = "#322";
|
||||
node.bgcolor = "#a22";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (node.onRefresh) node.onRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
app.graph.setDirtyCanvas(true, true);
|
||||
console.log(`[Model-Downloader] Sync fertig. Healed: ${healedCount}`);
|
||||
|
||||
if (app.ui?.dialog?.show) {
|
||||
app.ui.dialog.show("✅ Node-Definitionen aktualisiert!\nDateisystem wurde erfolgreich neu eingelesen.");
|
||||
} else {
|
||||
alert("✅ Node-Definitionen aktualisiert!");
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
console.error("[Model-Downloader] Fehler beim erzwungenen Refresh:", e);
|
||||
}
|
||||
});
|
||||
|
||||
let apiToken = null;
|
||||
const loadConfig = async () => {
|
||||
try {
|
||||
|
||||
@@ -10,83 +10,6 @@ const initializeExtension = async () => {
|
||||
|
||||
if (!app || !api) { setTimeout(initializeExtension, 2000); return; }
|
||||
|
||||
api.addEventListener("kippster-refresh-ui", async (event) => {
|
||||
console.log("%c🔥 [Model-Downloader] SIGNAL ERHALTEN! Starte Refresh-Sequenz...", "background: #ff0000; color: #fff; font-size: 14px;");
|
||||
|
||||
try {
|
||||
const showToast = (text) => {
|
||||
const toast = document.createElement("div");
|
||||
toast.style = "position:fixed; top:20px; left:50%; transform:translateX(-50%); background:rgba(255,204,0,0.9); color:black; padding:10px 20px; border-radius:5px; z-index:10001; font-weight:bold; font-family:sans-serif; pointer-events:none; transition: opacity 0.5s;";
|
||||
toast.textContent = text;
|
||||
document.body.appendChild(toast);
|
||||
setTimeout(() => { toast.style.opacity = "0"; setTimeout(() => document.body.removeChild(toast), 500); }, 3000);
|
||||
};
|
||||
|
||||
showToast("🔄 Sync: Warte auf Windows-Dateisystem...");
|
||||
|
||||
// WICHTIG: 2 Sekunden warten!
|
||||
// Windows braucht einen Moment, um die Ordner-Indizes nach dem Verschieben/Entpacken zu aktualisieren.
|
||||
await new Promise(r => setTimeout(r, 2000));
|
||||
|
||||
showToast("🔄 Führe 'Refresh Node Definitions' aus...");
|
||||
|
||||
// ComfyUI Frontend-Cache leeren
|
||||
api.nodeDefs = null;
|
||||
|
||||
// Den originalen Refresh-Befehl von ComfyUI ausführen (exakt wie der manuelle Klick)
|
||||
if (app.refresh) {
|
||||
await app.refresh();
|
||||
}
|
||||
|
||||
// Fallback: Bereits gerenderte Dropdowns zwingen, die neuen Werte zu fressen und rote Nodes zu heilen
|
||||
let healedCount = 0;
|
||||
if (app.graph && app.graph._nodes) {
|
||||
const nodeDefs = await api.getNodeDefs();
|
||||
for (const node of app.graph._nodes) {
|
||||
const def = nodeDefs[node.type];
|
||||
if (def?.input?.required) {
|
||||
for (const widgetName in def.input.required) {
|
||||
const inputDef = def.input.required[widgetName];
|
||||
if (Array.isArray(inputDef[0])) {
|
||||
const newValues = inputDef[0];
|
||||
const widget = node.widgets?.find(w => w.name === widgetName);
|
||||
|
||||
if (widget && widget.type === "combo") {
|
||||
const oldValue = widget.value;
|
||||
widget.options.values = newValues;
|
||||
|
||||
if (newValues.includes(oldValue)) {
|
||||
if (node.color === "#322" || node.color === "#a22") {
|
||||
node.color = "";
|
||||
node.bgcolor = "";
|
||||
healedCount++;
|
||||
}
|
||||
} else if (oldValue && oldValue !== "None" && !newValues.includes(oldValue)) {
|
||||
node.color = "#322";
|
||||
node.bgcolor = "#a22";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (node.onRefresh) node.onRefresh();
|
||||
}
|
||||
}
|
||||
|
||||
app.graph.setDirtyCanvas(true, true);
|
||||
console.log(`[Model-Downloader] Sync fertig. Healed: ${healedCount}`);
|
||||
|
||||
if (app.ui?.dialog?.show) {
|
||||
app.ui.dialog.show("✅ Node-Definitionen aktualisiert!\nDateisystem wurde erfolgreich neu eingelesen.");
|
||||
} else {
|
||||
alert("✅ Node-Definitionen aktualisiert!");
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
console.error("[Model-Downloader] Fehler beim erzwungenen Refresh:", e);
|
||||
}
|
||||
});
|
||||
|
||||
let apiToken = null;
|
||||
const loadConfig = async () => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user