using System; using System.Collections.Generic; using System.Windows.Forms; namespace PolyTrader.Core.Modularity { /// /// Eine vom Core oder einem Modul beigesteuerte Fenster-Ansicht. Die eigentliche UI ist /// ein designbares , das über erzeugt wird /// (mit DI-Abhängigkeiten). Die Shell zeigt je View höchstens eine Instanz und holt ein /// bereits offenes Fenster wieder in den Vordergrund. /// public sealed class ModuleView { /// Stabile ID für Einzelinstanz-Handling (nur ein Fenster je View). public string Id { get; init; } = Guid.NewGuid().ToString(); /// Titel (Fallback-Fenstertitel, falls das Form keinen eigenen setzt). public string Title { get; init; } = "Fenster"; /// Optionale Gruppierung (z.B. "Core", "CopyTrading"). public string? Group { get; init; } /// Optionale Sortierreihenfolge. public int Order { get; init; } = 0; /// /// Optionales Icon für Menü/Buttons. Wird von der Shell/den Menüs genutzt. Settable, damit die /// App den von Modulen registrierten Views zentral ein Icon aus ihren Ressourcen zuweisen kann /// (Module referenzieren die App-Ressourcen nicht). /// public System.Drawing.Image? Icon { get; set; } /// Erzeugt das anzuzeigende Fenster (frische Instanz je Öffnung). public Func
CreateForm { get; init; } = () => new Form(); } /// /// Wird der Shell beim Start übergeben; Core und Module registrieren hier ihre Ansichten. /// Die Shell (Launcher) öffnet die Fenster auf Anforderung und verwaltet den Offen-Status. /// Über die Navigations-Mitglieder kann JEDES Fenster (auch Modul-Fenster, die nur den Core /// kennen) das gemeinsame „Fenster"-Menü bauen (siehe ). /// public interface IModuleUiHost { void RegisterView(ModuleView view); /// Alle registrierten Ansichten (Core + Module). IReadOnlyList Views { get; } /// Ist das Fenster dieser View gerade offen? bool IsOpen(string viewId); /// Öffnet die View bzw. holt ein bereits offenes Fenster in den Vordergrund (maximiert). void OpenView(string viewId); /// Holt das Hauptfenster (Launcher) in den Vordergrund. void ActivateMain(); /// /// Leitet das sichere Herunterfahren ein (Bestätigungsdialog mit Timer). Wird vom „Beenden"- /// Eintrag JEDES Fensters aufgerufen – auch aus Modul-Fenstern, die die App nicht kennen. /// Die konkrete Shell zeigt den Dialog und fährt bei Bestätigung geordnet herunter. /// void RequestShutdown(); /// Feuert, wenn sich der Offen-Status irgendeiner View ändert. event Action? OpenStateChanged; } }