From 78d412ffa636f94aae6d21014fefa757f31e5c43 Mon Sep 17 00:00:00 2001 From: cjjohn <72096478+Grovy311@users.noreply.github.com> Date: Wed, 5 Aug 2026 17:54:44 +0200 Subject: [PATCH] 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. --- desktop_viewer.py | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/desktop_viewer.py b/desktop_viewer.py index f078f6e..1b80b6d 100644 --- a/desktop_viewer.py +++ b/desktop_viewer.py @@ -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)