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:
co-authored by
Claude Opus 4.8
parent
ff1db2aea0
commit
ad5ba34b56
+32
-7
@@ -1,22 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using PolyTrader.Core.Modularity;
|
||||
|
||||
namespace PolyTraderSharp.Ui
|
||||
{
|
||||
/// <summary>
|
||||
/// Sammelt die von Core-App und Modulen registrierten Views und öffnet sie als
|
||||
/// eigenständige Host-Fenster (Einzelinstanz je View).
|
||||
/// Verwaltet die registrierten Fenster-Views: öffnet sie als eigenständige Forms,
|
||||
/// hält je View höchstens eine Instanz offen und holt ein bereits offenes Fenster
|
||||
/// wieder in den Vordergrund. Meldet Änderungen am Offen-Status (für die
|
||||
/// Button-Markierung im Launcher).
|
||||
/// </summary>
|
||||
public class ShellUiHost : IModuleUiHost
|
||||
{
|
||||
private readonly List<ModuleView> _views = new();
|
||||
private readonly Dictionary<string, ViewHostForm> _open = new();
|
||||
private readonly Dictionary<string, Form> _open = new();
|
||||
|
||||
/// <summary>Wird ausgelöst, wenn sich der Offen-Status irgendeiner View ändert.</summary>
|
||||
public event Action? OpenStateChanged;
|
||||
|
||||
public IReadOnlyList<ModuleView> Views => _views;
|
||||
|
||||
public void RegisterView(ModuleView view) => _views.Add(view);
|
||||
|
||||
public bool IsOpen(string viewId) =>
|
||||
_open.TryGetValue(viewId, out var form) && !form.IsDisposed;
|
||||
|
||||
public void OpenView(string viewId)
|
||||
{
|
||||
var view = _views.FirstOrDefault(v => v.Id == viewId);
|
||||
if (view != null) OpenView(view);
|
||||
}
|
||||
|
||||
public void OpenView(ModuleView view)
|
||||
{
|
||||
if (_open.TryGetValue(view.Id, out var existing) && !existing.IsDisposed)
|
||||
@@ -28,10 +44,19 @@ namespace PolyTraderSharp.Ui
|
||||
return;
|
||||
}
|
||||
|
||||
var host = new ViewHostForm(view);
|
||||
host.FormClosed += (_, _) => _open.Remove(view.Id);
|
||||
_open[view.Id] = host;
|
||||
host.Show();
|
||||
var form = view.CreateForm();
|
||||
if (string.IsNullOrEmpty(form.Text) || form.Text == form.Name)
|
||||
form.Text = view.Title;
|
||||
|
||||
_open[view.Id] = form;
|
||||
form.FormClosed += (_, _) =>
|
||||
{
|
||||
_open.Remove(view.Id);
|
||||
OpenStateChanged?.Invoke();
|
||||
};
|
||||
|
||||
form.Show();
|
||||
OpenStateChanged?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user