using System; using System.Windows; using System.Windows.Media; using AutoBidder.Utilities; namespace AutoBidder { /// /// Logging functionality with color-coded severity levels and configurable minimum level filtering /// public partial class MainWindow { /// /// Scrive un messaggio nel log globale con filtraggio basato sul livello minimo configurato /// /// Messaggio da loggare /// Livello di severità del messaggio private void Log(string message, LogLevel level = LogLevel.Info) { Dispatcher.BeginInvoke(() => { try { // Carica impostazioni per ottenere livello minimo e limite righe var settings = SettingsManager.Load(); // Filtra messaggi in base al livello minimo configurato MinimumLogLevel minLevel = MinimumLogLevel.Normal; // Default if (Enum.TryParse(settings.MinLogLevel, out var parsedLevel)) { minLevel = parsedLevel; } // Se il livello del messaggio è maggiore del minimo configurato, ignora if ((int)level > (int)minLevel) { return; } var timestamp = DateTime.Now.ToString("HH:mm:ss"); // Prefisso in base al livello per chiarezza string prefix = level switch { LogLevel.Error => "[ERROR]", LogLevel.Warning => "[WARN]", LogLevel.Info => "[INFO]", LogLevel.Success => "[OK]", LogLevel.Debug => "[DEBUG]", LogLevel.Trace => "[TRACE]", _ => "[LOG]" }; var logEntry = $"[{timestamp}] {prefix} {message}"; // Color coding based on severity for dark theme var color = level switch { LogLevel.Error => new SolidColorBrush(Color.FromRgb(232, 17, 35)), // #E81123 (Red) LogLevel.Warning => new SolidColorBrush(Color.FromRgb(255, 191, 0)), // #FFBF00 (Yellow) LogLevel.Success => new SolidColorBrush(Color.FromRgb(0, 216, 0)), // #00D800 (Green) LogLevel.Info => new SolidColorBrush(Color.FromRgb(100, 180, 255)), // #64B4FF (Light Blue) LogLevel.Debug => new SolidColorBrush(Color.FromRgb(255, 140, 255)), // #FF8CFF (Magenta) LogLevel.Trace => new SolidColorBrush(Color.FromRgb(160, 160, 160)), // #A0A0A0 (Gray) _ => new SolidColorBrush(Color.FromRgb(204, 204, 204)) // #CCCCCC (Light Gray) }; var p = new System.Windows.Documents.Paragraph { Margin = new Thickness(0, 2, 0, 2) }; var r = new System.Windows.Documents.Run(logEntry) { Foreground = color }; p.Inlines.Add(r); LogBox.Document.Blocks.Add(p); // Mantieni solo gli ultimi N paragrafi (configurabile dalle impostazioni) int maxLogLines = settings.MaxGlobalLogLines; if (LogBox.Document.Blocks.Count > maxLogLines) { // Rimuovi i paragrafi più vecchi (primi inseriti) int excessCount = LogBox.Document.Blocks.Count - maxLogLines; for (int i = 0; i < excessCount; i++) { if (LogBox.Document.Blocks.FirstBlock != null) { LogBox.Document.Blocks.Remove(LogBox.Document.Blocks.FirstBlock); } } } // Auto-scroll if near bottom if (LogBox.VerticalOffset >= LogBox.ExtentHeight - LogBox.ViewportHeight - 40) { LogBox.ScrollToEnd(); } } catch { } }); } } }