using System; using System.Collections.ObjectModel; using Life.Automaton; using Life.Misc; namespace Life.ViewModel { public class FieldViewModel : BaseViewModel { private int _width; private int _height; private IField _field; private int _size; private int _separation; private IDisposable _fieldObserverDisposal; public ObservableCollection Cells { get; set; } = new ObservableCollection(); public int Width { get => _width; set { _width = value; OnPropertyChanged(nameof(Width)); } } public int Height { get => _height; set { _height = value; OnPropertyChanged(nameof(Height)); } } public IField Field { get => _field; set { _fieldObserverDisposal?.Dispose(); _fieldObserverDisposal = value.Subscribe(new DelegateSubscriber { Action = field => Sync() }); _field = value; ResetFields(); } } public int Size { get => _size; set { _size = value; OnPropertyChanged(nameof(Size)); RecalculateSize(); } } public int Separation { get => _separation; set { _separation = value; OnPropertyChanged(nameof(Separation)); RecalculateSize(); } } private void ResetFields() { Cells.Clear(); for (int i = 0; i < Field.Size.Width; i++) for (int j = 0; j < Field.Size.Height; j++) Cells.Add(CreateCellViewModel(i, j)); Sync(); RecalculateSize(); } private void RecalculateSize() { if (Field == null) return; foreach (var cell in Cells) { cell.Left = cell.Position.X * (Separation + Size); cell.Top = cell.Position.Y * (Separation + Size); } Width = Field.Size.Width * Size + (Field.Size.Width - 1) * Separation; Height = Field.Size.Height * Size + (Field.Size.Height - 1) * Separation; } private CellViewModel CreateCellViewModel(int x, int y) { return new CellViewModel(x, y); } public void Sync() { foreach (var cell in Cells) { cell.IsAlive = Field[cell.Position.X, cell.Position.Y].IsAlive; } } } }