diff --git a/web/js/multi_bool_panel.js b/web/js/multi_bool_panel.js index ac64cfe..8123de5 100644 --- a/web/js/multi_bool_panel.js +++ b/web/js/multi_bool_panel.js @@ -48,12 +48,12 @@ function currentRealValue(target, mode) { if (typeof g.recomputeInsideNodes === "function") g.recomputeInsideNodes(); const members = g._nodes || []; if (members.length === 0) return false; - const m = mode === "bypass" ? 4 : 2; - return members.every((n) => n.mode === m); + // ON = node runs normally (mode 0); OFF = bypassed/muted + return members.every((n) => n.mode === 0); } const targetNode = target.ref; - if (mode === "bypass") return targetNode.mode === 4; - if (mode === "mute") return targetNode.mode === 2; + if (mode === "bypass") return targetNode.mode === 0; + if (mode === "mute") return targetNode.mode === 0; // widgets: first boolean widget value const bw = (targetNode.widgets || []).find( (w) => w.type === "BOOLEAN" || w.type === "toggle" || (w.options && w.options.type === "boolean") @@ -74,16 +74,16 @@ function applyValue(target, mode, value) { if (mode === "widgets") return; // groups are never included in widgets mode const g = target.ref; if (typeof g.recomputeInsideNodes === "function") g.recomputeInsideNodes(); - const m = value ? (mode === "bypass" ? 4 : 2) : 0; + const m = value ? 0 : (mode === "bypass" ? 4 : 2); (g._nodes || []).forEach((n) => { n.mode = m; }); app.graph.setDirtyCanvas(true, true); return; } const targetNode = target.ref; if (mode === "bypass") { - targetNode.mode = value ? 4 : 0; + targetNode.mode = value ? 0 : 4; } else if (mode === "mute") { - targetNode.mode = value ? 2 : 0; + targetNode.mode = value ? 0 : 2; } else { // widgets const bw = (targetNode.widgets || []).find( @@ -166,12 +166,14 @@ function buildPanel(panelNode) { if (!panelNode.properties.switches) { panelNode.properties.switches = {}; } - // State was previously keyed by name only (shared across modes). Drop - // legacy single-name keys; current keys are ":". + // Drop stale state keys: v1 was keyed by name only (shared across modes), + // v2 used ":" with ON = bypass/mute applied semantics. Current + // keys are ":v3:" with ON = node runs normally (switch-panel + // semantics: OFF applies bypass/mute). { const legacy = panelNode.properties.switches; for (const k of Object.keys(legacy)) { - if (!k.includes(":")) delete legacy[k]; + if (!k.includes(":v3:")) delete legacy[k]; } } @@ -275,7 +277,7 @@ function buildPanel(panelNode) { // Toggle — state is persisted per (mode, name) so bypass/mute/widgets // never share each other's on/off state. const toggle = createToggle(disabled); - const stateKey = mode + ":" + name; + const stateKey = mode + ":v3:" + name; const saved = switches[stateKey]; let isOn; if (saved !== undefined) {