122 lines
5.4 KiB
C#
122 lines
5.4 KiB
C#
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}"; }
|
||
}
|
||
}
|
||
}
|
||
}
|