From 5853cf5a8e39ab952c25e0e4ff2fd6f8abfe4084 Mon Sep 17 00:00:00 2001 From: Ken Sanislo Date: Fri, 15 May 2026 01:07:17 -0700 Subject: [PATCH] GraphicEQControl: tolerate a partial _value dict _write and set_value both did a bare _value[int(item)] subscript while the slider grid has validator.count entries. A persister value with fewer keys than bands (stale data from an older EQ parser) raised KeyError on render and on every slider drag for a missing band, so slider changes never reached the persister. Use .get() with a 0 dB fallback for unset bands, and guard against _value not being a dict at all. --- lib/solaar/ui/config_panel.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/solaar/ui/config_panel.py b/lib/solaar/ui/config_panel.py index a3d37482..5e2198fa 100644 --- a/lib/solaar/ui/config_panel.py +++ b/lib/solaar/ui/config_panel.py @@ -595,22 +595,25 @@ class GraphicEQControl(MultipleControl): control._timer.cancel() delattr(control, "_timer") new_state = int(control.get_value()) - if self.sbox.setting._value[int(item)] != new_state: - self.sbox.setting._value[int(item)] = new_state - _write_async(self.sbox.setting, self.sbox.setting._value[int(item)], self.sbox, key=int(item)) + value = self.sbox.setting._value + if not isinstance(value, dict): + return + if value.get(int(item)) != new_state: + value[int(item)] = new_state + _write_async(self.sbox.setting, value[int(item)], self.sbox, key=int(item)) def set_value(self, value): if value is None: return b = "" n = len(self._items) + stored = self.sbox.setting._value if isinstance(self.sbox.setting._value, dict) else {} for vbox in self._items: item = vbox._setting_item - v = value.get(int(item), None) - if v is not None: - vbox.control.set_value(v) - else: - v = self.sbox.setting._value[int(item)] + v = value.get(int(item)) + if v is None: + v = stored.get(int(item), 0) + vbox.control.set_value(v) b += f"{str(item)}: ({str(v)}) " lbl_text = ngettext("%d value", "%d values", n) % n self._button.set_label(lbl_text)