Files
OxyPlot/Source/Examples/WPF/ExampleBrowser/MainWindowViewModel.cs
2023-09-02 09:24:59 +02:00

166 lines
5.1 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="MainWindowViewModel.cs" company="OxyPlot">
// Copyright (c) 2014 OxyPlot contributors
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
namespace ExampleBrowser
{
using ExampleLibrary;
using OxyPlot;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;
public class MainWindowViewModel : INotifyPropertyChanged
{
private bool _CanTranspose;
private bool _CanReverse;
private string _Code;
private Renderer _Renderer;
private PlotModel _PlotModel;
private bool _Transposed;
private bool _Reversed;
private IEnumerable<ExampleInfo> examples;
private ExampleInfo selectedExample;
public MainWindowViewModel()
{
this.Examples = ExampleLibrary.Examples.GetList();
this.ExamplesView = CollectionViewSource.GetDefaultView(this.Examples.OrderBy(e => e.Category));
this.ExamplesView.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
}
public event PropertyChangedEventHandler PropertyChanged;
public PlotModel ActiveModel => this.CanvasModel ?? this.SkiaModel;
public bool CanTranspose
{
get => this._CanTranspose;
private set
{
this._CanTranspose = value;
this.RaisePropertyChanged(nameof(this.CanTranspose));
}
}
public bool CanReverse
{
get => this._CanReverse;
private set
{
this._CanReverse = value;
this.RaisePropertyChanged(nameof(this.CanReverse));
}
}
public PlotModel CanvasModel => this.Renderer == Renderer.Canvas ? this._PlotModel : null;
public string Code
{
get => this._Code;
set
{
this._Code = value;
this.RaisePropertyChanged(nameof(this.Code));
}
}
public IEnumerable<ExampleInfo> Examples
{
get => this.examples;
set
{
this.examples = value;
this.RaisePropertyChanged(nameof(this.Examples));
}
}
public ICollectionView ExamplesView { get; set; }
public Renderer Renderer
{
get => this._Renderer;
set
{
this._Renderer = value;
this.CoerceRenderer();
this.RaisePropertyChanged(nameof(this.Renderer));
}
}
private void CoerceRenderer()
{
((IPlotModel)this._PlotModel)?.AttachPlotView(null);
this.RaisePropertyChanged(nameof(this.SkiaModel));
this.RaisePropertyChanged(nameof(this.CanvasXamlModel));
this.RaisePropertyChanged(nameof(this.CanvasModel));
}
public IEnumerable<Renderer> Renderers => Enum.GetValues(typeof(Renderer)).Cast<Renderer>();
public ExampleInfo SelectedExample
{
get => this.selectedExample;
set
{
this.selectedExample = value;
this.CoerceSelectedExample();
this.RaisePropertyChanged(nameof(this.SelectedExample));
}
}
public PlotModel SkiaModel => this.Renderer == Renderer.SkiaSharp ? this._PlotModel : null;
public PlotModel CanvasXamlModel => this.Renderer == Renderer.Canvas_XAML ? this._PlotModel : null;
public bool Transposed
{
get => this._Transposed;
set
{
this._Transposed = value;
this.UpdatePlotModel();
this.RaisePropertyChanged(nameof(this.Transposed));
}
}
public bool Reversed
{
get => this._Reversed;
set
{
this._Reversed = value;
this.UpdatePlotModel();
this.RaisePropertyChanged(nameof(this.Reversed));
}
}
protected void RaisePropertyChanged(string property)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
private void CoerceSelectedExample()
{
this.CanTranspose = this.SelectedExample?.IsTransposable == true;
this.CanReverse = this.SelectedExample?.IsReversible == true;
this.UpdatePlotModel();
}
private void UpdatePlotModel()
{
var flags = ExampleInfo.PrepareFlags(
this.CanTranspose && this.Transposed,
this.CanReverse && this.Reversed);
this._PlotModel = this.SelectedExample?.GetModel(flags);
this.Code = this.SelectedExample?.GetCode(flags);
this.CoerceRenderer();
}
}
}