M29: App-Einstellungen (Settings-Fenster ⌘,)

Neues natives macOS-Settings-Fenster mit Sprache, Auto-Update-Check,
Farbschema (Standard/Kontrastreich), echter Textgrößen-Skalierung,
Bedienelement-Größe und LAN-Scanner-Refreshraten/Sparkline-Einstellungen.

- AppPreferences.swift: zentrale AppStorage-Keys, ColorTheme/AppTextSize/
  UIDensity
- SettingsView.swift: 3-Tab-Settings-Scene
- .environment(\.dynamicTypeSize) erwies sich auf macOS als wirkungslos
  (per ImageRenderer-Snapshot bewiesen) — durch eigenen appFontScale-
  Mechanismus ersetzt, ~110 .font(...)-Aufrufe app-weit umgestellt
- Farbschema auf Wunsch auch auf Experte-Tab-Sidebar ausgeweitet
- Docs aktualisiert: README/HANDOFF/CHATLOG/Manual.md+PDF, found.md

Live bestätigt nach mehreren Nachbesserungsrunden ("passt, lassen wir so").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Kay
2026-09-17 13:38:22 +02:00
co-authored by Claude Sonnet 5
parent 53a2931239
commit 221b914b05
25 changed files with 803 additions and 157 deletions
+52
View File
@@ -1845,3 +1845,55 @@ Release-Build, auf dem Stand des jeweils letzten Commits auf `main`
(App-Icon "Signal Router"). Nach jeder weiteren Code-Änderung muss dieser
Build-und-Kopier-Schritt (siehe oben) wiederholt werden, damit die
installierte App aktuell bleibt.
**M29: App-Einstellungen / Settings-Fenster** (2026-09-17, komplett neue
Infrastruktur, zuvor gab es nur den DE/EN-Toolbar-Schalter):
1. Natives macOS-Settings-Fenster (⌘,, `Settings { }`-Scene) statt eigenem
Tab — Rückfrage vorab geklärt. Drei Tabs: Allgemein (Sprache,
Auto-Update-Check beim Verbinden), Darstellung (Farbschema, Textgröße,
Bedienelemente), Netzwerk (LAN-Scanner Aktualisierungsrate/
Sparkline-Zeitfenster/-Breite). Zentrales `AppPreferences.swift`
(`Core/Models/`) bündelt alle `AppStorage`-Keys + drei Enums
(`ColorTheme`, `AppTextSize`, `UIDensity`).
2. **Farbschema** (`ColorTheme`, 2 vordefinierte Themes Standard/
Kontrastreich statt freier Farbwahl — bewusste Rückfrage-Entscheidung):
ersetzt `OverviewStyle.color(for:)` für Übersicht-Node-Kategorien/
Kanten, LAN-Scanner-Status (Traffic aktiv, Fest/Dynamisch, Port-Scan)
und (auf Nachfrage nachgezogen) die Experte-Tab-Sidebar-Kategorien
(13 `RouterOSMenuCategory`-Fälle auf die bestehende 5-Farb-Palette
gebucketet, Firewall-Untermenüs → `.firewall`, VPN/WLAN/Queues/
System/Tools → `.service`). Zwei Live-Test-Runden fanden echte Bugs:
drei Farben waren anfangs in beiden Themes identisch definiert
(Kopierfehler), und die LAN-Scanner-eigenen Statusfarben waren zu
ähnliche SwiftUI-Nachbarfarben (grün/mint, orange/gelb) — beide
gefixt, per `ImageRenderer`-Snapshot-Vergleich selbst verifiziert
statt nur behauptet.
3. **Textgröße** — erster Ansatz (`.environment(\.dynamicTypeSize, ...)`,
SwiftUIs Standardmechanismus) erwies sich als kompletter Fehlschlag:
per Snapshot-Vergleich bewiesen, dass diese Environment-Variable auf
macOS **keine Wirkung** auf Text-Rendering hat (anders als iOS).
Komplett neu gebaut: eigener `\.appFontScale`-Environment-Key +
`AppFontStyle`-Enum mit expliziten macOS-Basis-Punktgrößen pro
Textstil + `.appFont(...)`-Modifier. ~110 `.font(...)`-Aufrufe app-weit
automatisiert umgestellt (Scratchpad-Skript, textbasierte Ersetzung),
außer zwei fest-breiten Layout-Stellen (Übersicht-Diagramm-Knotenkarten,
LAN-Scanner-Tabellenspalten), die beim Skalieren brechen würden.
Danach noch ein Nachzügler-Fix: die Experte-Tab-Sidebar-Liste und alle
Parameter/Wert-`TextField`s hatten von Anfang an gar kein `.font(...)`
— automatisierte Ersetzung konnte dort nichts ersetzen. Fix: globaler
Default-Font-Fallback (`.environment(\.font, ...)`) an der
Fenster-Wurzel, wirkt überall dort, wo kein `.appFont(...)` bereits
greift.
4. **Bedienelemente/"Responsiveness"** (`UIDensity` → SwiftUIs
`.controlSize`, an der Fenster-Wurzel) und **LAN-Scanner-Refreshraten/
Sparkline-Fenster/-Breite** (`DevicesViewModel` liest die Werte bei
jedem Poll-Tick frisch aus `UserDefaults`, nicht nur beim Start) auf
Anhieb live bestätigt.
5. Bewusst nicht umgesetzt: Übersicht-Zoom-Standardwert, Fokus-Popup-
Größe/Verhalten (reine `@State`-Werte ohne Persistenz, nicht explizit
gefordert). Für später vorgemerkt (`found.md` Punkt 9): freie
Farbwahl pro Kategorie statt nur der 2 Themes.
Build+alle 98 Unit-Tests grün nach jedem Schritt. Live bestätigt
("passt, lassen wir so").