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.
This commit is contained in:
Ken Sanislo 2026-05-15 01:07:17 -07:00 committed by Peter F. Patel-Schneider
parent 7593781367
commit 5853cf5a8e
1 changed files with 11 additions and 8 deletions

View File

@ -595,22 +595,25 @@ class GraphicEQControl(MultipleControl):
control._timer.cancel() control._timer.cancel()
delattr(control, "_timer") delattr(control, "_timer")
new_state = int(control.get_value()) new_state = int(control.get_value())
if self.sbox.setting._value[int(item)] != new_state: value = self.sbox.setting._value
self.sbox.setting._value[int(item)] = new_state if not isinstance(value, dict):
_write_async(self.sbox.setting, self.sbox.setting._value[int(item)], self.sbox, key=int(item)) 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): def set_value(self, value):
if value is None: if value is None:
return return
b = "" b = ""
n = len(self._items) n = len(self._items)
stored = self.sbox.setting._value if isinstance(self.sbox.setting._value, dict) else {}
for vbox in self._items: for vbox in self._items:
item = vbox._setting_item item = vbox._setting_item
v = value.get(int(item), None) v = value.get(int(item))
if v is not None: if v is None:
vbox.control.set_value(v) v = stored.get(int(item), 0)
else: vbox.control.set_value(v)
v = self.sbox.setting._value[int(item)]
b += f"{str(item)}: ({str(v)}) " b += f"{str(item)}: ({str(v)}) "
lbl_text = ngettext("%d value", "%d values", n) % n lbl_text = ngettext("%d value", "%d values", n) % n
self._button.set_label(lbl_text) self._button.set_label(lbl_text)