Files
PolyTraderSharp/Ui/LauncherForm.cs
T
RichardandClaude Opus 4.8 3503bbb5d4 Phase 5-UI (Proof-of-Pattern): Launcher-Shell + erste extrahierte View (Terminal)
- Ui/LauncherForm: schlanke Startleiste, rendert Buttons dynamisch aus den
  registrierten Views (gruppiert) + Legacy-Button fuer das alte Tab-frm_main.
- Ui/ViewHostForm: generisches Host-Fenster fuer eine View (Control docked fill).
- Ui/ShellUiHost : IModuleUiHost: sammelt Views, oeffnet Einzelinstanz-Fenster.
- Ui/Views/TerminalView: erste designbare View (UserControl + Designer.cs);
  Terminal-Logik aus frm_main extrahiert; DI via Initialize(TerminalLogger)
  -> parameterloser Ctor bleibt fuer den VS-Designer nutzbar.
- Program.cs: startet jetzt LauncherForm (statt frm_main), registriert die
  Terminal-View; App bleibt via Legacy-Button voll bedienbar.
- Build 0 Fehler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 10:47:14 +02:00

106 lines
3.4 KiB
C#

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Extensions.DependencyInjection;
namespace PolyTraderSharp.Ui
{
/// <summary>
/// Schlanke „Startleiste" der PolyTrader.App. Rendert Buttons aus den registrierten
/// Views (gruppiert) und öffnet je View ein eigenständiges Fenster. Kennt selbst
/// kein Modul. Enthält übergangsweise einen Legacy-Button für das alte Tab-frm_main.
/// </summary>
public class LauncherForm : Form
{
private readonly ShellUiHost _uiHost;
private readonly IServiceProvider _services;
private frm_main? _legacyForm;
public LauncherForm(ShellUiHost uiHost, IServiceProvider services)
{
_uiHost = uiHost;
_services = services;
Text = "PolyTrader";
Width = 360;
Height = 520;
StartPosition = FormStartPosition.CenterScreen;
MinimizeBox = true;
MaximizeBox = false;
FormBorderStyle = FormBorderStyle.FixedSingle;
BuildUi();
}
private void BuildUi()
{
var flow = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.TopDown,
WrapContents = false,
AutoScroll = true,
Padding = new Padding(12)
};
foreach (var group in _uiHost.Views
.GroupBy(v => string.IsNullOrEmpty(v.Group) ? "Allgemein" : v.Group)
.OrderBy(g => g.Key))
{
flow.Controls.Add(MakeHeader(group.Key));
foreach (var view in group.OrderBy(v => v.Order).ThenBy(v => v.Title))
{
var captured = view;
flow.Controls.Add(MakeButton(view.Title, (_, _) => _uiHost.OpenView(captured)));
}
}
// Übergangs-Zugang zur alten Tab-UI, bis alle Views extrahiert sind.
flow.Controls.Add(MakeHeader("Übergang"));
flow.Controls.Add(MakeButton("Legacy-UI (alte Tabs)", (_, _) => OpenLegacy()));
Controls.Add(flow);
}
private Label MakeHeader(string text) => new()
{
Text = text,
AutoSize = true,
Font = new Font(Font, FontStyle.Bold),
Margin = new Padding(0, 10, 0, 4)
};
private Button MakeButton(string text, EventHandler onClick)
{
var btn = new Button
{
Text = text,
Width = 310,
Height = 34,
Margin = new Padding(0, 2, 0, 2),
TextAlign = ContentAlignment.MiddleLeft,
UseVisualStyleBackColor = true
};
btn.Click += onClick;
return btn;
}
private void OpenLegacy()
{
if (_legacyForm != null && !_legacyForm.IsDisposed)
{
if (_legacyForm.WindowState == FormWindowState.Minimized)
_legacyForm.WindowState = FormWindowState.Normal;
_legacyForm.BringToFront();
_legacyForm.Activate();
return;
}
_legacyForm = _services.GetRequiredService<frm_main>();
_legacyForm.FormClosed += (_, _) => _legacyForm = null;
_legacyForm.Show();
}
}
}