feat: enhance node registration and management with support for multiple nodes and improved UI elements. Fixes #220

This commit is contained in:
Will Miao
2025-06-26 23:00:55 +08:00
parent eb57e04e95
commit 64dd2ed141
10 changed files with 514 additions and 166 deletions

View File

@@ -76,7 +76,7 @@ app.registerExtension({
// Standard mode - update a specific node
const node = app.graph.getNodeById(+id);
if (!node || node.comfyClass !== "Lora Loader (LoraManager)") {
if (!node || (node.comfyClass !== "Lora Loader (LoraManager)" && node.comfyClass !== "Lora Stacker (LoraManager)")) {
console.warn("Node not found or not a LoraLoader:", id);
return;
}
@@ -218,9 +218,9 @@ app.registerExtension({
// Ensure the node is registered after creation
// Call registration
setTimeout(() => {
this.registerNode();
}, 0);
// setTimeout(() => {
// this.registerNode();
// }, 0);
});
}
},

View File

@@ -147,9 +147,9 @@ app.registerExtension({
};
// Call registration
setTimeout(() => {
this.registerNode();
}, 0);
// setTimeout(() => {
// this.registerNode();
// }, 0);
});
}
},

View File

@@ -601,7 +601,7 @@ export function addLorasWidget(node, name, opts, callback) {
});
// Calculate height based on number of loras and fixed sizes
const calculatedHeight = CONTAINER_PADDING + HEADER_HEIGHT + (Math.min(totalVisibleEntries, 8) * LORA_ENTRY_HEIGHT);
const calculatedHeight = CONTAINER_PADDING + HEADER_HEIGHT + (Math.min(totalVisibleEntries, 10) * LORA_ENTRY_HEIGHT);
updateWidgetHeight(container, calculatedHeight, defaultHeight, node);
};

View File

@@ -13,6 +13,11 @@ app.registerExtension({
this.updateUsageStats(detail.prompt_id);
}
});
// Listen for registry refresh requests
api.addEventListener("lora_registry_refresh", () => {
this.refreshRegistry();
});
},
async updateUsageStats(promptId) {
@@ -32,5 +37,46 @@ app.registerExtension({
} catch (error) {
console.error("Error updating usage statistics:", error);
}
},
async refreshRegistry() {
try {
// Get current workflow nodes
const prompt = await app.graphToPrompt();
const workflow = prompt.workflow;
if (!workflow || !workflow.nodes) {
console.warn("No workflow nodes found for registry refresh");
return;
}
// Find all Lora nodes
const loraNodes = [];
for (const node of workflow.nodes.values()) {
if (node.type === "Lora Loader (LoraManager)" || node.type === "Lora Stacker (LoraManager)") {
loraNodes.push({
node_id: node.id,
bgcolor: node.bgcolor || null,
title: node.title || node.type,
type: node.type
});
}
}
const response = await fetch('/api/register-nodes', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ nodes: loraNodes }),
});
if (!response.ok) {
console.warn("Failed to register Lora nodes:", response.statusText);
} else {
console.log(`Successfully registered ${loraNodes.length} Lora nodes`);
}
} catch (error) {
console.error("Error refreshing registry:", error);
}
}
});