fix: hide model_family by mirroring hide signals onto widget._state (#216)

Devtools dump on the user's frontend confirmed setWidgetHidden() was
correctly setting widget.type='hidden', widget.hidden=true,
computeSize=[0,-4], and draw=noop — but the widget still rendered.
The widget object has a _state Proxy that mirrors render-relevant
properties; the modern frontend's canvas-drawn ComboWidget renders
from _state, not from the top-level widget object.

Extend setWidgetHidden() to also mutate widget._state (type, disabled,
label) when present, with try/catch in case the Proxy traps make any
of those read-only. The original _state values are saved so unhide
restores them.

Refs #216 (pending runtime verification)
This commit is contained in:
Mehdi Chaid
2026-05-22 10:10:32 -04:00
parent 9c927b5011
commit e0efba1027
+18
View File
@@ -47,6 +47,7 @@ export function setWidgetHidden(widget, hide) {
let saved = _widgetHideState.get(widget);
if (hide) {
if (saved) return; // already hidden
const state = widget._state || null; // modern ComfyUI proxy mirror
saved = {
type: widget.type,
computeSize: widget.computeSize,
@@ -54,6 +55,9 @@ export function setWidgetHidden(widget, hide) {
options: widget.options,
elementDisplay: widget.element ? widget.element.style.display : null,
inputElDisplay: widget.inputEl ? widget.inputEl.style.display : null,
stateType: state ? state.type : null,
stateDisabled: state ? state.disabled : null,
stateLabel: state ? state.label : null,
};
_widgetHideState.set(widget, saved);
widget.computeSize = () => [0, -4];
@@ -63,6 +67,14 @@ export function setWidgetHidden(widget, hide) {
widget.options = { ...(widget.options || {}), serialize: true };
if (widget.element) widget.element.style.display = "none";
if (widget.inputEl) widget.inputEl.style.display = "none";
// Mirror onto _state (#216 v3): on modern frontends the canvas-drawn
// ComboWidget renders from this Proxy rather than the top-level widget
// object. Setting type='hidden' here is what actually suppresses draw.
if (state) {
try { state.type = "hidden"; } catch { /* proxy may be read-only */ }
try { state.disabled = true; } catch { /* */ }
try { state.label = ""; } catch { /* */ }
}
} else {
if (!saved) return; // already visible
widget.type = saved.type;
@@ -73,6 +85,12 @@ export function setWidgetHidden(widget, hide) {
widget.hidden = false;
if (widget.element && saved.elementDisplay !== null) widget.element.style.display = saved.elementDisplay;
if (widget.inputEl && saved.inputElDisplay !== null) widget.inputEl.style.display = saved.inputElDisplay;
const state = widget._state || null;
if (state) {
if (saved.stateType !== null) try { state.type = saved.stateType; } catch { /* */ }
if (saved.stateDisabled !== null) try { state.disabled = saved.stateDisabled; } catch { /* */ }
if (saved.stateLabel !== null) try { state.label = saved.stateLabel; } catch { /* */ }
}
_widgetHideState.delete(widget);
}
}