207 lines
15 KiB
C#
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;
|
|
}
|
|
} |