73 lines
1.9 KiB
C#
73 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Text.Json;
|
|
using System.Windows.Input;
|
|
using MCCAD.Models;
|
|
using ReactiveUI;
|
|
|
|
namespace MCCAD.ViewModels;
|
|
|
|
public class DrawingViewModel : ViewModelBase, IRoutableViewModel
|
|
{
|
|
private OvalView _ov;
|
|
private PolygonView _pv;
|
|
private LineView _lv;
|
|
private Drawing _inner;
|
|
|
|
private static readonly List<IFigureDeserializer> _deserializers =
|
|
[new LineView.Deserializer(), new PolygonView.Deserializer(), new OvalView.Deserializer()];
|
|
|
|
public DrawingViewModel(IScreen hostScreen, Drawing drawing)
|
|
{
|
|
HostScreen = hostScreen;
|
|
_inner = drawing;
|
|
LoadFigures();
|
|
}
|
|
|
|
private void LoadFigures()
|
|
{
|
|
foreach (var figure in JsonSerializer.Deserialize<List<string>>(_inner.Data))
|
|
foreach (var deserializer in _deserializers)
|
|
{
|
|
if (deserializer.TryDeserialize(figure, out var view))
|
|
{
|
|
Figures.Add(view);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public OvalView Ov
|
|
{
|
|
get => _ov;
|
|
set => this.RaiseAndSetIfChanged(ref _ov, value);
|
|
}
|
|
|
|
public PolygonView Pv
|
|
{
|
|
get => _pv;
|
|
set => this.RaiseAndSetIfChanged(ref _pv, value);
|
|
}
|
|
|
|
public LineView Lv
|
|
{
|
|
get => _lv;
|
|
set => this.RaiseAndSetIfChanged(ref _lv, value);
|
|
}
|
|
|
|
public ObservableCollection<IFigureView> Figures { get; set; } = [];
|
|
public string? UrlPathSegment { get; } = Guid.NewGuid().ToString();
|
|
public IScreen HostScreen { get; }
|
|
|
|
public ICommand OnSave => ReactiveCommand.Create(() =>
|
|
{
|
|
_inner.Data = JsonSerializer.Serialize(Figures.Select(i => i.Save()));
|
|
_inner.LastChange = DateTime.Now.ToUniversalTime();
|
|
CadDBContext.Instance.SaveChanges();
|
|
});
|
|
|
|
public ICommand Back => ReactiveCommand.Create(() => { HostScreen.Router.NavigateBack.Execute(); }
|
|
);
|
|
} |