Files
slvslvslv-ComfyUI-SmartHelp…/js/nodes.js
T

144 lines
5.6 KiB
JavaScript

// This JS class is used to handle the specific visibility issues for the ComfyUI-SmartHelperNodes extension.
import { app } from '../../scripts/app.js'
import { api } from '../../scripts/api.js'
const SMART_HV_LORA_STACK_NAME = "Smart HV LoRA Stack";
const SMART_HV_LORA_STACK_COUNT_WIDGET = "lora_count";
const nodeWidgetHandlers = {
"SmartHVLoraStack": {
[SMART_HV_LORA_STACK_COUNT_WIDGET]: handleSmartHVLoraStackCount
}
};
function handleSmartHVLoraStackCount(node, widget) {
handleVisibility(node, widget.value, SMART_HV_LORA_STACK_NAME);
}
function handleVisibility(node, count, type) {
if (type === SMART_HV_LORA_STACK_NAME) {
//console.log("Smart: handleVisibility called for", type, "with count", count);
for (let i = 1; i <= 50; i++) {
const show = i <= count;
const enabledWidget = findWidgetByName(node, `lora_${i}_enabled`);
const nameWidget = findWidgetByName(node, `lora_${i}_name`);
const strengthWidget = findWidgetByName(node, `lora_${i}_strength`);
toggleWidget(node, enabledWidget, show);
toggleWidget(node, nameWidget, show);
toggleWidget(node, strengthWidget, show);
// Set disabled state based on enabled checkbox
if (nameWidget && strengthWidget && enabledWidget) {
nameWidget.disabled = !enabledWidget.value;
strengthWidget.disabled = !enabledWidget.value;
}
}
}
}
function findWidgetByName(node, name) {
return node.widgets?.find(w => w.name === name);
}
function toggleWidget(node, widget, show = false) {
if (widget) {
widget.hidden = !show;
// Trigger height recalculation
if (node.computeSize) {
const size = node.computeSize();
node.size[1] = size[1];
}
// Mark canvas as dirty to trigger redraw
node.setDirtyCanvas(true, true);
}
}
function setupVisibilityHandler(node, countWidgetName, blockType) {
const countWidget = node.widgets.find(w => w.name === countWidgetName);
if (countWidget) {
handleVisibility(node, countWidget.value, blockType);
}
return countWidget;
}
// Update the registerExtension implementation
app.registerExtension({
name: "SmartHelperNodes",
async beforeRegisterNodeDef(nodeType, nodeData, app) {
if (nodeData.name === "SmartHVLoraStack") {
// Store original computeSize
const origComputeSize = nodeType.prototype.computeSize;
// Override computeSize
nodeType.prototype.computeSize = function() {
const size = origComputeSize ? origComputeSize.call(this) : [200, 100];
// Calculate height based on visible widgets
let height = 50; // Base height
for (const w of this.widgets || []) {
if (w.hidden) continue;
height += w.computeSize ? w.computeSize()[1] + 4 : 24;
}
return [size[0], height];
};
const onNodeCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = function() {
const result = onNodeCreated?.apply(this, arguments);
// Set up widget callbacks
const loraCountWidget = setupVisibilityHandler(this, SMART_HV_LORA_STACK_COUNT_WIDGET, SMART_HV_LORA_STACK_NAME);
if (loraCountWidget) {
loraCountWidget.callback = () => {
handleVisibility(this, loraCountWidget.value, SMART_HV_LORA_STACK_NAME);
};
}
// Set up callbacks for enabled checkboxes
for (let i = 1; i <= 50; i++) {
const enabledWidget = this.widgets.find(w => w.name === `lora_${i}_enabled`);
if (enabledWidget) {
enabledWidget.callback = () => {
const nameWidget = findWidgetByName(this, `lora_${i}_name`);
const strengthWidget = findWidgetByName(this, `lora_${i}_strength`);
if (nameWidget && strengthWidget) {
nameWidget.disabled = !enabledWidget.value;
strengthWidget.disabled = !enabledWidget.value;
}
};
}
}
// Initial setup - hide widgets based on current count
if (loraCountWidget) {
handleVisibility(this, loraCountWidget.value, SMART_HV_LORA_STACK_NAME);
}
// Handle workflow switching and initial load
const onConnectionsChange = this.onConnectionsChange;
this.onConnectionsChange = function() {
const result = onConnectionsChange?.apply(this, arguments);
setupVisibilityHandler(this, SMART_HV_LORA_STACK_COUNT_WIDGET, SMART_HV_LORA_STACK_NAME);
return result;
};
const onNodeGraphConfigure = this.onConfigure;
this.onConfigure = function() {
const result = onNodeGraphConfigure?.apply(this, arguments);
setupVisibilityHandler(this, SMART_HV_LORA_STACK_COUNT_WIDGET, SMART_HV_LORA_STACK_NAME);
return result;
};
return result;
};
}
}
});