UI Slice 1a: Shell-Fundament + Launcher-Buttons statisch + Fenster-Menue + maximiert
- IModuleUiHost (Core) um Navigation erweitert: Views/IsOpen/OpenView/ActivateMain/OpenStateChanged + optionales Icon je ModuleView. So kann JEDES Fenster (auch Modul-Fenster, die nur Core kennen) das gemeinsame Fenster-Menue bauen. - WindowMenu (Core): baut das 'Fenster'-Dropdown (Launcher + alle Views + Beenden), haakt offene Fenster an, markiert das aktuelle fett; Neuaufbau beim Aufklappen. - ShellUiHost: SetMainWindow/ActivateMain; oeffnet ALLE Fenster jetzt MAXIMIERT (Vorgabe). - Launcher: alle Modul-/Core-Buttons STATISCH im Designer (btn_copytrading/-resolutionfarming/ -supervisor ergaenzt), an View-IDs gebunden; fehlt eine View -> Button deaktiviert. Dynamischer Laufzeit-Anhang ENTFERNT -> kein doppelter Accounting-Button mehr; leerer btn_accounting_Click raus. Datei/Beenden -> Fenster-Menue (WindowMenu). Launcher startet maximiert (Sizable, MinSize 1280x720). Build 0 Fehler, --smoke-ui alle 6 Views + Launcher gruen. Fenster-Menue auf den uebrigen Fenstern folgt (1b). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
ca0d4ceed0
commit
f54cd7423b
+15
-25
@@ -35,46 +35,36 @@ namespace PolyTraderSharp.Ui
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
// Fenster-Buttons an stabile View-IDs binden (Views werden per DI registriert).
|
||||
_uiHost.SetMainWindow(this);
|
||||
|
||||
// Fenster-Buttons: ALLE statisch im Designer, an stabile View-IDs gebunden. Ist eine View
|
||||
// nicht registriert (Modul fehlt), wird der Button deaktiviert – nichts wird zur Laufzeit angehängt.
|
||||
_viewButtons = new Dictionary<string, ToolStripButton>
|
||||
{
|
||||
["core.dashboard"] = btn_dashboard,
|
||||
["core.settings"] = btn_settings,
|
||||
["core.terminal"] = btn_terminal,
|
||||
["core.jobs"] = btn_jobs,
|
||||
["copytrading.main"] = btn_copytrading,
|
||||
["resolutionfarming.main"] = btn_resolutionfarming,
|
||||
["supervisor.main"] = btn_supervisor,
|
||||
["accounting.main"] = btn_accounting,
|
||||
};
|
||||
var registered = _uiHost.Views.Select(v => v.Id).ToHashSet();
|
||||
foreach (var (id, btn) in _viewButtons)
|
||||
{
|
||||
var viewId = id;
|
||||
btn.Click += (_, _) => _uiHost.OpenView(viewId);
|
||||
if (registered.Contains(viewId))
|
||||
btn.Click += (_, _) => _uiHost.OpenView(viewId);
|
||||
else
|
||||
btn.Enabled = false; // Modul/View nicht verfügbar
|
||||
}
|
||||
|
||||
// Modul-Views dynamisch anhängen (der Launcher kennt keine Modulnamen; er bindet
|
||||
// nur an registrierte View-IDs). Core-Views sind bereits fest verdrahtet.
|
||||
var moduleViews = _uiHost.Views
|
||||
.Where(v => !_viewButtons.ContainsKey(v.Id))
|
||||
.OrderBy(v => v.Order)
|
||||
.ToList();
|
||||
if (moduleViews.Count > 0)
|
||||
toolstrip_windows.Items.Add(new ToolStripSeparator());
|
||||
foreach (var view in moduleViews)
|
||||
{
|
||||
var btn = new ToolStripButton(view.Title)
|
||||
{
|
||||
Name = "btn_" + view.Id,
|
||||
Overflow = ToolStripItemOverflow.AsNeeded,
|
||||
TextImageRelation = TextImageRelation.ImageAboveText,
|
||||
AutoSize = true
|
||||
};
|
||||
var viewId = view.Id;
|
||||
btn.Click += (_, _) => _uiHost.OpenView(viewId);
|
||||
toolstrip_windows.Items.Add(btn);
|
||||
_viewButtons[view.Id] = btn;
|
||||
}
|
||||
// Gemeinsames „Fenster"-Menü (Launcher ist das aktuelle Fenster → currentViewId null).
|
||||
PolyTrader.Core.Modularity.WindowMenu.Wire(miFenster, _uiHost, null);
|
||||
|
||||
btn_liveTrading.Click += (_, _) => CycleLiveTrading();
|
||||
btn_demoTrading.Click += (_, _) => CycleDemoTrading();
|
||||
miBeenden.Click += (_, _) => Close();
|
||||
|
||||
// Offen-Status der Fenster spiegeln (Button „checked", wenn Fenster offen).
|
||||
_uiHost.OpenStateChanged += UpdateWindowButtonStates;
|
||||
|
||||
Reference in New Issue
Block a user