Commit a2dae66d authored by Francesco Carraro's avatar Francesco Carraro
Browse files

refactoring for using ISpectrumModel interface along all of the code

parent c8da84b1
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -127,7 +127,6 @@ namespace INAF.Apps.Uwp.SLabDataManager
                new ServiceCollection()
                /* singletons */
                .AddSingleton<ChartAnnotationsHelper>()
                .AddSingleton<ContinuumSpectraContainer>()
                .AddSingleton<FitMethodsHelper>()
                .AddSingleton<Logger>(logger)
                .AddSingleton<PermissionsHelper>()
@@ -177,7 +176,6 @@ namespace INAF.Apps.Uwp.SLabDataManager
                .AddSingleton<UserControlsViewModelFactory>()
                /* view models */
                .AddSingleton<ChartViewModel>()
                .AddSingleton<ContinuumAnalysisViewModel>()
                .AddSingleton<CustomPaletteHelper>()
                .AddTransient<LoginViewModel>()
                .AddTransient<LoginCheckViewModel>()
+0 −85
Original line number Diff line number Diff line
using INAF.Apps.Uwp.Charts;
using INAF.Apps.Uwp.SLabDataManager.Models.Spectrum;
using INAF.Libraries.Uwp.Logging;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;

namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
{
    public class ContinuumSpectraContainer : SpectraContainerBase
    {
        public ContinuumSpectraContainer(IServiceProvider serviceProvider,
                                         SpectrumChartOptionsModel spectrumChartOptions,
                                         Logger logger) : base(serviceProvider, spectrumChartOptions, logger)
        {
            init();
        }

        public override async Task addOrUpdateSpectrumAsync(SpectrumModel spectrum)
        {
            if (Spectra.Any(x => x.Key.Equals(spectrum.Key)))
            {
                /* if a spectrum of same type is already present, then replace it... */
                int index = Spectra.ToList().FindIndex(x => x.Key.Equals(spectrum.Key));
                if (index >= 0)
                    Spectra[index] = spectrum;
            }
            else
                /* ...otherwise, add it... */
                addSpectrum(spectrum);

            if (Spectra.Count == 1)
                await setBoundariesAsync();
            else
                await updateBoundariesAsync();

            spectrum.PropertyChanged += Spectrum_PropertyChanged;
        }

        protected void addSpectrum(SpectrumModel spectrum)
        {
            //spectrum.setColor();
            Spectra.Add(spectrum);

            /* enable navigation to chart page */
            raiseIsAnySpectrumLoaded();
        }

        public SpectrumModel cloneSpectrum(string srcKey, string destKey)
        {
            if (!isAnySpectrumOfType(srcKey))
                return null;

            SpectrumModel clonedSpectrum = (SpectrumModel)tryGetSpectrumOfType(srcKey).Clone();
            clonedSpectrum.setKey(destKey);
            clonedSpectrum.updateTitleForContinuum();
            return clonedSpectrum;
        }

        public override void init()
        {
            base.init();

            Spectra = new ObservableCollection<SpectrumModel>();
        }

        public bool isAnySpectrumOfType(string key)
        {
            return Spectra.Any(x => x.Key.Equals(key));
        }

        public async Task removeSpectrumOfTypeAsync(string key)
        {
            var requestedSpectrum = tryGetSpectrumOfType(key);
            Spectra.Remove(requestedSpectrum);
            await updateBoundariesAsync();
        }

        public SpectrumModel tryGetSpectrumOfType(string key)
        {
            return Spectra.FirstOrDefault(x => x.Key.Equals(key));
        }
    }
}
+0 −21
Original line number Diff line number Diff line
using INAF.Apps.Uwp.SLabDataManager.Models.Spectrum;
using System.Threading.Tasks;

namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
{
    public interface ISpectraContainer
    {
        Task addOrUpdateSpectrumAsync(SpectrumModel spectrum);

        void init();

        void raiseIsAnySpectrumLoaded();

        Task setBoundariesAsync();

        void setYAxisTitle(string title);

        Task updateBoundariesAsync();

    }
}
+307 −34
Original line number Diff line number Diff line
using INAF.Apps.Uwp.Charts;
using CommunityToolkit.Mvvm.ComponentModel;
using INAF.Apps.Uwp.Charts;
using INAF.Apps.Uwp.SLabDataManager.Helpers;
using INAF.Apps.Uwp.SLabDataManager.Models;
using INAF.Apps.Uwp.SLabDataManager.ViewModels.UserControlViewModels;
using INAF.Apps.Uwp.SLabDataManager.Models.Spectrum;
using INAF.Libraries.NetStandard.ScienceModels.Extensions;
using INAF.Libraries.NetStandard.ScienceModels.Spectra;
using INAF.Libraries.Uwp.Logging;
using Microsoft.Extensions.DependencyInjection;
using System;
@@ -8,17 +12,25 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using static INAF.Libraries.NetStandard.ScienceModels.Enums.Enums;
using static INAF.Libraries.NetStandard.SLabCommonModels.Enums.Enums;
using SpectrumModel = INAF.Apps.Uwp.SLabDataManager.Models.Spectrum.SpectrumModel;

namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
{
    public class SpectraContainer : SpectraContainerBase
    public class SpectraContainer : ObservableObject
    {
        private readonly IServiceProvider serviceProvider;
        private readonly SpectrumChartOptionsModel spectrumChartOptions;
        private readonly Logger logger;

        public SpectraContainer(IServiceProvider serviceProvider,
                                SpectrumChartOptionsModel spectrumChartOptions,
                                Logger logger) : base(serviceProvider, spectrumChartOptions, logger)
                                Logger logger)
        {
            this.serviceProvider = serviceProvider;
            this.spectrumChartOptions = spectrumChartOptions;
            this.logger = logger;

            init();

            spectrumChartOptions.PropertyChanged += SpectrumChartOptions_PropertyChanged;
@@ -40,12 +52,118 @@ namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
            }
        }

        private void Spectrum_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            UpdateUIHelper.UpdateUIAsync(() =>
            {
                IsAnySpectrumUpdated = true;
            });
        }

        protected ObservableCollection<ISpectrumModel> spectra;
        public ObservableCollection<ISpectrumModel> Spectra
        {
            get { return spectra; }
            protected set { SetProperty(ref spectra, value); }
        }

        public SelectedRefBand SelectedRefBand { get; protected set; }

        public SpectrumType SelectedSpectrumType { get; protected set; }

        #region properties
        protected bool isAnySummaryUpdated;
        public bool IsAnySummaryUpdated
        {
            get { return isAnySummaryUpdated; }
            set { SetProperty(ref isAnySummaryUpdated, value); }
        }

        protected bool isAnySpectrumLoaded;
        public bool IsAnySpectrumLoaded
        {
            get { return isAnySpectrumLoaded; }
            set { SetProperty(ref isAnySpectrumLoaded, value); }
        }

        private bool isAnySpectrumLoadedOrRemoved;
        public bool IsAnySpectrumLoadedOrRemoved
        {
            get { return isAnySpectrumLoadedOrRemoved; }
            set { SetProperty(ref isAnySpectrumLoadedOrRemoved, value); }
        }

        protected bool isAnySpectrumRemoved;
        public bool IsAnySpectrumRemoved
        {
            get { return isAnySpectrumRemoved; }
            set { SetProperty(ref isAnySpectrumRemoved, value); }
        }

        protected bool isAnySpectrumUpdated;
        public bool IsAnySpectrumUpdated
        {
            get { return isAnySpectrumUpdated; }
            set
            {
                if (SetProperty(ref isAnySpectrumUpdated, value))
                    isAnySpectrumUpdated = false; // reset value to make it working @ the next spectrum loading
            }
        }

        private bool isWorkInProgress;
        public bool IsWorkInProgress
        {
            get { return isWorkInProgress; }
            set { SetProperty(ref isWorkInProgress, value); }
        }

        public string YAxisTitle { get; protected set; }

        protected ObservableCollection<SpectrumSummaryModel> summaries;
        public ObservableCollection<SpectrumSummaryModel> Summaries
        {
            get { return summaries; }
            protected set { SetProperty(ref summaries, value); }
        }

        #region spectrums min/max
        protected AxisBoundariesModel xAxisBoundaries;
        public AxisBoundariesModel XAxisBoundaries
        {
            get { return xAxisBoundaries; }
            protected set { SetProperty(ref xAxisBoundaries, value); }
        }

        protected AxisBoundariesModel yAxisBoundaries;
        public AxisBoundariesModel YAxisBoundaries
        {
            get { return yAxisBoundaries; }
            protected set { SetProperty(ref yAxisBoundaries, value); }
        }
        #endregion

        #region x axis major step
        protected double selectedXAxisMajorStep;
        public double SelectedXAxisMajorStep
        {
            get { return selectedXAxisMajorStep; }
            protected set { SetProperty(ref selectedXAxisMajorStep, value); }
        }

        public List<double> XAxisMajorStepValues { get; protected set; }

        protected double selectedYAxisMajorStep;
        public double SelectedYAxisMajorStep
        {
            get { return selectedYAxisMajorStep; }
            protected set { SetProperty(ref selectedYAxisMajorStep, value); }
        }
        #endregion
        #endregion

        #region spectra methods
        public override async Task addOrUpdateSpectrumAsync(SpectrumModel spectrum)
        public async Task addOrUpdateSpectrumAsync(ISpectrumModel spectrum)
        {
            if (isAnySummaryOfType(spectrum.Type))
                tryGetSummaryOfType(spectrum.Type).create(spectrum);
@@ -73,26 +191,6 @@ namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
            spectrum.PropertyChanged += Spectrum_PropertyChanged;
        }

        public SpectrumModel getClonedEmptySpectrum(SpectrumType srcType, SpectrumType destType)
        {
            SpectrumModel clonedSpectrum = getClonedSpectrum(srcType, destType);
            clonedSpectrum.clear();

            return clonedSpectrum;
        }

        public SpectrumModel getClonedSpectrum(SpectrumType srcType, SpectrumType destType)
        {
            if (!isAnySpectrumOfType(srcType))
                return null;

            SpectrumModel clonedSpectrum = (SpectrumModel)tryGetSpectrumOfType(srcType).Clone();
            clonedSpectrum.setType(destType);
            clonedSpectrum.setColor();
            clonedSpectrum.updateTitle();
            return clonedSpectrum;
        }

        public int getSpectraNum()
        {
            return spectra.Count;
@@ -109,12 +207,12 @@ namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
            return await tryRemoveSpectrumOfTypeAsync(SpectrumType.Aligned);
        }

        public IEnumerable<SpectrumModel> tryGetSpectraOfTypeOtherThan(IEnumerable<SpectrumType> spectrumTypes)
        public IEnumerable<ISpectrumModel> tryGetSpectraOfTypeOtherThan(IEnumerable<SpectrumType> spectrumTypes)
        {
            return Spectra.Where(x => !spectrumTypes.Contains(x.Type));
        }

        public SpectrumModel tryGetSpectrumOfType(SpectrumType spectrumType)
        public ISpectrumModel tryGetSpectrumOfType(SpectrumType spectrumType)
        {
            return Spectra.FirstOrDefault(x => x.Type == spectrumType);
        }
@@ -164,17 +262,23 @@ namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
            Spectra.Clear();
        }

        public override void init()
        public void init()
        {
            base.init();
            IsAnySpectrumLoaded = false;
            IsAnySpectrumLoadedOrRemoved = false;
            IsAnySpectrumRemoved = false;

            XAxisMajorStepValues = new List<double>(2);
            XAxisMajorStepValues.Add(Constants.Constants.X_AXIS_MAJOR_STEP_0DOT1);
            XAxisMajorStepValues.Add(Constants.Constants.X_AXIS_MAJOR_STEP_100);

            SelectedRefBand = serviceProvider.GetRequiredService<SelectedRefBand>();

            Spectra = new ObservableCollection<SpectrumModel>();
            Spectra = new ObservableCollection<ISpectrumModel>();
            Summaries = new ObservableCollection<SpectrumSummaryModel>();
        }

        protected void addSpectrum(SpectrumModel spectrum)
        protected void addSpectrum(ISpectrumModel spectrum)
        {
            Spectra.Add(spectrum);

@@ -182,6 +286,131 @@ namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
            raiseIsAnySpectrumLoaded();
        }

        #region clone
        public ISpectrumModel getClonedEmptySpectrum(SpectrumType srcType, SpectrumType destType)
        {
            ISpectrumModel clonedSpectrum = getClonedSpectrum(srcType, destType);
            clonedSpectrum.init();

            return clonedSpectrum;
        }

        public ISpectrumModel getClonedSpectrum(SpectrumType srcType, SpectrumType destType)
        {
            if (!isAnySpectrumOfType(srcType))
                return null;

            var clonedSpectrum = (ISpectrumModel)tryGetSpectrumOfType(srcType).Clone();
            clonedSpectrum.setType(destType);
            clonedSpectrum.setColor();
            clonedSpectrum.updateTitle();
            return clonedSpectrum;
        }
        #endregion

        #region boundaries & axis
        public async Task setBoundariesAsync()
        {
            (double xMin, double xMax, double yMin, double yMax) result = await getSpectraAxesBoundariesAsync();

            XAxisBoundaries = new AxisBoundariesModel("x", result.xMin, result.xMax, spectra[0].Elements[0].MeasureUnit);
            YAxisBoundaries = new AxisBoundariesModel("y", result.yMin, result.yMax);
        }

        public async Task<(double xMin, double xMax, double yMin, double yMax)> getSpectraAxesBoundariesAsync()
        {
            List<Task> tasks = new List<Task>();

            double xMin = 0d;
            double xMax = 0d;
            double yMin = 0d;
            double yMax = 0d;
            tasks.Add(Task.Run(() =>
            {
                List<double> xvalues = new List<double>();
                int spectraNum = Spectra.Count;
                for (int i = 0; i < spectraNum; i++)
                {
                    if (spectra[i].IsVisible)
                        xvalues.AddRange(spectra[i].Elements.Select(x => x.X));
                }
                //foreach (var spectrum in Spectra)
                //{
                //    if (spectrum.IsVisible)
                //        xvalues.AddRange(spectrum.Elements.Select(x => x.X));
                //}

                if (xvalues.Count > 0)
                {
                    (double xMin, double xMax) xresult = xvalues.GetBoundaries();
                    xMin = xresult.xMin;
                    xMax = xresult.xMax;
                }
            }));
            tasks.Add(Task.Run(() =>
            {
                List<double> yvalues = new List<double>();
                int spectraNum = Spectra.Count;
                for (int i = 0; i < spectraNum; i++)
                {
                    if (spectra[i].IsVisible)
                        yvalues.AddRange(spectra[i].Elements.Select(x => x.Y));
                }
                //foreach (var spectrum in Spectra)
                //{
                //    if (spectrum.IsVisible)
                //        yvalues.AddRange(spectrum.Elements.Select(x => x.Y));
                //}
                //(double yMin, double yMax) yresult = yvalues.GetBoundaries();
                //yMin = yresult.yMin;
                //yMax = yresult.yMax;
                if (yvalues.Count > 0)
                {
                    yMin = yvalues.Min() * 0.9;
                    yMax = yvalues.Max() * 1.1;
                }
            }));

            await Task.WhenAll(tasks);

            System.Diagnostics.Debug.WriteLine($"x: [{xMin},{xMax}], y: [{yMin},{yMax}]");

            return (xMin, xMax, yMin, yMax);
        }

        public void setYAxisTitle(string title)
        {
            YAxisTitle = title;
        }

        private void switchXAxisMeasureUnit(WavelengthMeasureUnit wavelengthMeasureUnit)
        {
            try
            {
                Spectra.All(x => { x.switchToMeasureUnit(wavelengthMeasureUnit); return true; });
                XAxisBoundaries.switchToMeasureUnit(wavelengthMeasureUnit);
            }
            catch (Exception ex)
            {
                logger.Write<SpectraContainer>($"{nameof(switchXAxisMeasureUnit)} - ex: {ex.Message}", Serilog.Events.LogEventLevel.Error);
            }
        }

        public async Task updateBoundariesAsync()
        {
            (double xMin, double xMax, double yMin, double yMax) result = await getSpectraAxesBoundariesAsync();

            XAxisBoundaries.updateAxisBoundaries(result.xMin, result.xMax, updateRealValues: true);
            YAxisBoundaries.updateAxisBoundaries(result.yMin, result.yMax, updateRealValues: true);
        }

        public void updateBoundaries(double xMin, double xMax, double yMin, double yMax)
        {
            XAxisBoundaries.updateAxisBoundaries(xMin, xMax);
            YAxisBoundaries.updateAxisBoundaries(yMin, yMax);
        }
        #endregion

        #region summaries
        public void addOrUpdateSpectrumSummary(SpectrumSummaryModel spectrumSummary)
        {
@@ -251,10 +480,54 @@ namespace INAF.Apps.Uwp.SLabDataManager.Charts.Containers
        }
        #endregion

        #region zoom
        public void moveBoundariesHorizontally(double value)
        {
            XAxisBoundaries.changeMinValue(value);
            XAxisBoundaries.changeMaxValue(value);
        }

        public void moveBoundariesVertically(double value)
        {
            YAxisBoundaries.changeMinValue(value);
            YAxisBoundaries.changeMaxValue(value);
        }
        #endregion

        #region raise methods
        public void raiseIsAnySpectrumLoaded()
        {
            IsAnySpectrumLoaded = true;
            isAnySpectrumLoaded = false;// trick to enable for the next added spectrum

            raiseIsAnySpectrumLoadedOrRemoved();
        }

        public void raiseIsAnySpectrumLoadedOrRemoved()
        {
            IsAnySpectrumLoadedOrRemoved = true;
            isAnySpectrumLoadedOrRemoved = false;
        }

        public void raiseIsAnySpectrumRemoved()
        {
            IsAnySpectrumRemoved = true;
            isAnySpectrumRemoved = false;// trick to enable for the next added spectrum

            raiseIsAnySpectrumLoadedOrRemoved();
        }

        public void raiseIsAnySpectrumUpdated()
        {
            IsAnySpectrumUpdated = true;
            isAnySpectrumUpdated = false;// trick to enable for the next added spectrum
        }
        #endregion

        #region retrieve aligned spectrum (by smoothing type)
        public SpectrumModel getAlignedSpectrum()
        public ISpectrumModel getAlignedSpectrum()
        {
            SpectrumModel spectrum = null;
            ISpectrumModel spectrum = null;

            /* look for the right aligned type by descending order of importance */
            if (isAnySpectrumOfType(SpectrumType.AlignedSmoothed))
+0 −300

File deleted.

Preview size limit exceeded, changes collapsed.

Loading