Files
MCCAD/MCCAD/ViewModels/DrawingViewModel.cs
T
2026-04-12 22:13:00 +03:00

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(); }
);
}