From 487ea4466de4c1626e38a0e5b3fed8996677f9f5 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 6 Aug 2026 22:41:25 +0200 Subject: [PATCH] Dunkelmodus mit Umschalter in der Fensterleiste Farbschema hell / dunkel / dem System folgen, umschaltbar per Klick, Stand wird in server_settings.xml gemerkt (ServerSettings.Theme). Der Editor zeigt die Einstellung automatisch als Auswahlfeld - kein Zusatzcode, weil sie ein Enum ist. - App.axaml: 18 Farb-Token je Variante (Flaechen, Rahmen, Texte, Bedeutungsfarben, Zeilenfaerbung, Trading-Umschalter, Chat-Rollen). Die Standard-Steuerelemente stellt das FluentTheme selbst um. - 22 fest verdrahtete Farben in 11 XAML-Dateien auf DynamicResource umgestellt - die wechseln damit von selbst mit. - Umschalter (Sonne/Mond) sitzt in der gemeinsamen Fensterleiste, also auf JEDEM Fenster. Der eigentliche Knackpunkt waren die Farben, die im Code gesetzt werden - die folgen dem Thema NICHT von selbst: - TradeRowPalette liefert jetzt Eigenschaften statt static readonly, loest also bei jedem Zugriff neu auf. Im Dunkeln gedaempfte Toene statt der hellen Pastelltoene, die dort blenden und den Text unlesbar machen wuerden. - ChatEntry speichert die ROLLE statt eines fertigen Brush - dadurch stimmt der Verlauf nach dem Umschalten ohne Neuaufbau der Liste. - Launcher-Umschalter, Dashboard-KPI und die Grid-Zeilenfarben zeichnen sich ueber ThemeManager.ThemeChanged neu. - Das Terminal bleibt in beiden Schemata dunkel (Konsolen sind konventionell dunkel). Nebenbei die Anzeige-Kultur gepinnt (stand ohnehin auf der Linux-Liste): auf Linux richtet sie sich sonst nach LANG/LC_ALL, das unter systemd oft nicht gesetzt ist - dann faellt .NET auf Invariant zurueck und aus '1.234,56 USDC' wird '1,234.56 USDC'. Maschinen-I/O laeuft davon unabhaengig weiter invariant. Smoke-UI prueft jetzt zusaetzlich, dass ALLE 18 Farben in BEIDEN Varianten aufloesen - ein vertippter Ressourcenschluessel wuerde sonst still grau werden. Verifiziert: Solution baut, 450 Tests gruen, --smoke-ui gruen (10 Fenster + Editor + beide Farbschemata), App startet im gespeicherten Schema, Linux-Publish laeuft. Co-Authored-By: Claude Opus 5 --- src/PolyTrader.App.Avalonia/App.axaml | 100 ++++++++++++++--- src/PolyTrader.App.Avalonia/App.axaml.cs | 6 ++ .../Controls/SettingsEditor.axaml | 4 +- .../Controls/WindowMenuBar.axaml | 5 +- src/PolyTrader.App.Avalonia/Program.cs | 38 +++++++ .../Shell/ThemeManager.cs | 102 ++++++++++++++++++ .../Shell/WindowMenuModel.cs | 19 +++- .../ViewModels/CopyTradingRows.cs | 15 ++- .../ViewModels/LogRows.cs | 18 +++- .../Views/DashboardWindow.axaml | 6 +- .../Views/DashboardWindow.axaml.cs | 11 +- .../Views/LauncherWindow.axaml | 4 +- .../Views/LauncherWindow.axaml.cs | 19 ++-- .../Views/Modules/AccountingWindow.axaml | 2 +- .../Views/Modules/CopyTradingWindow.axaml | 6 +- .../Views/Modules/CopyTradingWindow.axaml.cs | 10 ++ .../Modules/ResolutionFarmingWindow.axaml | 4 +- .../Views/Modules/SupervisorWindow.axaml | 4 +- .../Views/Modules/SupervisorWindow.axaml.cs | 13 ++- .../Views/SettingsWindow.axaml | 2 +- .../Views/ShutdownConfirmWindow.axaml | 2 +- .../Views/TerminalWindow.axaml | 4 +- src/PolyTrader.Core/Models/ServerSettings.cs | 16 +++ 23 files changed, 350 insertions(+), 60 deletions(-) create mode 100644 src/PolyTrader.App.Avalonia/Shell/ThemeManager.cs diff --git a/src/PolyTrader.App.Avalonia/App.axaml b/src/PolyTrader.App.Avalonia/App.axaml index 24b49b8..86d9486 100644 --- a/src/PolyTrader.App.Avalonia/App.axaml +++ b/src/PolyTrader.App.Avalonia/App.axaml @@ -1,7 +1,78 @@ + x:Class="PolyTrader.App.Avalonia.App"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -18,11 +89,11 @@ - - + @@ -50,13 +121,18 @@ - + + + + diff --git a/src/PolyTrader.App.Avalonia/App.axaml.cs b/src/PolyTrader.App.Avalonia/App.axaml.cs index 3274a6d..750ed81 100644 --- a/src/PolyTrader.App.Avalonia/App.axaml.cs +++ b/src/PolyTrader.App.Avalonia/App.axaml.cs @@ -28,6 +28,12 @@ namespace PolyTrader.App.Avalonia { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && Services != null) { + // Farbschema aus den Server-Settings übernehmen, BEVOR das erste Fenster entsteht – + // sonst blitzt kurz das helle Standardschema auf. + var settings = Services.GetRequiredService(); + Shell.ThemeManager.Initialize(settings, "server_settings.xml", + Services.GetRequiredService()); + var uiHost = Services.GetRequiredService(); CoreViews.Register(uiHost, Services); diff --git a/src/PolyTrader.App.Avalonia/Controls/SettingsEditor.axaml b/src/PolyTrader.App.Avalonia/Controls/SettingsEditor.axaml index 6acc58a..919a02d 100644 --- a/src/PolyTrader.App.Avalonia/Controls/SettingsEditor.axaml +++ b/src/PolyTrader.App.Avalonia/Controls/SettingsEditor.axaml @@ -29,7 +29,7 @@ @@ -106,7 +106,7 @@ + Foreground="{DynamicResource AppReadOnlyTextBrush}" /> diff --git a/src/PolyTrader.App.Avalonia/Controls/WindowMenuBar.axaml b/src/PolyTrader.App.Avalonia/Controls/WindowMenuBar.axaml index b920ffb..65c3148 100644 --- a/src/PolyTrader.App.Avalonia/Controls/WindowMenuBar.axaml +++ b/src/PolyTrader.App.Avalonia/Controls/WindowMenuBar.axaml @@ -14,7 +14,7 @@ (Avalonia kennt kein ToolStripItemAlignment.Right — die rechte Ausrichtung entsteht dadurch, dass der letzte Eintrag im DockPanel rechts angedockt wird.) --> - + @@ -25,6 +25,7 @@ @@ -66,7 +66,7 @@ diff --git a/src/PolyTrader.App.Avalonia/Views/LauncherWindow.axaml.cs b/src/PolyTrader.App.Avalonia/Views/LauncherWindow.axaml.cs index 450ba5e..1f4fd74 100644 --- a/src/PolyTrader.App.Avalonia/Views/LauncherWindow.axaml.cs +++ b/src/PolyTrader.App.Avalonia/Views/LauncherWindow.axaml.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.ObjectModel; using System.Linq; using Avalonia.Controls; @@ -62,10 +62,14 @@ namespace PolyTrader.App.Avalonia.Views e.Cancel = true; Dispatcher.UIThread.Post(_uiHost.RequestShutdown); }; + // Die Umschalterflaechen werden im Code gesetzt und folgen dem Thema nicht von selbst. + ThemeManager.ThemeChanged += UpdateTradingToggles; + Closed += (_, _) => { _statusTimer.Stop(); _uiHost.OpenStateChanged -= OnOpenStateChanged; + ThemeManager.ThemeChanged -= UpdateTradingToggles; }; } @@ -106,17 +110,18 @@ namespace PolyTrader.App.Avalonia.Views Apply(this.FindControl