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, IRecipient { 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(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(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(ServiceProviderFactory.ServiceProvider); cerebrumCerebellumPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_CerebrumCerebellum"); cerebrumCerebellumPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("CerebrumCerebellumPerfusionDataGridName"); PerfusionDataGridControlViewModel brainLobesPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); brainLobesPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "AnImage_BrainLobes"); brainLobesPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("BrainLobesPerfusionDataGridName"); PerfusionDataGridControlViewModel limbicSystemPerfusionDataGridControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); limbicSystemPerfusionDataGridControlViewModel.LoadPath = Path.Combine("atlas", "LimbicSystem"); limbicSystemPerfusionDataGridControlViewModel.GridTabName = (string)Application.Current.TryFindResource("LimbicSystemPerfusionDataGridName"); PerfusionDataGridGroupViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(cerebrumCerebellumPerfusionDataGridControlViewModel); PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(brainLobesPerfusionDataGridControlViewModel); PerfusionDataGridGroupViewModel.PerfusionDataGridViewModelCollection.Add(limbicSystemPerfusionDataGridControlViewModel); dataBlockLoader.AddViewModel(PerfusionDataGridGroupViewModel); LeftAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); LeftAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_l.json"); LeftAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf"; dataBlockLoader.AddViewModel(LeftAnteriorRoiSummaryControlViewModel); RightAnteriorRoiSummaryControlViewModel = ActivatorUtilities.CreateInstance(ServiceProviderFactory.ServiceProvider); RightAnteriorRoiSummaryControlViewModel.LoadPath = Path.Combine("roi", "cbf_location_r.json"); RightAnteriorRoiSummaryControlViewModel.RoiTabId = "cbf"; dataBlockLoader.AddViewModel(RightAnteriorRoiSummaryControlViewModel); 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 }, { "att", 2 }, { "acbv", 3 } }; } public List GenerateReportModuleGroups() { List 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 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", 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; } }