Files
Encelado/DesktopBot/ViewModels/PingViewModel.cs
T
2026-06-09 18:29:41 +02:00

85 lines
2.8 KiB
C#

using System.Windows.Media;
using DesktopBot.Services;
namespace DesktopBot.ViewModels
{
/// <summary>
/// ViewModel per l'indicatore di ping verso Alpaca.
/// Esposto in MainViewModel e mostrato nella sidebar.
/// </summary>
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;
}
}
}
}