namespace IBKRTrader.Core.Modularity; /// /// Eine vom Core oder einem Modul beigesteuerte Fenster-Ansicht. Die Shell zeigt je View höchstens /// eine Instanz und holt ein offenes Fenster wieder nach vorne. /// /// Bewusst toolkit-neutral: liefert ein , /// keinen konkreten Fenstertyp, und ist ein Schlüssel statt eines Bildes. /// Dadurch trägt der Core keine UI-Abhängigkeit und bleibt plattformneutral – Voraussetzung für den /// kopflosen Linux-Betrieb. Insbesondere hängt hier kein System.Drawing.Image mehr: /// System.Drawing.Common ist seit .NET 7 Windows-only und wirft auf Linux. Die jeweilige /// Shell kennt ihr Toolkit und castet – die WinForms-Shell auf Form, die Avalonia-Shell /// auf Window. /// 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 Fenster keinen eigenen setzt). public string Title { get; init; } = "Fenster"; /// Optionale Gruppierung (z. B. "Core", "CongressTrading"). public string? Group { get; init; } /// Optionale Sortierreihenfolge in Menü/Buttons. public int Order { get; init; } = 0; /// /// Logischer Schlüssel des Symbols für Menü/Buttons (z. B. "dashboard", "logs"). Die Shell löst /// ihn gegen ihre eigenen Bildressourcen auf. Settable, damit die Shell den von Modulen /// registrierten Views zentral ein Symbol zuweisen kann – Module kennen die Shell-Ressourcen nicht. /// public string? IconKey { get; set; } /// /// Erzeugt das anzuzeigende Fenster (frische Instanz je Öffnung). Rückgabetyp ist /// – siehe Klassen-Doku zur Toolkit-Neutralität. /// public Func CreateView { get; init; } = () => new object(); } /// /// Wird der Shell beim Start übergeben; Core und Module registrieren hier ihre Ansichten. /// Über die Navigations-Mitglieder kann JEDES Fenster (auch Modul-Fenster, die nur den Core kennen) /// das gemeinsame „Fenster"-Menü bauen. /// 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. void OpenView(string viewId); /// Holt das Hauptfenster (Launcher) in den Vordergrund. void ActivateMain(); /// Leitet das (bestätigte) Herunterfahren der App ein. Aus jedem Fenster aufrufbar. void RequestShutdown(); /// Feuert, wenn sich der Offen-Status irgendeiner View ändert. event Action? OpenStateChanged; }