using System.Collections.ObjectModel; using System.Windows.Media; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using Livia.Utility; using Microsoft.Extensions.Logging; namespace Livia.Models; public class LegendItem { public string ItemFullName { get; init; } = string.Empty; public string ItemName { get; init; } = string.Empty; public Color ItemColor { get; init; } } public interface IRoiLegendManager { void Clear(); void AddItem(int tabKey, string id, string name, string fullName, Color color); } public class RoiLegendManager : ObservableRecipient, IRoiLegendManager, IRecipient<RoiTabChangedMessage> { public ObservableCollection<LegendItem> LegendItems { get; } = []; private Dictionary<int, List<LegendItem>> LegendItemsDict { get; } = new(); private readonly HashSet<string> _currentItems = []; private readonly ILogger _logger; public RoiLegendManager(ILogger logger) { _logger = logger; WeakReferenceMessenger.Default.RegisterAll(this); } public void Clear() { LegendItems.Clear(); LegendItemsDict.Clear(); _currentItems.Clear(); } public void AddItem(int tabKey, string id, string name, string fullName, Color color) { string hashKey = $"{tabKey}###{id}"; if (!_currentItems.Add(hashKey)) return; LegendItem item = new() { ItemName = LiviaUtility.ParseServerString(name), ItemFullName = LiviaUtility.ParseServerString(fullName), ItemColor = color }; LegendItemsDict.AddToCollectionWithKey(tabKey, item); } public void Receive(RoiTabChangedMessage message) { if (LegendItemsDict.TryGetValue(message.Value, out List<LegendItem>? list)) { LegendItems.Clear(); LegendItems.AddRange(list); } else { _logger.LogWarning("Unknown Roi tab index for legends: {id}", message.Value); } } }