Phase 5-UI: Copytrading-Modul-Views (Master-Trader, Closed Trades, Account-Settings)

- MasterTradersView: Liste + PropertyGrid-Editor + Account-Zuweisung
  (CheckedListBox -> AssignedAccountIds), Neu/Speichern/Loeschen; persistiert
  via ITrackedTraderRepository + synct CopyTradingState.Traders.
- ClosedTradesView: read-only Grid der geschlossenen Copytrades mit
  aufgeloesten Account-/Trader-Namen + Kurzauswertung (ICopyTradeLogRepository).
- AccountSettingsView: Account-Auswahl + PropertyGrid fuer
  CopyTradingAccountSettings, Speichern via Repo + State-Sync.
- IPolyTraderModule.RegisterUi erhaelt jetzt IServiceProvider (Module loesen
  ihre View-Abhaengigkeiten auf); Program uebergibt viewServices.
- CopyTradingModule.RegisterUi registriert die 3 Views (Group "CopyTrading").
- LauncherForm haengt Modul-Views dynamisch als Buttons an toolstrip_windows
  (Core kennt keine Modulnamen; Bindung nur ueber View-IDs).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-05 20:09:56 +02:00
co-authored by Claude Opus 4.8
parent b951b912f4
commit 05e0576965
8 changed files with 519 additions and 6 deletions
@@ -8,6 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
using PolyTrader.Core.Modularity;
using PolyTrader.Modules.CopyTrading.Persistence;
using PolyTrader.Modules.CopyTrading.Persistence.Ef;
using PolyTrader.Modules.CopyTrading.Ui;
using PolyTraderSharp;
using PolyTraderSharp.Models;
using PolyTraderSharp.Services;
@@ -52,9 +53,43 @@ namespace PolyTrader.Modules.CopyTrading
services.AddHostedService<TraderAnalyticsJob>();
}
public void RegisterUi(IModuleUiHost host)
public void RegisterUi(IModuleUiHost host, IServiceProvider services)
{
// TODO: Master-Traders- und Geschlossene-Trades-Views als Modul-UI beisteuern.
host.RegisterView(new ModuleView
{
Id = "copytrading.masters",
Title = "Master-Trader",
Group = "CopyTrading",
Order = 100,
CreateForm = () => new MasterTradersView(
services.GetRequiredService<ITrackedTraderRepository>(),
services.GetRequiredService<TradingState>(),
services.GetRequiredService<CopyTradingState>())
});
host.RegisterView(new ModuleView
{
Id = "copytrading.closedtrades",
Title = "Geschlossene Copytrades",
Group = "CopyTrading",
Order = 110,
CreateForm = () => new ClosedTradesView(
services.GetRequiredService<ICopyTradeLogRepository>(),
services.GetRequiredService<TradingState>(),
services.GetRequiredService<CopyTradingState>())
});
host.RegisterView(new ModuleView
{
Id = "copytrading.accountsettings",
Title = "Copytrading-Account-Einstellungen",
Group = "CopyTrading",
Order = 120,
CreateForm = () => new AccountSettingsView(
services.GetRequiredService<ICopyTradingAccountSettingsRepository>(),
services.GetRequiredService<TradingState>(),
services.GetRequiredService<CopyTradingState>())
});
}
public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;