- LauncherForm ist jetzt ein echtes Designer-Formular (LauncherForm.Designer.cs): ListView + MenuStrip + Button im Designer platziert/bearbeitbar. Zur Laufzeit werden nur noch ListView-Eintraege/Gruppen (DATEN) aus den registrierten Views befuellt + Events verdrahtet — keine Steuerelemente mehr im Code erzeugt. - TerminalView: Combo-Items, Button-Text/-Farbe in den Designer verlagert; Konstruktor verdrahtet nur noch Verhalten. - Inhaerente Ausnahme (Modul-System): die konkreten View-Eintraege sind Daten, keine vorplatzierbaren Controls -> daher datengetriebene ListView. - Build 0 Fehler. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
81 lines
2.7 KiB
C#
81 lines
2.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using PolyTrader.Core.Modularity;
|
|
|
|
namespace PolyTraderSharp.Ui
|
|
{
|
|
/// <summary>
|
|
/// Schlanke „Startleiste" der PolyTrader.App. Das Layout (ListView, Menü, Button) liegt
|
|
/// im Designer (LauncherForm.Designer.cs). Zur Laufzeit werden ausschließlich die
|
|
/// Listeneinträge (Daten) aus den registrierten Views befüllt — keine Steuerelemente.
|
|
/// Kennt selbst kein Modul.
|
|
/// </summary>
|
|
public partial 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;
|
|
|
|
InitializeComponent();
|
|
|
|
PopulateViews();
|
|
lstViews.DoubleClick += (_, _) => OpenSelected();
|
|
btnOpen.Click += (_, _) => OpenSelected();
|
|
miLegacy.Click += (_, _) => OpenLegacy();
|
|
miBeenden.Click += (_, _) => Close();
|
|
}
|
|
|
|
private void PopulateViews()
|
|
{
|
|
lstViews.BeginUpdate();
|
|
lstViews.Groups.Clear();
|
|
lstViews.Items.Clear();
|
|
|
|
foreach (var group in _uiHost.Views
|
|
.GroupBy(v => string.IsNullOrEmpty(v.Group) ? "Allgemein" : v.Group!)
|
|
.OrderBy(g => g.Key))
|
|
{
|
|
var lvGroup = new ListViewGroup(group.Key) { Header = group.Key };
|
|
lstViews.Groups.Add(lvGroup);
|
|
|
|
foreach (var view in group.OrderBy(v => v.Order).ThenBy(v => v.Title))
|
|
{
|
|
lstViews.Items.Add(new ListViewItem(view.Title, lvGroup) { Tag = view });
|
|
}
|
|
}
|
|
|
|
lstViews.EndUpdate();
|
|
}
|
|
|
|
private void OpenSelected()
|
|
{
|
|
if (lstViews.SelectedItems.Count == 0) return;
|
|
if (lstViews.SelectedItems[0].Tag is ModuleView view)
|
|
_uiHost.OpenView(view);
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|