diff --git a/Program.cs b/Program.cs index 9677108..6e0c3e8 100644 --- a/Program.cs +++ b/Program.cs @@ -77,6 +77,11 @@ internal static class Program // Account-Credentials als auch für den gespeicherten Lizenzschlüssel gebraucht. ConfigureSecretProtection(bootLog); + // Anzeige-Zeitzone einmalig setzen (Logs, Auswertungen). Ein unbekannter Wert ist nicht + // fatal - es wird auf die Systemzeitzone ausgewichen und gewarnt. + AppTimeZone.Configure(serverSettings.ApplicationTimeZoneId, m => bootLog.Warning(m)); + bootLog.Info($"Anzeige-Zeitzone: {AppTimeZone.CurrentId}"); + // Alle bekannten Module; „modules" enthält nur die aktiven (nicht in DisabledModules). var allModules = new System.Collections.Generic.List { diff --git a/src/PolyTrader.App.Avalonia/Program.cs b/src/PolyTrader.App.Avalonia/Program.cs index 9855250..e8da7b8 100644 --- a/src/PolyTrader.App.Avalonia/Program.cs +++ b/src/PolyTrader.App.Avalonia/Program.cs @@ -93,6 +93,11 @@ namespace PolyTrader.App.Avalonia ConfigureSecretProtection(logger); + // Anzeige-Zeitzone einmalig setzen (Logs, Auswertungen). Ein unbekannter Wert ist nicht + // fatal - es wird auf die Systemzeitzone ausgewichen und gewarnt. + AppTimeZone.Configure(serverSettings.ApplicationTimeZoneId, m => logger.Warning(m)); + logger.Info($"Anzeige-Zeitzone: {AppTimeZone.CurrentId}"); + var allModules = new List { new CopyTradingModule(), diff --git a/src/PolyTrader.App.Avalonia/Shell/CoreViews.cs b/src/PolyTrader.App.Avalonia/Shell/CoreViews.cs index ffd49bc..76d9488 100644 --- a/src/PolyTrader.App.Avalonia/Shell/CoreViews.cs +++ b/src/PolyTrader.App.Avalonia/Shell/CoreViews.cs @@ -59,8 +59,14 @@ namespace PolyTrader.App.Avalonia.Shell CreateView = () => new Views.JobsWindow(host, services.GetRequiredService()) }); - // TODO Portierung: core.terminal (Order 40) folgt. - // Aufbau siehe docs/UI-SPEZIFIKATION-WinForms.md, Originalcode im Git-Tag winforms-final. + host.RegisterView(new ModuleView + { + Id = "core.terminal", + Title = "Terminal / Logs", + Group = "Core", + Order = 40, + CreateView = () => new Views.TerminalWindow(host, services.GetRequiredService()) + }); } /// diff --git a/src/PolyTrader.App.Avalonia/ViewModels/LogRows.cs b/src/PolyTrader.App.Avalonia/ViewModels/LogRows.cs new file mode 100644 index 0000000..9d36cee --- /dev/null +++ b/src/PolyTrader.App.Avalonia/ViewModels/LogRows.cs @@ -0,0 +1,23 @@ +using Avalonia.Media; + +namespace PolyTrader.App.Avalonia.ViewModels +{ + /// + /// Eine Zeile der Live-Ausgabe. Farbe wird beim Erzeugen festgelegt – die Zeile ist danach + /// unveränderlich, was die Virtualisierung billig macht (kein Change-Tracking je Zeile). + /// + public sealed class LogLine + { + public string Text { get; init; } = string.Empty; + public IBrush Brush { get; init; } = Brushes.White; + } + + /// Anzeige-Zeile des Log Viewers (JSONL-Tagesdatei). + public sealed class LogViewerRow + { + public string Time { get; init; } = string.Empty; + public string Level { get; init; } = string.Empty; + public string Cid { get; init; } = string.Empty; + public string Message { get; init; } = string.Empty; + } +} diff --git a/src/PolyTrader.App.Avalonia/Views/TerminalWindow.axaml b/src/PolyTrader.App.Avalonia/Views/TerminalWindow.axaml new file mode 100644 index 0000000..243c6c0 --- /dev/null +++ b/src/PolyTrader.App.Avalonia/Views/TerminalWindow.axaml @@ -0,0 +1,91 @@ + + + + + + + + + + + + +