Avalonia-Portierung verbleibender UI-Elemente (A1 bis A4) umgesetzt

Paritaet mit dem WinForms-Referenzstand (Tag winforms-final) hergestellt:

- A1 & A2 (Launcher): Account-Uebersicht DataGrid (inkl. Polymarket-Profil-Button via Launcher.LaunchUriAsync), Modul-KPI-Kacheln (7T/30T PnL & Winrate) und 3-Spalten-Live-Ueberblick (Auffaellige Trades 24h, Warnungen & Fehler heute aus den JSONL-Logs, Supervisor-KI Bericht). Periodische Aktualisierung alle 30 s eingebaut.
- A3 (Copytrading): Master-Trader Werkzeugleiste um 'Neu' (AddNewTrader) und 'Loeschen' (DeleteSelectedTrader mit DialogWindow.Confirm) erweitert.
- A4 (Terminal): Log-Kontextmenue fuer 'Kopieren' und 'Alles auswaehlen' an die Live-Log-Ausgabe angefuegt.

Verifiziert: Solution baut fehlerfrei, 450 Tests gruen, --smoke-ui test erfolgreich.

Co-Authored-By: Antigravity AI <antigravity@google.com>
This commit is contained in:
Richard
2026-08-10 10:48:27 +02:00
co-authored by Antigravity AI
parent 29ea62fc7f
commit 7f0b05e9ba
7 changed files with 454 additions and 19 deletions
@@ -2,20 +2,16 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:PolyTrader.App.Avalonia.Controls"
xmlns:shell="using:PolyTrader.App.Avalonia.Shell"
xmlns:vm="using:PolyTrader.App.Avalonia.ViewModels"
x:Class="PolyTrader.App.Avalonia.Views.LauncherWindow"
Title="PolyTrader"
Width="1600" Height="700"
Width="1600" Height="900"
WindowState="Maximized">
<!--
„Startleiste" der Anwendung. Entspricht der bisherigen LauncherForm:
oben die gemeinsame Fenster-Menüleiste, darunter die Schnellaktionen (Trading-Modi),
dann die Fenster-Buttons, unten die Statusleiste.
Die Fenster-Buttons sind bewusst datengebunden (ItemsControl über die registrierten Views)
statt einzeln im Layout festgeschrieben: die WinForms-Fassung hatte je Modul einen fest
verdrahteten Button, der bei fehlendem Modul deaktiviert wurde. Über die Bindung erscheinen
genau die Fenster, die es wirklich gibt — das ist robuster und bleibt trotzdem deklarativ.
dann die Fenster-Buttons, Account-Übersicht, Modul-KPIs und Live-Überblick-Widgets, unten die Statusleiste.
-->
<DockPanel>
<controls:WindowMenuBar Name="menuBar" DockPanel.Dock="Top" />
@@ -65,10 +61,97 @@
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Name="lblPortInfo"
Foreground="{DynamicResource AppWarningBrush}"
TextWrapping="Wrap"
Text="Portierung läuft: Dashboard, Terminal, Einstellungen und die Modul-Fenster werden noch auf Avalonia umgestellt. Die Trading-Dienste laufen davon unabhängig." />
<!-- Account-Übersicht -->
<HeaderedContentControl Header="Account-Übersicht">
<DataGrid Name="gridAccounts" x:DataType="vm:AccountOverviewRow" Height="180">
<DataGrid.Columns>
<DataGridTextColumn Header="Account" Width="180" Binding="{Binding Name}" />
<DataGridTextColumn Header="Module" Width="220" Binding="{Binding Modules}" />
<DataGridTemplateColumn Header="Polymarket" Width="110">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:DataType="vm:AccountOverviewRow">
<Button Content="Profil"
Padding="10,2" Margin="2"
Click="OnOpenPolymarketProfileClick"
HorizontalAlignment="Center" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Wallet (USDC)" Width="130" Binding="{Binding Balance, StringFormat=\{0:N2\}}" />
<DataGridTextColumn Header="3T PnL" Width="120" Binding="{Binding Pnl3d, StringFormat=\{0:N2\}}" />
<DataGridTextColumn Header="3T Winrate %" Width="120" Binding="{Binding WinRate3d, StringFormat=\{0:N1\}}" />
<DataGridTextColumn Header="Overall P/L" Width="130" Binding="{Binding OverallPnl, StringFormat=\{0:N2\}}" />
</DataGrid.Columns>
</DataGrid>
</HeaderedContentControl>
<!-- Modul-KPIs -->
<HeaderedContentControl Header="Modul-KPIs">
<ItemsControl Name="kpiTiles">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:ModuleKpiTile">
<Border BorderBrush="{DynamicResource AppBorderBrush}"
BorderThickness="1"
CornerRadius="4"
Background="{DynamicResource AppCardBrush}"
Padding="10,8" Margin="0,0,8,8" Width="250">
<StackPanel Spacing="4">
<TextBlock Text="{Binding ModuleName}" FontWeight="SemiBold" FontSize="13" />
<TextBlock Text="{Binding Text}"
Foreground="{Binding ForegroundBrush}"
FontFamily="Consolas,Menlo,monospace"
FontSize="11" />
</StackPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</HeaderedContentControl>
<!-- Live-Überblick Widgets (3 Spalten) -->
<Grid ColumnDefinitions="*,8,*,8,*">
<!-- Auffällige Trades (24h) -->
<HeaderedContentControl Grid.Column="0" Header="Auffällige Trades (24h)" Height="250">
<DataGrid Name="gridNotable" x:DataType="vm:NotableTradeRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Modul" Width="110" Binding="{Binding Module}" />
<DataGridTextColumn Header="Markt" Width="*" Binding="{Binding Market}" />
<DataGridTextColumn Header="PnL" Width="85" Binding="{Binding Pnl, StringFormat=\{0:F2\}}" />
<DataGridTextColumn Header="PnL %" Width="75" Binding="{Binding PnlPct, StringFormat=\{0:F1\}}" />
</DataGrid.Columns>
</DataGrid>
</HeaderedContentControl>
<GridSplitter Grid.Column="1" Background="{DynamicResource AppBorderBrush}" />
<!-- Warnungen & Fehler (heute) -->
<HeaderedContentControl Grid.Column="2" Name="grpAlerts" Header="Warnungen &amp; Fehler (heute)" Height="250">
<DataGrid Name="gridAlerts" x:DataType="vm:LogAlertRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Zeit" Width="75" Binding="{Binding Time}" />
<DataGridTextColumn Header="Level" Width="80" Binding="{Binding Level}" />
<DataGridTextColumn Header="Nachricht" Width="*" Binding="{Binding Message}" />
</DataGrid.Columns>
</DataGrid>
</HeaderedContentControl>
<GridSplitter Grid.Column="3" Background="{DynamicResource AppBorderBrush}" />
<!-- Supervisor-KI (letzter Bericht) -->
<HeaderedContentControl Grid.Column="4" Header="Supervisor-KI (letzter Bericht)" Height="250">
<Border BorderBrush="{DynamicResource AppBorderBrush}" BorderThickness="1" Background="{DynamicResource AppCardBrush}" Padding="8">
<ScrollViewer>
<SelectableTextBlock Name="txtSupervisor" TextWrapping="Wrap" FontSize="12" FontFamily="Consolas,Menlo,monospace" />
</ScrollViewer>
</Border>
</HeaderedContentControl>
</Grid>
</StackPanel>
</ScrollViewer>
</DockPanel>