using System.Collections.ObjectModel; using Avalonia.Controls; using Avalonia.Input.Platform; using Avalonia.Markup.Xaml; using Avalonia.Media; using Avalonia.Threading; using IBKRTrader.App.Shell; using IBKRTrader.App.ViewModels; using IBKRTrader.Core.Logging; using IBKRTrader.Core.Modularity; using IBKRTrader.Core.Time; namespace IBKRTrader.App.Views; /// /// Core-Ansicht: Live-Log, an das -Ereignis gebunden. /// /// Einfärbung und der Wechsel auf den UI-Thread liegen hier, nicht mehr im Logging-Dienst – /// der Core trägt seit der Portierung keine UI-Abhängigkeit. Der Dienst schreibt aus beliebigen /// Worker-Threads, deshalb geht jeder Eintrag über den Dispatcher. /// public partial class LogsWindow : Window { /// /// Obergrenze der angezeigten Zeilen. Ohne sie wüchse die Liste im Dauerbetrieb unbegrenzt – /// die vollständige Historie steht ohnehin in den Logdateien. /// private const int MaxLines = 5000; private static readonly IBrush ColorInfo = new SolidColorBrush(Color.FromRgb(150, 210, 150)); private static readonly IBrush ColorWarn = new SolidColorBrush(Color.FromRgb(255, 190, 60)); private static readonly IBrush ColorError = new SolidColorBrush(Color.FromRgb(255, 80, 80)); private readonly LoggingService _logger; private readonly ObservableCollection _rows = []; private string _filter = ""; public LogsWindow(IModuleUiHost uiHost, LoggingService logger) { _logger = logger; InitializeComponent(); WindowMenu.Wire(this.FindControl("WindowMenuBar")!, uiHost, "core.logs"); this.FindControl("LogList")!.ItemsSource = _rows; this.FindControl