Phase 2: Launcher-UI + eigenstaendige Modul-Fenster

- Form1 -> LauncherForm (Dateien via git mv, Designer/resx angepasst)
- Modul-Tab: Karten aus ModuleRegistry mit "Fenster oeffnen"-Button je Modul
- UI/WindowManager: Fenster-Tracking (Key->Form), Re-Open fokussiert, CloseAll
- UI/ModuleFormBase: Basisklasse fuer eigenstaendige Modul-Fenster
- CongressTradingForm: DB-Kennzahlen + manueller Scrape-Trigger (Phase-4-Ausbau folgt)
- WindowManager in DI; Launcher schliesst Modul-Fenster beim Beenden
- Tests: WindowManager (6) -> 21/21 gruen; Launcher-Start verifiziert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
This commit is contained in:
Richard
2026-07-27 10:39:50 +02:00
parent 5815d3258f
commit d0bc833235
11 changed files with 483 additions and 59 deletions
@@ -1,8 +1,13 @@
using FluentAssertions;
using IBKRTrader.Core.Database;
using IBKRTrader.Core.Logging;
using IBKRTrader.Core.Settings;
using IBKRTrader.Core.Workers;
using IBKRTrader.Modules.CongressTrading;
using IBKRTrader.Modules.CongressTrading.Database;
using IBKRTrader.Modules.CongressTrading.Scraper;
using IBKRTrader.Modules.CongressTrading.Workers;
using IBKRTrader.UI;
using Microsoft.Extensions.DependencyInjection;
namespace IBKRTrader.Tests.Modules;
@@ -39,11 +44,22 @@ public class CongressTradingModuleTests
}
[Fact]
public void CreateWindow_ReturnsForm()
public void CreateWindow_ReturnsModuleForm()
{
using var form = new CongressTradingModule().CreateWindow(new ServiceCollection().BuildServiceProvider());
// Minimaler DI-Container mit allen von CreateWindow benötigten Abhängigkeiten.
var services = new ServiceCollection();
services.AddSingleton<SettingsService>();
services.AddSingleton<LoggingService>();
services.AddSingleton<DatabaseService>();
services.AddSingleton<IEnumerable<IWorker>>(_ => Array.Empty<IWorker>());
services.AddSingleton<WorkerEngine>();
var module = new CongressTradingModule();
module.RegisterServices(services);
form.Should().NotBeNull();
form.Text.Should().Contain("CT");
using var provider = services.BuildServiceProvider();
using var form = module.CreateWindow(provider);
form.Should().BeAssignableTo<ModuleFormBase>();
((ModuleFormBase)form).ModuleKey.Should().Be("CT");
}
}