using System; using System.Collections.Generic; 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 readonly Dictionary _viewButtons; public LauncherForm(ShellUiHost uiHost, IServiceProvider services) { _uiHost = uiHost; _services = services; _state = services.GetRequiredService(); InitializeComponent(); // Fenster-Buttons an stabile View-IDs binden (Views werden per DI registriert). _viewButtons = new Dictionary { ["core.dashboard"] = btn_dashboard, ["core.settings"] = btn_settings, ["core.terminal"] = btn_terminal, ["core.jobs"] = btn_jobs, }; foreach (var (id, btn) in _viewButtons) { var viewId = id; btn.Click += (_, _) => _uiHost.OpenView(viewId); } btn_liveTrading.Click += (_, _) => CycleLiveTrading(); btn_demoTrading.Click += (_, _) => CycleDemoTrading(); miBeenden.Click += (_, _) => Close(); // Offen-Status der Fenster spiegeln (Button „checked", wenn Fenster offen). _uiHost.OpenStateChanged += UpdateWindowButtonStates; _statusTimer.Tick += (_, _) => UpdateStatus(); _statusTimer.Start(); UpdateStatus(); UpdateTradingToggles(); UpdateWindowButtonStates(); } private void UpdateWindowButtonStates() { if (IsDisposed) return; foreach (var (id, btn) in _viewButtons) btn.Checked = _uiHost.IsOpen(id); } 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; } } } 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")}"; UpdateTradingToggles(); UpdateWindowButtonStates(); } } }