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, IRecipient { 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(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(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(ServiceProviderFactory.ServiceProvider); cerebrumCerebellumPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_CerebrumCerebellum"); cerebrumCerebellumPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName"); PerfusionDataGridControlViewModel arterialTerritoriesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); arterialTerritoriesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_ArterialTerritories"); arterialTerritoriesPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("ArterialTerritoriesPerfusionDataGridName"); PerfusionDataGridControlViewModel aspectsPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); aspectsPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_ASPECTS"); aspectsPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("AspectsPerfusionDataGridName"); PerfusionDataGridGroupViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(cerebrumCerebellumPerfusionDataGridControlViewModel); PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(arterialTerritoriesPerfusionDataGridControlViewModel); PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(aspectsPerfusionDataGridControlViewModel); dataBlockLoader.AddViewModel(PerfusionDataGridGroupViewModel); LeftAStrokeRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); LeftAStrokeRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_l.json"); LeftAStrokeRoiSummaryControlViewModel.RoiTabId = "cbf"; dataBlockLoader.AddViewModel(LeftAStrokeRoiSummaryControlViewModel); RightAStrokeRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(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(ServiceProviderFactory.ServiceProvider); LeftRestrictedDiffusionRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "restricted_diffusion_location_l.json"); LeftRestrictedDiffusionRoiSummaryControlViewModel.RoiTabId = "restricted_diffusion"; dataBlockLoader.AddViewModel(LeftRestrictedDiffusionRoiSummaryControlViewModel); RightRestrictedDiffusionRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); RightRestrictedDiffusionRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "restricted_diffusion_location_r.json"); RightRestrictedDiffusionRoiSummaryControlViewModel.RoiTabId = "restricted_diffusion"; dataBlockLoader.AddViewModel(RightRestrictedDiffusionRoiSummaryControlViewModel); LeftAnteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); LeftAnteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "anterior_aspects_l.json"); LeftAnteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "anterior"; dataBlockLoader.AddViewModel(LeftAnteriorAspectsScoreRoiSummaryControlViewModel); RightAnteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); RightAnteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "anterior_aspects_r.json"); RightAnteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "anterior"; dataBlockLoader.AddViewModel(RightAnteriorAspectsScoreRoiSummaryControlViewModel); PosteriorAspectsScoreRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); PosteriorAspectsScoreRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "posterior_aspects.json"); PosteriorAspectsScoreRoiSummaryControlViewModel.IsTwoSided = true; PosteriorAspectsScoreRoiSummaryControlViewModel.RoiTabId = "posterior"; dataBlockLoader.AddViewModel(PosteriorAspectsScoreRoiSummaryControlViewModel); LeftAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); LeftAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_l.json"); LeftAttRoiSummaryControlViewModel.RoiTabId = "att"; dataBlockLoader.AddViewModel(LeftAttRoiSummaryControlViewModel); RightAttRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); RightAttRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "att_location_r.json"); RightAttRoiSummaryControlViewModel.RoiTabId = "att"; dataBlockLoader.AddViewModel(RightAttRoiSummaryControlViewModel); LeftAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); LeftAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_l.json"); LeftAcbvRoiSummaryControlViewModel.RoiTabId = "acbv"; dataBlockLoader.AddViewModel(LeftAcbvRoiSummaryControlViewModel); RightAcbvRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); RightAcbvRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "acbv_location_r.json"); RightAcbvRoiSummaryControlViewModel.RoiTabId = "acbv"; dataBlockLoader.AddViewModel(RightAcbvRoiSummaryControlViewModel); MosaicImageGroupViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); dataBlockLoader.AddDeferredLoadingModuleViewModel(MosaicImageGroupViewModel); dataBlockLoader.Init(); RoiSummaryControlViewModel.RoiTabIdToTabIndexDictionary = new Dictionary { { "cbf", 1 }, { "restricted_diffusion", 2 }, { "att", 3 }, { "acbv", 4 }, {"anterior", 5}, {"posterior", 6} }; } public List GenerateReportModuleGroups() { List 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 colorImageItems = (from viewModel in MosaicImageGroupViewModel.MosaicImageCollection where viewModel.UseColorBar select new ReportModuleItemViewModel(viewModel.DisplayName, viewModel.DisplayName)).ToList(); List 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; } }