diff --git a/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs b/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs index 328a158..56c4399 100644 --- a/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs +++ b/src/PolyTrader.Core/Modularity/IPolyTraderModule.cs @@ -8,12 +8,7 @@ namespace PolyTrader.Core.Modularity /// /// Vertrag für ein PolyTrader-Modul. Module referenzieren nur den Core, niemals /// einander. Ein Modul kapselt einen eigenständigen Funktionsbereich (z.B. Copytrading) - /// mit eigenen Services, Jobs, DB-Objekten und – ab Phase 5 – eigenen UI-Tabs und - /// Settings-Sektionen. - /// - /// Hinweis: Der UI-Beitrag (RegisterUi/IModuleUiHost) wird in Phase 5 ergänzt, sobald - /// die konkrete UI-Integration (Tabs + Settings-Sektion) feststeht. Bis dahin deckt der - /// Contract Lebenszyklus und Service-Registrierung ab. + /// mit eigenen Services, Jobs, DB-Objekten sowie eigenen UI-Ansichten und Settings-Sektionen. /// public interface IPolyTraderModule { @@ -32,6 +27,13 @@ namespace PolyTrader.Core.Modularity /// void RegisterServices(IServiceCollection services, IConfiguration configuration); + /// + /// Registriert die UI-Ansichten des Moduls bei der Shell (Launcher). Die Shell öffnet + /// jede Ansicht auf Wunsch in einem eigenen Host-Fenster. Module liefern designbare + /// UserControls; die Shell bleibt modul-agnostisch. + /// + void RegisterUi(IModuleUiHost host); + /// Wird nach der Core-Hydration gestartet (kein Anlaufen gegen leeren State). Task StartAsync(CancellationToken cancellationToken); diff --git a/src/PolyTrader.Core/Modularity/ModuleUi.cs b/src/PolyTrader.Core/Modularity/ModuleUi.cs new file mode 100644 index 0000000..e6083fc --- /dev/null +++ b/src/PolyTrader.Core/Modularity/ModuleUi.cs @@ -0,0 +1,41 @@ +using System; +using System.Windows.Forms; + +namespace PolyTrader.Core.Modularity +{ + /// + /// Eine vom Core oder einem Modul beigesteuerte UI-Ansicht. Die Shell entscheidet, + /// wie sie präsentiert wird (aktuell: eigenständiges Host-Fenster über den Launcher). + /// Die eigentliche UI ist ein designbares (i.d.R. ein UserControl), + /// das über erzeugt wird (mit DI-Abhängigkeiten). + /// + public sealed class ModuleView + { + /// Stabile ID für Einzelinstanz-Handling (nur ein Fenster je View). + public string Id { get; init; } = Guid.NewGuid().ToString(); + + /// Titel für Launcher-Eintrag und Fenstertitel. + public string Title { get; init; } = "View"; + + /// Optionale Gruppierung im Launcher (z.B. "Core", "CopyTrading"). + public string? Group { get; init; } + + /// Optionale Sortierreihenfolge im Launcher. + public int Order { get; init; } = 0; + + /// Erzeugt das anzuzeigende Control (frische Instanz je Fensteröffnung). + public Func CreateControl { get; init; } = () => new Control(); + + public int PreferredWidth { get; init; } = 900; + public int PreferredHeight { get; init; } = 600; + } + + /// + /// Wird der Shell beim Start übergeben; Core und Module registrieren hier ihre Ansichten. + /// Der Launcher rendert daraus seine Einträge und öffnet je View ein Host-Fenster. + /// + public interface IModuleUiHost + { + void RegisterView(ModuleView view); + } +} diff --git a/src/PolyTrader.Core/PolyTrader.Core.csproj b/src/PolyTrader.Core/PolyTrader.Core.csproj index b22feec..404fb98 100644 --- a/src/PolyTrader.Core/PolyTrader.Core.csproj +++ b/src/PolyTrader.Core/PolyTrader.Core.csproj @@ -4,6 +4,9 @@ net8.0-windows enable enable + + true