- 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>
106 lines
3.4 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|