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

207 lines
15 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 Astroke.ViewModels;
public class AStrokeControlViewModel : ObservableRecipient, ILiviaControlViewModel, IRecipient<DataLoadedMessage>, IRecipient<PerfusionDataGridChangeParameterMessage>
{
public ImageRotationViewerControlViewModel ArterialTerritoriesImageRotationViewerControlViewModel { get; }
public ImageRotationViewerControlViewModel AspectsImageRotationViewerControlViewModel { get; }
public PerfusionDataGridGroupControlViewModel PerfusionDataGridGroupViewModel { get; }
public AStrokeRoiSummaryControlViewModel LeftAStrokeRoiSummaryControlViewModel { get; }
public AStrokeRoiSummaryControlViewModel RightAStrokeRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel LeftRestrictedDiffusionRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel RightRestrictedDiffusionRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel LeftAttRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel RightAttRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel LeftAcbvRoiSummaryControlViewModel { get; }
public RoiSummaryControlViewModel RightAcbvRoiSummaryControlViewModel { get; }
public AspectsScoreRoiSummaryControlViewModel LeftAnteriorAspectsScoreRoiSummaryControlViewModel { get; }
public AspectsScoreRoiSummaryControlViewModel RightAnteriorAspectsScoreRoiSummaryControlViewModel { get; }
public AspectsScoreRoiSummaryControlViewModel PosteriorAspectsScoreRoiSummaryControlViewModel { 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 AStrokeControlViewModel(IDataBlockLoader dataBlockLoader)
{
WeakReferenceMessenger.Default.RegisterAll(this);
DataBlockLoader = dataBlockLoader;
ArterialTerritoriesImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance<ImageRotationViewerControlViewModel>(ServiceProviderFactory.ServiceProvider);
ArterialTerritoriesImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("ArterialTerritoriesRotationViewerName");
ArterialTerritoriesImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\AnImage_ArterialTerritories\mask";
ArterialTerritoriesImageRotationViewerControlViewModel.StructLoadPath = "structure";
ArterialTerritoriesImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D;
ArterialTerritoriesImageRotationViewerControlViewModel.AtlasId = "AnImage_ArterialTerritories";
ArterialTerritoriesImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure";
dataBlockLoader.AddViewModel(ArterialTerritoriesImageRotationViewerControlViewModel);
AspectsImageRotationViewerControlViewModel = ActivatorUtilities.CreateInstance<ImageRotationViewerControlViewModel>(ServiceProviderFactory.ServiceProvider);
AspectsImageRotationViewerControlViewModel.DisplayName = (string)Application.Current.TryFindResource("AspectsRotationViewerName");
AspectsImageRotationViewerControlViewModel.AtlasMaskLoadPath = @"atlas\AnImage_ASPECTS\mask";
AspectsImageRotationViewerControlViewModel.StructLoadPath = "structure";
AspectsImageRotationViewerControlViewModel.StructDataType = ImageRotationViewerDataType.Dicom2D;
AspectsImageRotationViewerControlViewModel.AtlasId = "AnImage_ASPECTS";
AspectsImageRotationViewerControlViewModel.ImageIndexSyncKey = "structure";
dataBlockLoader.AddViewModel(AspectsImageRotationViewerControlViewModel);
PerfusionDataGridControlViewModel cerebrumCerebellumPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
cerebrumCerebellumPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_CerebrumCerebellum");
cerebrumCerebellumPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName");
PerfusionDataGridControlViewModel arterialTerritoriesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
arterialTerritoriesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_ArterialTerritories");
arterialTerritoriesPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("ArterialTerritoriesPerfusionDataGridName");
PerfusionDataGridControlViewModel aspectsPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridControlViewModel>(ServiceProviderFactory.ServiceProvider);
aspectsPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_ASPECTS");
aspectsPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("AspectsPerfusionDataGridName");
PerfusionDataGridGroupViewModel = ActivatorUtilities.CreateInstance<PerfusionDataGridGroupControlViewModel>(ServiceProviderFactory.ServiceProvider);
PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(cerebrumCerebellumPerfusionDataGridControlViewModel);
PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(arterialTerritoriesPerfusionDataGridControlViewModel);
PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(aspectsPerfusionDataGridControlViewModel);
dataBlockLoader.AddViewModel(PerfusionDataGridGroupViewModel);
LeftAStrokeRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<AStrokeRoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
LeftAStrokeRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_l.json");
LeftAStrokeRoiSummaryControlViewModel.RoiTabId = "cbf";
dataBlockLoader.AddViewModel(LeftAStrokeRoiSummaryControlViewModel);
RightAStrokeRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<AStrokeRoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
RightAStrokeRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_r.json");
RightAStrokeRoiSummaryControlViewModel.RoiTabId = "cbf";
dataBlockLoader.AddViewModel(RightAStrokeRoiSummaryControlViewModel);
//This is useless but prevents ReSharper form complaining. This function may be needed in the future.
RoiExpanderGroupControlViewModel.DefaultDeselectRoiSet.Add("");
LeftRestrictedDiffusionRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
LeftRestrictedDiffusionRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "restricted_diffusion_location_l.json");
LeftRestrictedDiffusionRoiSummaryControlViewModel.RoiTabId = "restricted_diffusion";
dataBlockLoader.AddViewModel(LeftRestrictedDiffusionRoiSummaryControlViewModel);
RightRestrictedDiffusionRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<RoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
RightRestrictedDiffusionRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "restricted_diffusion_location_r.json");
RightRestrictedDiffusionRoiSummaryControlViewModel.RoiTabId = "restricted_diffusion";
dataBlockLoader.AddViewModel(RightRestrictedDiffusionRoiSummaryControlViewModel);
LeftAnteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<AspectsScoreRoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
LeftAnteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "anterior_aspects_l.json");
LeftAnteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "anterior";
dataBlockLoader.AddViewModel(LeftAnteriorAspectsScoreRoiSummaryControlViewModel);
RightAnteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<AspectsScoreRoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
RightAnteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "anterior_aspects_r.json");
RightAnteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "anterior";
dataBlockLoader.AddViewModel(RightAnteriorAspectsScoreRoiSummaryControlViewModel);
PosteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance<AspectsScoreRoiSummaryControlViewModel>(ServiceProviderFactory.ServiceProvider);
PosteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "posterior_aspects.json");
PosteriorAspectsScoreRoiSummaryControlViewModel.IsTwoSided = true;
PosteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "posterior";
dataBlockLoader.AddViewModel(PosteriorAspectsScoreRoiSummaryControlViewModel);
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 }, { "restricted_diffusion", 2 }, { "att", 3 }, { "acbv", 4 }, {"anterior", 5}, {"posterior", 6}
};
}
public List<ReportModuleExpanderViewModel> GenerateReportModuleGroups()
{
List<ReportModuleItemViewModel> atlasItems =
[
new ReportModuleItemViewModel(
(string)Application.Current.TryFindResource("ArterialTerritoriesRotationViewerName"),
"AnImage_ArterialTerritories"),
new ReportModuleItemViewModel((string)Application.Current.TryFindResource("AspectsRotationViewerName"),
"AnImage_ASPECTS")
];
//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",
LeftAStrokeRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightAStrokeRoiSummaryControlViewModel.GenerateReportModuleList())),
new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("RoiTabHeader2"),
"restricted_diffusion",
LeftRestrictedDiffusionRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightRestrictedDiffusionRoiSummaryControlViewModel.GenerateReportModuleList())),
new ReportModuleExpanderViewModel("ATT", "att",
LeftAttRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightAttRoiSummaryControlViewModel.GenerateReportModuleList())),
new ReportModuleExpanderViewModel("aCBV", "acbv",
LeftAcbvRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightAcbvRoiSummaryControlViewModel.GenerateReportModuleList())),
new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("RoiTabHeader5"),
"anterior_aspects",
LeftAnteriorAspectsScoreRoiSummaryControlViewModel.GenerateReportModuleList()
.Concat(RightAnteriorAspectsScoreRoiSummaryControlViewModel.GenerateReportModuleList())),
new ReportModuleExpanderViewModel((string)Application.Current.TryFindResource("RoiTabHeader6"),
"posterior_aspects", PosteriorAspectsScoreRoiSummaryControlViewModel.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;
}
}