using System; using System.Linq; using System.Windows.Forms; using Microsoft.Extensions.DependencyInjection; using PolyTrader.Core.Modularity; namespace PolyTraderSharp.Ui { /// /// „Startleiste" der PolyTrader.App. Fenster werden über die im Designer platzierten /// Buttons in toolstrip_windows geöffnet bzw. in den Vordergrund geholt. /// toolstrip_quickbar ist für Schnellaktionen (z.B. Trading an/aus) reserviert, /// statusStrip_info zeigt Kernkennzahlen. Der Launcher kennt selbst kein Modul — /// Buttons werden per stabiler View-ID an registrierte Views gebunden. /// public partial class LauncherForm : Form { private readonly ShellUiHost _uiHost; private readonly IServiceProvider _services; private readonly TradingState _state; private readonly System.Windows.Forms.Timer _statusTimer = new() { Interval = 1000 }; private frm_main? _legacyForm; public LauncherForm(ShellUiHost uiHost, IServiceProvider services) { _uiHost = uiHost; _services = services; _state = services.GetRequiredService(); InitializeComponent(); btn_settings.Click += (_, _) => OpenView("core.settings"); btn_terminal.Click += (_, _) => OpenView("core.terminal"); miLegacy.Click += (_, _) => OpenLegacy(); miBeenden.Click += (_, _) => Close(); _statusTimer.Tick += (_, _) => UpdateStatus(); _statusTimer.Start(); UpdateStatus(); } /// Öffnet die Ansicht mit der angegebenen ID (bzw. fokussiert das offene Fenster). private void OpenView(string viewId) { var view = _uiHost.Views.FirstOrDefault(v => v.Id == viewId); if (view != null) _uiHost.OpenView(view); else MessageBox.Show($"Ansicht '{viewId}' ist (noch) nicht registriert.", "Hinweis", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void UpdateStatus() { string trading = _state.GlobalTradingPaused ? "Pausiert" : $"Live={_state.LiveTradingMode} / Demo={_state.DemoTradingMode}"; lbl_trading.Text = $"Trading: {trading}"; int moduleCount = _services.GetServices().Count(); lbl_modules.Text = $"Module: {moduleCount}"; lbl_ratelimit.Text = $"API: {(_state.IsAlchemyHealthy ? "WSS aktiv" : "Polling")}"; } 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(); _legacyForm.FormClosed += (_, _) => _legacyForm = null; _legacyForm.Show(); } } }