Files
PolyTraderSharp/src/PolyTrader.App.Avalonia/Shell/CoreViews.cs
T

122 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using PolyTrader.Core.Modularity;
using PolyTraderSharp;
using PolyTraderSharp.Services;
namespace PolyTrader.App.Avalonia.Shell
{
/// <summary>
/// Registriert die Seiten, die der Core selbst beisteuert (Start, Dashboard, Einstellungen,
/// Terminal, Jobs). Gegenstück zur entsprechenden Registrierung im WinForms-Program.cs –
/// die View-IDs sind bewusst identisch, damit Symbole und Reihenfolge unverändert greifen.
/// </summary>
public static class CoreViews
{
/// <summary>Quelle/Ziel der Modul-Aktivierung – dieselbe Datei wie im Host.</summary>
private const string ServerSettingsPath = "server_settings.xml";
public static void Register(IModuleUiHost host, IServiceProvider services)
{
// Die Startseite ist seit der Einfenster-Shell eine View wie jede andere: sie steht in
// der Seitenleiste, wird über OpenView aufgerufen und beim Start als erste angezeigt.
// Sie heißt „Dashboard", weil sie genau das ist: Kennzahlen, Konten und Live-Überblick.
host.RegisterView(new ModuleView
{
Id = AvaloniaUiHost.StartViewId,
Title = "Dashboard",
Group = "Core",
Order = 0,
CreateView = () => new Views.LauncherWindow(host, services)
});
host.RegisterView(new ModuleView
{
Id = "core.dashboard",
// Umbenannt: „Dashboard" heißt jetzt die Startseite; diese Auswertungsansicht
// (KPIs, Diagramme, Tradehistorie) läuft unter „Analytics". Die View-ID bleibt
// bewusst unverändert – daran hängen Symbole, Einstellungen und die Gruppierung.
Title = "Analytics",
Group = "Core",
Order = 10,
CreateView = () => new Views.DashboardWindow(
host,
services.GetRequiredService<PolyTrader.Core.Persistence.ITradeLogRepository>(),
services.GetRequiredService<TradingState>(),
BuildModuleInfos(services),
ServerSettingsPath)
});
host.RegisterView(new ModuleView
{
Id = "core.settings",
Title = "Server Settings",
Group = "Core",
Order = 20,
CreateView = () => new Views.SettingsWindow(
host,
services.GetRequiredService<PolyTrader.Core.Persistence.IAccountRepository>(),
services.GetRequiredService<TradingState>(),
services.GetRequiredService<TerminalLogger>(),
services.GetService<WatchdogHeartbeatService>(),
services.GetService<MullvadVpnService>(),
services.GetService<PolyTrader.Core.Configuration.DeploymentcenterOptions>(),
services.GetService<PolyTrader.Web.Configuration.WebUiOptions>())
});
host.RegisterView(new ModuleView
{
Id = "core.jobs",
Title = "Server Jobs",
Group = "Core",
Order = 30,
CreateView = () => new Views.JobsWindow(host, services.GetRequiredService<JobManager>())
});
host.RegisterView(new ModuleView
{
Id = "core.terminal",
Title = "Terminal / Logs",
Group = "Core",
Order = 40,
CreateView = () => new Views.TerminalWindow(host, services.GetRequiredService<TerminalLogger>())
});
}
/// <summary>
/// Baut die Aktivierungs-Übersicht für den Modul-Tab: alle bekannten Module, ob sie in dieser
/// Sitzung laufen, und ein etwaiger Grund gegen die Aktivierung (z.B. fehlender API-Key).
/// </summary>
private static IReadOnlyList<ModuleActivationInfo> BuildModuleInfos(IServiceProvider services)
{
var running = services.GetServices<IPolyTraderModule>().ToList();
var runningNames = running.Select(m => m.Name).ToHashSet(StringComparer.OrdinalIgnoreCase);
var config = services.GetRequiredService<IConfiguration>();
// Auch die NICHT geladenen Module auflisten – sonst liessen sie sich nie wieder aktivieren.
var all = new IPolyTraderModule[]
{
new PolyTrader.Modules.CopyTrading.CopyTradingModule(),
new PolyTrader.Modules.ResolutionFarming.ResolutionFarmingModule(),
new PolyTrader.Modules.Supervisor.SupervisorModule(),
new PolyTrader.Modules.Accounting.AccountingModule()
};
return all.Select(m => new ModuleActivationInfo(
m.Name,
runningNames.Contains(m.Name),
SafeBlocker(m, config)))
.ToList();
static string? SafeBlocker(IPolyTraderModule m, IConfiguration config)
{
try { return m.GetActivationBlocker(config); }
catch (Exception ex) { return $"Prüfung fehlgeschlagen: {ex.Message}"; }
}
}
}
}