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"); btn_jobs.Click += (_, _) => OpenView("core.jobs"); btn_dashboard.Click += (_, _) => OpenView("core.dashboard"); btn_liveTrading.Click += (_, _) => CycleLiveTrading(); btn_demoTrading.Click += (_, _) => CycleDemoTrading(); miLegacy.Click += (_, _) => OpenLegacy(); miBeenden.Click += (_, _) => Close(); _statusTimer.Tick += (_, _) => UpdateStatus(); _statusTimer.Start(); UpdateStatus(); UpdateTradingToggles(); } private void CycleLiveTrading() { _state.LiveTradingMode = _state.LiveTradingMode switch { TradingMode.Inactive => TradingMode.SellOnly, TradingMode.SellOnly => TradingMode.Active, _ => TradingMode.Inactive }; UpdateTradingToggles(); } private void CycleDemoTrading() { _state.DemoTradingMode = _state.DemoTradingMode switch { TradingMode.Inactive => TradingMode.SellOnly, TradingMode.SellOnly => TradingMode.Active, _ => TradingMode.Inactive }; UpdateTradingToggles(); } private void UpdateTradingToggles() { ApplyToggle(btn_liveTrading, "LiveTrading", _state.LiveTradingMode); ApplyToggle(btn_demoTrading, "DemoTrading", _state.DemoTradingMode); static void ApplyToggle(ToolStripButton btn, string label, TradingMode mode) { switch (mode) { case TradingMode.Active: btn.Text = $"{label} (AKTIV)"; btn.BackColor = System.Drawing.Color.LightGreen; break; case TradingMode.SellOnly: btn.Text = $"{label} (SELL-ONLY)"; btn.BackColor = System.Drawing.Color.Orange; break; default: btn.Text = $"{label} (DEAKTIVIERT)"; btn.BackColor = System.Drawing.Color.IndianRed; break; } } } /// Ö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")}"; // Toggle-Buttons mit externem State synchron halten (z.B. Änderungen aus der Legacy-UI). UpdateTradingToggles(); } 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(); } } }