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

85 lines
3 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;
using System.Windows;
using Livia.Models.Data;
using Livia.Models;
using Microsoft.Extensions.Logging;
using CommunityToolkit.Mvvm.Messaging;
using Livia.Utility;
namespace Livia.ViewModels;
public class PerfusionParameter : ObservableObject
{
public bool IsChecked { get => _isChecked; set => SetProperty(ref _isChecked, value); }
public string Name { get => _name; init => SetProperty(ref _name, value); }
private bool _isChecked;
private readonly string _name = string.Empty;
}
public class PerfusionDataGridGroupControlViewModel : ObservableRecipient, ILiviaModuleViewModel, IRecipient<PerfusionDataGridChangeParameterMessage>
{
public ObservableCollection<PerfusionDataGridControlViewModel> PerfusionDataGridViewModelCollection { get; } = [];
public ObservableCollection<PerfusionParameter> Parameters { get; } = [];
private DataBlock? _currentDataBlock;
private readonly IDataBlockLoader _dataBlockLoader;
private readonly ILogger _logger;
public PerfusionDataGridGroupControlViewModel(IDataBlockLoader dataBlockLoader, ILogger logger)
{
_dataBlockLoader = dataBlockLoader;
_logger = logger;
WeakReferenceMessenger.Default.RegisterAll(this);
}
public async Task LoadData(DataBlock dataBlock)
{
Parameters.Clear();
AdditionalInfoJson additionalInfo = _dataBlockLoader.GetSharedData<AdditionalInfoJson>("additionalInfo");
foreach (KeyValuePair<string, List<AtlasInfo>> keyValuePair in additionalInfo.AtlasInfoListDict)
{
PerfusionParameter parameter = new()
{
Name = keyValuePair.Key,
IsChecked = keyValuePair.Key == PerfusionDataGridControlViewModel.LoadAtlasName
};
Parameters.Add(parameter);
}
Task[] loadTasks = PerfusionDataGridViewModelCollection.Select(perfusionDataGridControlViewModel => perfusionDataGridControlViewModel.LoadData(dataBlock)).ToArray();
await Task.WhenAll(loadTasks);
_currentDataBlock = dataBlock;
}
public void Init()
{
}
public void Receive(PerfusionDataGridChangeParameterMessage message)
{
_logger.LogInformation($"PerfusionDataGrid switching to {message.Value}");
if (_currentDataBlock == null)
return;
PerfusionDataGridControlViewModel.LoadAtlasName = message.Value.Item1;
foreach (PerfusionDataGridControlViewModel perfusionDataGridControlViewModel in PerfusionDataGridViewModelCollection)
{
Application.Current.Dispatcher.Invoke(() => perfusionDataGridControlViewModel.LoadData(_currentDataBlock));
}
//update radio button state
foreach (PerfusionParameter parameter in Parameters)
{
if (parameter.Name != message.Value.Item1)
continue;
parameter.IsChecked = true;
return;
}
}
}