using System.Windows.Media; using DesktopBot.Services; namespace DesktopBot.ViewModels { /// /// ViewModel per l'indicatore di ping verso Alpaca. /// Esposto in MainViewModel e mostrato nella sidebar. /// public class PingViewModel : BaseViewModel { private int _latencyMs = -1; private bool _isOnline; private string _statusText = "---"; private Brush _statusColor; private static readonly Brush BrushGood = new SolidColorBrush(Color.FromRgb(0x00, 0xC8, 0x5A)); // verde private static readonly Brush BrushFair = new SolidColorBrush(Color.FromRgb(0xFF, 0xBF, 0x00)); // giallo private static readonly Brush BrushPoor = new SolidColorBrush(Color.FromRgb(0xFF, 0x60, 0x00)); // arancione private static readonly Brush BrushOffline = new SolidColorBrush(Color.FromRgb(0xFF, 0x33, 0x33)); // rosso private static readonly Brush BrushIdle = new SolidColorBrush(Color.FromRgb(0x66, 0x66, 0x80)); // grigio public int LatencyMs { get => _latencyMs; private set => SetProperty(ref _latencyMs, value); } public bool IsOnline { get => _isOnline; private set => SetProperty(ref _isOnline, value); } public string StatusText { get => _statusText; private set => SetProperty(ref _statusText, value); } public Brush StatusColor { get => _statusColor ??= BrushIdle; private set => SetProperty(ref _statusColor, value); } public void Update(PingResult result) { var dispatcher = System.Windows.Application.Current?.Dispatcher; if (dispatcher != null && !dispatcher.CheckAccess()) { dispatcher.Invoke(() => Apply(result)); return; } Apply(result); } private void Apply(PingResult result) { LatencyMs = result.LatencyMs; IsOnline = result.IsSuccess; switch (result.Status) { case PingStatus.Good: StatusText = $"{result.LatencyMs} ms"; StatusColor = BrushGood; break; case PingStatus.Fair: StatusText = $"{result.LatencyMs} ms"; StatusColor = BrushFair; break; case PingStatus.Poor: StatusText = $"{result.LatencyMs} ms"; StatusColor = BrushPoor; break; default: StatusText = "OFFLINE"; StatusColor = BrushOffline; break; } } } }