livia-test/Livia/Models/RoiLegendManager.cs
2025-03-28 14:31:53 +08:00

71 lines
2 KiB
C#

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);
}
}
}