using System.ComponentModel; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.VisualTree; using ZB.MOM.WW.LmxOpcUa.Client.UI.ViewModels; namespace ZB.MOM.WW.LmxOpcUa.Client.UI.Views; public partial class AlarmsView : UserControl { // Severity color bands (OPC UA severity 0-1000) private static readonly IBrush InactiveBrush = new SolidColorBrush(Color.Parse("#F0F0F0")); // light grey private static readonly IBrush LowBrush = new SolidColorBrush(Color.Parse("#DBEAFE")); // light blue (1-332) private static readonly IBrush MediumBrush = new SolidColorBrush(Color.Parse("#FEF3C7")); // light yellow (333-665) private static readonly IBrush HighBrush = new SolidColorBrush(Color.Parse("#FEE2E2")); // light red (666-899) private static readonly IBrush CriticalBrush = new SolidColorBrush(Color.Parse("#FECACA")); // red (900-1000) public AlarmsView() { InitializeComponent(); } protected override void OnLoaded(RoutedEventArgs e) { base.OnLoaded(e); var grid = this.FindControl("AlarmsGrid"); if (grid == null) return; var contextMenu = new ContextMenu(); var ackItem = new MenuItem { Header = "Acknowledge..." }; ackItem.Click += OnAcknowledgeClicked; contextMenu.Items.Add(ackItem); contextMenu.Opening += OnContextMenuOpening; grid.ContextMenu = contextMenu; } private void OnDataGridLoadingRow(object? sender, DataGridRowEventArgs e) { if (e.Row.DataContext is AlarmEventViewModel alarm) e.Row.Background = GetSeverityBrush(alarm); } private static IBrush GetSeverityBrush(AlarmEventViewModel alarm) { if (!alarm.ActiveState) return InactiveBrush; return alarm.Severity switch { >= 900 => CriticalBrush, >= 666 => HighBrush, >= 333 => MediumBrush, _ => LowBrush }; } private void OnContextMenuOpening(object? sender, CancelEventArgs e) { var grid = this.FindControl("AlarmsGrid"); if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanAcknowledge) e.Cancel = true; } private void OnAcknowledgeClicked(object? sender, RoutedEventArgs e) { if (DataContext is not AlarmsViewModel vm) return; var grid = this.FindControl("AlarmsGrid"); if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanAcknowledge) return; var parentWindow = this.FindAncestorOfType(); if (parentWindow == null) return; var ackWindow = new AckAlarmWindow(vm, alarm); ackWindow.ShowDialog(parentWindow); } }