using System; using System.Collections.Generic; using System.Linq; namespace PolyTrader.Core.Modularity { /// /// Alle Module, die diese Installation kennt – geladen oder nicht (#560). /// /// Die Liste stand bis dahin viermal im Code: beim Start (Program), im Modul-Tab des Desktops /// (CoreViews), bei den nicht verfügbaren Ansichten (ModuleViews) und hartkodiert im WebUI. Ein neues /// Modul musste an allen vier Stellen nachgetragen werden. Fehlte es an einer, ließ es sich dort weder /// sehen noch wieder aktivieren. Der Start registriert jetzt diese eine Liste; wer sie braucht, fragt /// sie ab. /// public sealed class KnownModules { public KnownModules(IEnumerable modules) { All = (modules ?? throw new ArgumentNullException(nameof(modules))).ToList(); } public IReadOnlyList All { get; } public IPolyTraderModule? Find(string name) => All.FirstOrDefault(m => string.Equals(m.Name, name, StringComparison.OrdinalIgnoreCase)); } /// /// Was ein Modul-Schalter zeigt und darf. Die Regeln stammen aus dem Modul-Tab des Desktops und liegen /// jetzt hier, damit Desktop und WebUI dasselbe anzeigen (#560). /// public sealed record ModuleActivationView( string Name, bool IsRunning, bool DesiredEnabled, string? Blocker, string Status, string Hint, string Action, bool CanToggle) { public const string RestartHint = "Änderung greift nach Neustart"; public static ModuleActivationView Describe(ModuleActivationInfo info, bool desiredEnabled) { if (!string.IsNullOrEmpty(info.Blocker)) return new(info.Name, info.IsRunning, desiredEnabled, info.Blocker, "⚠ Nicht aktivierbar", info.Blocker!, "—", false); if (info.IsRunning && desiredEnabled) return new(info.Name, true, true, null, "Aktiv", "", "Deaktivieren", true); if (info.IsRunning) return new(info.Name, true, false, null, "Aktiv – stoppt nach Neustart", RestartHint, "Aktivieren", true); if (desiredEnabled) return new(info.Name, false, true, null, "Startet nach Neustart", RestartHint, "Deaktivieren", true); return new(info.Name, false, false, null, "Deaktiviert", "", "Aktivieren", true); } } }