Fix: Programmiermodus-Aenderungen erschienen nicht im Nur-Lese-Modus

Ursache: Programmiermodus arbeitet auf der kombinierten Datei
(versapad_config_all.json), der Nur-Lese-Modus las aber immer nur die
alten Einzel-JSONs (versapad_config{1,2,3}.json) -- zwei komplett
getrennte Datenquellen. Jetzt: jede Aenderung im Programmiermodus wird
sofort in die kombinierte Datei geschrieben, und der Nur-Lese-Modus
bevorzugt diese Datei, wenn sie existiert.
This commit is contained in:
cjjohn 2026-08-05 17:54:44 +02:00
parent b924273400
commit 78d412ffa6

View file

@ -286,6 +286,8 @@ class VersaPadViewer(tk.Tk):
def _poll(self):
mtimes = vp.config_mtimes()
if os.path.exists(vcomb.DEFAULT_PATH):
mtimes["combined"] = os.path.getmtime(vcomb.DEFAULT_PATH)
if mtimes != self._mtimes:
self._mtimes = mtimes
if not self.editing.get():
@ -488,6 +490,7 @@ class VersaPadViewer(tk.Tk):
btn["action"] = dlg.action
if dlg.led is not None:
btn["led"] = dlg.led
self._autosave_combined()
self._render()
def _edit_encoder_action(self, enc_index, field, field_label):
@ -497,10 +500,41 @@ class VersaPadViewer(tk.Tk):
self, f"Encoder {enc_index} {field_label}", enc[field], None, self.combined["macros"])
if dlg.run():
enc[field] = dlg.action
self._autosave_combined()
self._render()
def _autosave_combined(self):
"""Speichert Programmiermodus-Aenderungen sofort in die kombinierte
Datei, damit der Nur-Lese-Modus (der dieselbe Datei bevorzugt liest,
siehe _current_profile_view) sie ohne Extra-Klick sieht. Schreibt
NICHT aufs Board -- dafuer weiterhin "Zum Board uebertragen"."""
try:
vcomb.save_file(self.combined, vcomb.DEFAULT_PATH)
except OSError as e:
self._status(f"Auto-Speichern fehlgeschlagen: {e}", False)
# ── Rendering ────────────────────────────────────────────────────
def _current_profile_view(self):
"""Liest das aktuell angezeigte Profil fuer den Nur-Lese-Modus.
Bevorzugt die kombinierte Datei (versapad_config_all.json), falls
vorhanden -- so zeigen im Programmiermodus gespeicherte Aenderungen
sich auch hier, statt dass die alten Einzel-JSONs weiter durchscheinen.
Faellt zurueck auf die klassischen versapad_config{1,2,3}.json, wenn
es noch keine kombinierte Datei gibt."""
if os.path.exists(vcomb.DEFAULT_PATH):
try:
data = vcomb.load_file(vcomb.DEFAULT_PATH)
raw = data["profiles"][self.profile]
cfg = vp.annotate_profile({
"buttons": [dict(b) for b in raw["buttons"]],
"encoders": [dict(e) for e in raw["encoders"]],
})
return cfg, f"Quelle: {vcomb.DEFAULT_PATH}"
except (KeyError, IndexError, ValueError):
pass # kaputte/unvollstaendige Datei -- auf Einzel-JSONs ausweichen
return vp.load_profile(self.profile), f"Quelle: {vp.CONFIG_PATHS[self.profile]}"
def _render(self):
for w in self.grid_frame.winfo_children():
w.destroy()
@ -519,12 +553,11 @@ class VersaPadViewer(tk.Tk):
source_text = "Programmiermodus -- nicht gespeichert, bis übertragen/exportiert"
else:
try:
cfg = vp.load_profile(self.profile)
cfg, source_text = self._current_profile_view()
except FileNotFoundError as e:
tk.Label(self.grid_frame, text=f"Config-Datei fehlt: {e}", bg=BG,
fg="#e05a5a", font=("Segoe UI", 10)).pack()
return
source_text = f"Quelle: {vp.CONFIG_PATHS[self.profile]}"
for col in range(vp.GRID_COLS):
self.grid_frame.grid_columnconfigure(col, minsize=CARD_W + 10)