Modul-Fenster nach Avalonia - UI-Portierung inhaltlich abgeschlossen
Alle acht Fenster laufen jetzt unter Avalonia: Launcher, Dashboard, Settings, Terminal, Server Jobs, Copytrading, ResolutionFarming, Supervisor, Accounting (+ Shutdown- und Allzweck-Dialog). - Copytrading: vier Tabs (Master-Trader mit Account-Zuweisung, Offene Trades, Geschlossene Trades mit Filterleiste, Account-Einstellungen). Zeilenfaerbung nach PnL laeuft ueber DataGrid.LoadingRow - greift damit auch bei virtualisierten Zeilen, anders als das fruehere Faerben in DataBindingComplete. - ResolutionFarming: Kandidaten, Positionen, Historie, Settings - je Konto. - Supervisor: Analyse-Chat gegen den Agenten (Tool-Fortschritt in der Statuszeile), Dossiers mit Markdown-Ansicht, Berichte, Counterfactuals. - Accounting: KPI-Kacheln, Monats-BWA, Ledger, Abruf/Status, PDF- und CSV-Export ueber den plattformneutralen Datei-Dialog. Der SettingsEditor traegt wie erwartet die drei restlichen PropertyGrid-Stellen (Master-Trader, Account-Einstellungen, ResolutionFarming) mit je einem Aufruf. ENTSCHEIDUNG - Modul-Fenster liegen in der App, nicht in den Modulen (begruendet in Views/Modules/README.md): Die App ist der Kompositionswurzel und referenziert ohnehin alle Module. So bleiben die Modulprojekte FREI VON AVALONIA, was fuer den kopflosen Linux-Betrieb den Ausschlag gibt - der Daemon soll keine GUI-Bibliothek mitschleppen. Verifiziert: kein Modul zieht Avalonia. Registrierung in Shell/ModuleViews.cs, und zwar nur fuer tatsaechlich geladene Module - ein per DisabledModules abgeschaltetes Modul bekommt gar kein Fenster. Nebenbei: eigene View-Model-Typen CopyOpenTradeRow/CopyClosedTradeRow statt des Modul-Modells ClosedTradeRow - sie tragen den aufgeloesten Master-Trader-Namen und die Zeilenfarbe, die es dort nicht gibt (und vermeiden die Namensmehrdeutigkeit). Verifiziert: Solution baut, 450 Tests gruen, --smoke-ui gruen (alle 8 Fenster + Launcher + Dialog + Editor-Pruefung), App laeuft real mit allen Trading-Diensten, Linux-Publish laeuft. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using Avalonia.Media;
|
||||
using PolyTrader.Modules.CopyTrading.Logic;
|
||||
|
||||
namespace PolyTrader.App.Avalonia.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// Avalonia-Farbpalette zu den <see cref="TradeRowTint"/>-Kategorien. Die Schwellenlogik liegt
|
||||
/// (getestet) in <see cref="TradeRowColoring"/>; hier steht nur, wie die Kategorien aussehen.
|
||||
/// Werte unverändert aus der WinForms-Oberfläche übernommen.
|
||||
/// </summary>
|
||||
public static class TradeRowPalette
|
||||
{
|
||||
public static readonly IBrush Loss = new SolidColorBrush(Color.FromRgb(245, 200, 200)); // rot
|
||||
public static readonly IBrush SmallWin = new SolidColorBrush(Color.FromRgb(212, 240, 212)); // hellgrün
|
||||
public static readonly IBrush BigWin = new SolidColorBrush(Color.FromRgb(140, 214, 140)); // grün
|
||||
|
||||
public static IBrush ForPnlPercent(decimal pnlPercent) => TradeRowColoring.ForPnlPercent(pnlPercent) switch
|
||||
{
|
||||
TradeRowTint.Loss => Loss,
|
||||
TradeRowTint.BigWin => BigWin,
|
||||
_ => SmallWin
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>Zeile des Grids „Offene Trades" (aufgeloester Kontoname + Zeilenfarbe).</summary>
|
||||
public sealed class CopyOpenTradeRow
|
||||
{
|
||||
public string Account { get; init; } = string.Empty;
|
||||
public string Trader { get; init; } = string.Empty;
|
||||
public string Market { get; init; } = string.Empty;
|
||||
public string Outcome { get; init; } = string.Empty;
|
||||
public string Side { get; init; } = string.Empty;
|
||||
public decimal Entry { get; init; }
|
||||
public decimal Current { get; init; }
|
||||
public decimal Size { get; init; }
|
||||
public decimal Amount { get; init; }
|
||||
public decimal Value { get; init; }
|
||||
public decimal Unrealized { get; init; }
|
||||
public decimal UnrealizedPct { get; init; }
|
||||
public string Status { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>Zeilenhintergrund nach Buchgewinn – wie zuvor die DataBindingComplete-Färbung.</summary>
|
||||
public IBrush RowBrush => TradeRowPalette.ForPnlPercent(UnrealizedPct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Zeile des Grids „Geschlossene Trades". Bewusst eigener Typ und nicht das Modell
|
||||
/// <c>PolyTraderSharp.Models.ClosedTradeRow</c>: hier stehen der aufgeloeste Master-Trader-Name
|
||||
/// und die Zeilenfarbe, die es dort nicht gibt.
|
||||
/// </summary>
|
||||
public sealed class CopyClosedTradeRow
|
||||
{
|
||||
public int TradeId { get; init; }
|
||||
public string Account { get; init; } = string.Empty;
|
||||
public string Trader { get; init; } = string.Empty;
|
||||
public string Market { get; init; } = string.Empty;
|
||||
public string Outcome { get; init; } = string.Empty;
|
||||
public string Side { get; init; } = string.Empty;
|
||||
public decimal Entry { get; init; }
|
||||
public decimal Exit { get; init; }
|
||||
public decimal Size { get; init; }
|
||||
public decimal Pnl { get; init; }
|
||||
public decimal PnlPercent { get; init; }
|
||||
public DateTime OpenedAt { get; init; }
|
||||
public DateTime ClosedAt { get; init; }
|
||||
|
||||
public IBrush RowBrush => TradeRowPalette.ForPnlPercent(PnlPercent);
|
||||
}
|
||||
|
||||
/// <summary>Eintrag der Account-Zuweisung eines Master-Traders (Mehrfachauswahl).</summary>
|
||||
public sealed class AccountAssignment
|
||||
{
|
||||
public int AccountId { get; init; }
|
||||
public string Label { get; init; } = string.Empty;
|
||||
public bool IsAssigned { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
|
||||
namespace PolyTrader.App.Avalonia.ViewModels
|
||||
{
|
||||
@@ -33,4 +33,20 @@ namespace PolyTrader.App.Avalonia.ViewModels
|
||||
/// </summary>
|
||||
public bool CanToggle { get; init; } = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Monatszeile der BWA-Übersicht. Die Werte sind bereits in die gewählte Währung umgerechnet
|
||||
/// und als Text formatiert – die Umrechnung passiert einmal beim Aufbau, nicht je Bindung.
|
||||
/// </summary>
|
||||
public sealed class MonthlyRow
|
||||
{
|
||||
public string Month { get; init; } = string.Empty;
|
||||
public string Net { get; init; } = string.Empty;
|
||||
public string Deposits { get; init; } = string.Empty;
|
||||
public string Withdrawals { get; init; } = string.Empty;
|
||||
public string Fees { get; init; } = string.Empty;
|
||||
public string Volume { get; init; } = string.Empty;
|
||||
public int Trades { get; init; }
|
||||
public string Closing { get; init; } = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Avalonia.Media;
|
||||
using Avalonia.Media;
|
||||
|
||||
namespace PolyTrader.App.Avalonia.ViewModels
|
||||
{
|
||||
@@ -20,4 +20,12 @@ namespace PolyTrader.App.Avalonia.ViewModels
|
||||
public string Cid { get; init; } = string.Empty;
|
||||
public string Message { get; init; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>Ein Eintrag im Supervisor-Analyseverlauf (Frage oder Antwort).</summary>
|
||||
public sealed class ChatEntry
|
||||
{
|
||||
public string Header { get; init; } = string.Empty;
|
||||
public string Text { get; init; } = string.Empty;
|
||||
public IBrush HeaderBrush { get; init; } = Brushes.SteelBlue;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user