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

163 lines
11 KiB
C#

using System.IO;
using System.Windows;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Livia.Models;
using Livia.Utility;
using Livia.Utility.DependencyInjection;
using Livia.ViewModels;
using Microsoft.Extensions.DependencyInjection;
namespace CereFlow.ViewModels;
public class CereFlowControlViewModel : ObservableRecipient, ILiviaControlViewModel, IRecipient<DataLoadedMessage>, IRecipient<PerfusionDataGridChangeParameterMessage>
{
public ImageRotationViewerControlViewModel BrainLobesImageRotationViewerControlViewModel { get; }
public ImageRotationViewerControlViewModel LimbicSystemImageRotationViewerControlViewModel { get; }
public PerfusionDataGridGroupControlViewModel PerfusionDataGridGroupViewModel { get; }
public RoiSummaryControlViewModel LeftAnteriorRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel RightAnteriorRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel LeftAttRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel RightAttRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel LeftAcbvRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel RightAcbvRoiSummaryControlViewModel { get; }
public MosaicImageGroupControlViewModel MosaicImageGroupViewModel { get; }
//TODO::temp fix I do not like this
public bool AttTabVisible { get => _attTabVisible; set => SetProperty(ref _attTabVisible, value); }
public IDataBlockLoader DataBlockLoader { get; }
public int RoiTabSelectedIndex { get => _roiTabSelectedIndex; set => SetProperty(ref _roiTabSelectedIndex, value); }
private int _roiTabSelectedIndex;
private bool _attTabVisible = true;
public CereFlowControlViewModel(IDataBlockLoader dataBlockLoader)
{
WeakReferenceMessenger.Default.RegisterAll(this);
DataBlockLoader = dataBlockLoader;
BrainLobesImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance<ImageRotationViewerControlViewModel>(ServiceProviderFactory.ServiceProvider);
BrainLobesImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("BrainLobesRotationViewerName");
BrainLobesImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\AnImage_BrainLobes\mask";
BrainLobesImageRotationViewerControlViewModel.StructLoadPath = "structure";
BrainLobesImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D;
BrainLobesImageRotationViewerControlViewModel.AtlasId = "AnImage_BrainLobes";
BrainLobesImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure";
dataBlockLoader.AddViewModel(BrainLobesImageRotationViewerControlViewModel);
LimbicSystemImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance<ImageRotationViewerControlViewModel>(ServiceProviderFactory.ServiceProvider);
LimbicSystemImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("LimbicSystemRotationViewerName");
LimbicSystemImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\LimbicSystem\mask";
LimbicSystemImageRotationViewerControlViewModel.StructLoadPath = "structure";
LimbicSystemImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D;
LimbicSystemImageRotationViewerControlViewModel.AtlasId = "LimbicSystem";
LimbicSystemImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure";
dataBlockLoader.AddViewModel(LimbicSystemImageRotationViewerControlViewModel);
PerfusionDataGridControlViewModel cerebrumCerebellumPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
cerebrumCerebellumPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_CerebrumCerebellum");
cerebrumCerebellumPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName");
PerfusionDataGridControlViewModel brainLobesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
brainLobesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_BrainLobes");
brainLobesPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("BrainLobesPerfusionDataGridName");
PerfusionDataGridControlViewModel limbicSystemPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
limbicSystemPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "LimbicSystem");
limbicSystemPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("LimbicSystemPerfusionDataGridName");
PerfusionDataGridGroupViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridGroupControlViewModel>(ServiceProviderFactory.ServiceProvider);
PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(cerebrumCerebellumPerfusionDataGridControlViewModel);
PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(brainLobesPerfusionDataGridControlViewModel);
PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(limbicSystemPerfusionDataGridControlViewModel);
dataBlockLoader.AddViewModel(PerfusionDataGridGroupViewModel);
LeftAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
LeftAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_l.json");
LeftAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf";
dataBlockLoader.AddViewModel(LeftAnteriorRoiSummaryControlViewModel);
RightAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
RightAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_r.json");
RightAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf";
dataBlockLoader.AddViewModel(RightAnteriorRoiSummaryControlViewModel);
LeftAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
LeftAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_l.json");
LeftAttRoiSummaryControlViewModel.RoiTabId = "att";
dataBlockLoader.AddViewModel(LeftAttRoiSummaryControlViewModel);
RightAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
RightAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_r.json");
RightAttRoiSummaryControlViewModel.RoiTabId = "att";
dataBlockLoader.AddViewModel(RightAttRoiSummaryControlViewModel);
LeftAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
LeftAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_l.json");
LeftAcbvRoiSummaryControlViewModel.RoiTabId = "acbv";
dataBlockLoader.AddViewModel(LeftAcbvRoiSummaryControlViewModel);
RightAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
RightAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_r.json");
RightAcbvRoiSummaryControlViewModel.RoiTabId = "acbv";
dataBlockLoader.AddViewModel(RightAcbvRoiSummaryControlViewModel);
MosaicImageGroupViewModel = ActivatorUtilities.CreateInstance<MosaicImageGroupControlViewModel>(ServiceProviderFactory.ServiceProvider);
dataBlockLoader.AddDeferredLoadingModuleViewModel(MosaicImageGroupViewModel);
dataBlockLoader.Init();
RoiSummaryControlViewModel.RoiTabIdToTabIndexDictionary = new Dictionary<string, int>
{
{ "cbf", 1 }, { "att", 2 }, { "acbv", 3 }
};
}
public List<ReportModuleExpanderViewModel> GenerateReportModuleGroups()
{
List<ReportModuleItemViewModel> atlasItems =
[
new ReportModuleItemViewModel((string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName"),
"AnImage_CerebrumCerebellum"),
new ReportModuleItemViewModel((string)Application.Current.TryFindResource("BrainLobesRotationViewerName"),
"AnImage_BrainLobes"),
new ReportModuleItemViewModel((string)Application.Current.TryFindResource("LimbicSystemRotationViewerName"),
"LimbicSystem")
];
//TODO::maybe cache it when loading data is better. No need to check colorMap
List<ReportModuleItemViewModel> colorImageItems = (from viewModel in MosaicImageGroupViewModel.MosaicImageCollection where viewModel.UseColorBar select new ReportModuleItemViewModel(viewModel.DisplayName, viewModel.DisplayName)).ToList();
List<ReportModuleExpanderViewModel> result =
[
new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleAtlas"),
"regional_perfusion", atlasItems),
new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("ReportModuleColorImage"),
"param_color_img", colorImageItems),
new ReportModuleExpanderViewModel("CBF", "cbf",
LeftAnteriorRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightAnteriorRoiSummaryControlViewModel.GenerateReportModuleList())),
new ReportModuleExpanderViewModel("ATT", "att",
LeftAttRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightAttRoiSummaryControlViewModel.GenerateReportModuleList())),
new ReportModuleExpanderViewModel("aCBV", "acbv",
LeftAcbvRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightAcbvRoiSummaryControlViewModel.GenerateReportModuleList()))
];
return result;
}
public void Receive(DataLoadedMessage message)
{
RoiTabSelectedIndex = 1;
WeakReferenceMessenger.Default.Send(new RoiTabChangedMessage(RoiTabSelectedIndex));
AttTabVisible = LeftAttRoiSummaryControlViewModel.Visible || RightAttRoiSummaryControlViewModel.Visible;
}
public void Receive(PerfusionDataGridChangeParameterMessage message)
{
if (message.Value.Item2)
RoiTabSelectedIndex = 0;
}
}