Phase 5-UI: Views sind echte Forms + Launcher-Offen-Status

- ModuleView liefert jetzt ein Form (CreateForm statt CreateControl); die 4 Views
  (Terminal, Settings, Jobs, Dashboard) von UserControl auf Form umgestellt
  (im Designer als Fenster bearbeitbar). ViewHostForm entfernt.
- ShellUiHost verwaltet offene Forms: Einzelinstanz, bereits offenes Fenster wird
  in den Vordergrund geholt, OpenStateChanged-Event.
- LauncherForm: Fenster-Buttons an View-IDs gebunden; offene Fenster werden am
  Button markiert (Checked), erneuter Klick holt das Fenster nach vorn.
- Build 0 Fehler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-03 09:19:13 +02:00
co-authored by Claude Opus 4.8
parent ff1db2aea0
commit ad5ba34b56
18 changed files with 242 additions and 102 deletions
+11 -14
View File
@@ -4,35 +4,32 @@ using System.Windows.Forms;
namespace PolyTrader.Core.Modularity
{
/// <summary>
/// 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 <see cref="Control"/> (i.d.R. ein UserControl),
/// das über <see cref="CreateControl"/> erzeugt wird (mit DI-Abhängigkeiten).
/// Eine vom Core oder einem Modul beigesteuerte Fenster-Ansicht. Die eigentliche UI ist
/// ein designbares <see cref="Form"/>, das über <see cref="CreateForm"/> 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.
/// </summary>
public sealed class ModuleView
{
/// <summary>Stabile ID für Einzelinstanz-Handling (nur ein Fenster je View).</summary>
public string Id { get; init; } = Guid.NewGuid().ToString();
/// <summary>Titel für Launcher-Eintrag und Fenstertitel.</summary>
public string Title { get; init; } = "View";
/// <summary>Titel (Fallback-Fenstertitel, falls das Form keinen eigenen setzt).</summary>
public string Title { get; init; } = "Fenster";
/// <summary>Optionale Gruppierung im Launcher (z.B. "Core", "CopyTrading").</summary>
/// <summary>Optionale Gruppierung (z.B. "Core", "CopyTrading").</summary>
public string? Group { get; init; }
/// <summary>Optionale Sortierreihenfolge im Launcher.</summary>
/// <summary>Optionale Sortierreihenfolge.</summary>
public int Order { get; init; } = 0;
/// <summary>Erzeugt das anzuzeigende Control (frische Instanz je Fensteröffnung).</summary>
public Func<Control> CreateControl { get; init; } = () => new Control();
public int PreferredWidth { get; init; } = 900;
public int PreferredHeight { get; init; } = 600;
/// <summary>Erzeugt das anzuzeigende Fenster (frische Instanz je Öffnung).</summary>
public Func<Form> CreateForm { get; init; } = () => new Form();
}
/// <summary>
/// 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.
/// Die Shell (Launcher) öffnet die Fenster auf Anforderung und verwaltet den Offen-Status.
/// </summary>
public interface IModuleUiHost
{