Terminal nach Avalonia + konfigurierbare Zeitzone (P2-Kern)
Alle vier Core-Fenster sind damit portiert. TERMINAL: - Live-Ausgabe als virtualisiertes ItemsControl ueber eine begrenzte Zeilenliste statt RichTextBox. Damit entfaellt das Auto-Clear der WinForms-Fassung, das bei Erreichen der Zeichengrenze den GESAMTEN Verlauf verwarf - jetzt werden nur die aeltesten Zeilen verdraengt (Ringpuffer, 5000 Zeilen), der juengste Verlauf bleibt immer sichtbar. Die Zeilenzahl steht in der Statuszeile. - Log-Viewer unveraendert im Funktionsumfang: JSONL-Tagesdateien, Filter nach Datum, Level, CID und Volltext, Doppelklick uebernimmt die CID (Signal-Kette verfolgen). ZEITZONE (Befund aus der Linux-Analyse, hier faellig geworden): Die Terminal-Ansicht rechnete hart gegen die WINDOWS-ID 'W. Europe Standard Time'. Auf Linux traegt die nur ueber die ICU-Zuordnung und faellt ganz aus, wenn ICU fehlt oder InvariantGlobalization gesetzt ist - das Fenster haette beim Oeffnen geworfen. Neu: PolyTraderSharp.Services.AppTimeZone + ServerSettings.ApplicationTimeZoneId (Default 'Europe/Berlin', IANA-Schreibweise). Aufloesung versucht die ID direkt, dann die jeweils andere Schreibweise (IANA<->Windows), zuletzt die Systemzeitzone - ein unbekannter Wert ist damit nie fatal, sondern erzeugt nur eine Warnung. Beide Programm-Einstiege setzen sie einmalig beim Start; laut Vorgabe wird sie bei der Installation festgelegt und nicht im laufenden Betrieb gewechselt (Aenderung verschiebt Logdatei-Tagesgrenzen). 8 neue Tests (AppTimeZoneTests) halten fest: IANA- UND Windows-ID liefern denselben UTC-Versatz (Winter +1, Sommer +2), unbekannte IDs fallen mit Warnung auf die Systemzeitzone zurueck, leere Angabe = Systemzeitzone, UTC wird korrekt umgerechnet. Verifiziert: Solution baut, 450 Tests gruen, --smoke-ui gruen (6 Fenster + Editor-Pruefung, Zeitzone loest als Europe/Berlin auf), App laeuft real, Linux-Publish laeuft. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
<Window xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:controls="using:PolyTrader.App.Avalonia.Controls"
|
||||
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
|
||||
x:Class="PolyTrader.App.Avalonia.Views.TerminalWindow"
|
||||
Title="Terminal / Logs"
|
||||
Width="1429" Height="1083">
|
||||
|
||||
<!--
|
||||
Terminal- und Log-Ansicht.
|
||||
Live-Tab: farbige Log-Zeilen, abschaltbarer Autoscroll, Level-Filter.
|
||||
Log-Viewer-Tab: die JSONL-Tagesdateien, filterbar nach Datum, Level, CID und Volltext.
|
||||
|
||||
Die Live-Ausgabe ist ein virtualisiertes ItemsControl über eine begrenzte Zeilenliste
|
||||
statt einer RichTextBox. Damit entfällt das Auto-Clear der WinForms-Fassung, das bei
|
||||
Erreichen der RAM-Grenze den gesamten Verlauf verwarf: es werden nur noch die ältesten
|
||||
Zeilen verdrängt, der sichtbare Verlauf bleibt erhalten.
|
||||
-->
|
||||
<DockPanel>
|
||||
<controls:WindowMenuBar Name="menuBar" DockPanel.Dock="Top" />
|
||||
|
||||
<TabControl>
|
||||
|
||||
<TabItem Header="Live">
|
||||
<DockPanel>
|
||||
<Border Classes="toolbar" DockPanel.Dock="Top">
|
||||
<StackPanel Orientation="Horizontal" Spacing="8">
|
||||
<Button Name="btnAutoscroll" Content="Stop Autoscroll" />
|
||||
<Button Name="btnClear" Content="Terminal leeren" />
|
||||
<Button Name="btnCopyAll" Content="Alles kopieren" />
|
||||
<TextBlock Text="Level:" VerticalAlignment="Center" />
|
||||
<ComboBox Name="cbLogLevel" MinWidth="150" />
|
||||
<TextBlock Name="lblLiveStatus" VerticalAlignment="Center" Foreground="#777777" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Border Background="#1E1E1E">
|
||||
<ScrollViewer Name="logScroll">
|
||||
<ItemsControl Name="logLines" Margin="8">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<VirtualizingStackPanel />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:LogLine">
|
||||
<SelectableTextBlock Text="{Binding Text}"
|
||||
Foreground="{Binding Brush}"
|
||||
FontFamily="Consolas,Menlo,DejaVu Sans Mono,monospace"
|
||||
FontSize="12"
|
||||
TextWrapping="Wrap" />
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</DockPanel>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="Log Viewer">
|
||||
<DockPanel>
|
||||
<Border Classes="toolbar" DockPanel.Dock="Top">
|
||||
<StackPanel Orientation="Horizontal" Spacing="8">
|
||||
<TextBlock Text="Datum:" VerticalAlignment="Center" />
|
||||
<CalendarDatePicker Name="dtViewerDate" MinWidth="150" />
|
||||
<TextBlock Text="Level:" VerticalAlignment="Center" />
|
||||
<ComboBox Name="cbViewerLevel" MinWidth="130" />
|
||||
<TextBlock Text="CID:" VerticalAlignment="Center" />
|
||||
<TextBox Name="tbViewerCid" MinWidth="150" />
|
||||
<TextBlock Text="Text:" VerticalAlignment="Center" />
|
||||
<TextBox Name="tbViewerText" MinWidth="220" />
|
||||
<Button Name="btnViewerLoad" Content="Laden" />
|
||||
<TextBlock Name="lblViewerStatus" VerticalAlignment="Center" Foreground="#777777" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<DataGrid Name="gridLogs" x:DataType="vm:LogViewerRow">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Zeit" Width="90" Binding="{Binding Time}" />
|
||||
<DataGridTextColumn Header="Level" Width="110" Binding="{Binding Level}" />
|
||||
<DataGridTextColumn Header="CID" Width="160" Binding="{Binding Cid}" />
|
||||
<DataGridTextColumn Header="Nachricht" Width="*" Binding="{Binding Message}" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</DockPanel>
|
||||
</TabItem>
|
||||
|
||||
</TabControl>
|
||||
</DockPanel>
|
||||
|
||||
</Window>
|
||||
Reference in New Issue
Block a user