Переглянути джерело

Added Viewport, Undo and Selection ViewModels

flabbet 4 роки тому
батько
коміт
88c7d35938

+ 1 - 1
PixiEditor/Models/Controllers/BitmapOperationsUtility.cs

@@ -40,7 +40,7 @@ namespace PixiEditor.Models.Controllers
                 layers[i].SetPixels(changes);
             }
 
-            UndoManager.AddUndoChange(new Change("UndoChanges", old, newChange, "Deleted pixels"));
+            UndoManager.AddUndoChange(new Change("UndoSubViewModel.UndoChanges", old, newChange, "Deleted pixels"));
         }
 
         /// <summary>

+ 1 - 1
PixiEditor/Models/Tools/ReadonlyTool.cs

@@ -4,6 +4,6 @@ namespace PixiEditor.Models.Tools
 {
     public abstract class ReadonlyTool : Tool
     {
-        public abstract void Use(Coordinates[] pixels);
+        public virtual void Use(Coordinates[] pixels) { }
     }
 }

+ 3 - 3
PixiEditor/Models/Tools/Tools/MoveTool.cs

@@ -86,9 +86,9 @@ namespace PixiEditor.Models.Tools.Tools
             if (_lastStartMousePos != start) //I am aware that this could be moved to OnMouseDown, but it is executed before Use, so I didn't want to complicate for now
             {
                 ResetSelectionValues(start);
-                if (ViewModelMain.Current.ActiveSelection != null && ViewModelMain.Current.ActiveSelection.SelectedPoints.Count > 0) //Move offset if no selection
+                if (ViewModelMain.Current.SelectionSubViewModel.ActiveSelection != null && ViewModelMain.Current.SelectionSubViewModel.ActiveSelection.SelectedPoints.Count > 0) //Move offset if no selection
                 {
-                    _currentSelection = ViewModelMain.Current.ActiveSelection.SelectedPoints.ToArray();
+                    _currentSelection = ViewModelMain.Current.SelectionSubViewModel.ActiveSelection.SelectedPoints.ToArray();
                 }
                 else
                 {
@@ -153,7 +153,7 @@ namespace PixiEditor.Models.Tools.Tools
 
             _currentSelection = TranslateSelection(end, out Coordinates[] previousSelection);
             if (_updateViewModelSelection)
-                ViewModelMain.Current.ActiveSelection.SetSelection(_currentSelection, SelectionType.New);
+                ViewModelMain.Current.SelectionSubViewModel.ActiveSelection.SetSelection(_currentSelection, SelectionType.New);
             ClearSelectedPixels(layer, previousSelection);
 
 

+ 1 - 1
PixiEditor/Models/Tools/Tools/MoveViewportTool.cs

@@ -30,7 +30,7 @@ namespace PixiEditor.Models.Tools.Tools
             if (e.LeftButton == MouseButtonState.Pressed || e.MiddleButton == MouseButtonState.Pressed)
             {
                 var point = MousePositionConverter.GetCursorPosition();
-                ViewModelMain.Current.ViewportPosition = new System.Windows.Point(point.X - _clickPoint.X, 
+                ViewModelMain.Current.ViewportSubViewModel.ViewportPosition = new System.Windows.Point(point.X - _clickPoint.X, 
                     point.Y - _clickPoint.Y);
             }
         }

+ 8 - 8
PixiEditor/Models/Tools/Tools/SelectTool.cs

@@ -30,21 +30,21 @@ namespace PixiEditor.Models.Tools.Tools
             Enum.TryParse((Toolbar.GetSetting<DropdownSetting>("Mode")?.Value as ComboBoxItem)?.Content as string, out SelectionType);
 
             _oldSelection = null;
-            if (ViewModelMain.Current.ActiveSelection != null &&
-                ViewModelMain.Current.ActiveSelection.SelectedPoints != null)
-                _oldSelection = ViewModelMain.Current.ActiveSelection;
+            if (ViewModelMain.Current.SelectionSubViewModel.ActiveSelection != null &&
+                ViewModelMain.Current.SelectionSubViewModel.ActiveSelection.SelectedPoints != null)
+                _oldSelection = ViewModelMain.Current.SelectionSubViewModel.ActiveSelection;
         }
 
         public override void OnStoppedRecordingMouseUp(MouseEventArgs e)
         {
-            if (ViewModelMain.Current.ActiveSelection.SelectedPoints.Count() <= 1)
+            if (ViewModelMain.Current.SelectionSubViewModel.ActiveSelection.SelectedPoints.Count() <= 1)
             {
                 // If we have not selected multiple points, clear the selection
-                ViewModelMain.Current.ActiveSelection.Clear();
+                ViewModelMain.Current.SelectionSubViewModel.ActiveSelection.Clear();
             }
 
-            UndoManager.AddUndoChange(new Change("ActiveSelection", _oldSelection,
-                ViewModelMain.Current.ActiveSelection, "Select pixels"));
+            UndoManager.AddUndoChange(new Change("SelectionSubViewModel.ActiveSelection", _oldSelection,
+                ViewModelMain.Current.SelectionSubViewModel.ActiveSelection, "Select pixels"));
         }
 
         public override void Use(Coordinates[] pixels)
@@ -55,7 +55,7 @@ namespace PixiEditor.Models.Tools.Tools
         private void Select(Coordinates[] pixels)
         {
             IEnumerable<Coordinates> selection = GetRectangleSelectionForPoints(pixels[^1], pixels[0]);
-            ViewModelMain.Current.ActiveSelection.SetSelection(selection, SelectionType);
+            ViewModelMain.Current.SelectionSubViewModel.ActiveSelection.SetSelection(selection, SelectionType);
         }
 
         public IEnumerable<Coordinates> GetRectangleSelectionForPoints(Coordinates start, Coordinates end)

+ 2 - 6
PixiEditor/Models/Tools/Tools/ZoomTool.cs

@@ -28,7 +28,7 @@ namespace PixiEditor.Models.Tools.Tools
         public override void OnRecordingLeftMouseDown(MouseEventArgs e)
         {
             _startingX = MousePositionConverter.GetCursorPosition().X;
-            ViewModelMain.Current.ZoomPercentage = 100; //This resest the value, so callback in MainDrawingPanel can fire again later
+            ViewModelMain.Current.ViewportSubViewModel.ZoomPercentage = 100; //This resest the value, so callback in MainDrawingPanel can fire again later
         }
 
         public override void OnMouseMove(MouseEventArgs e)
@@ -61,11 +61,7 @@ namespace PixiEditor.Models.Tools.Tools
 
         public void Zoom(double percentage)
         {
-            ViewModelMain.Current.ZoomPercentage = percentage;
-        }
-
-        public override void Use(Coordinates[] pixels)
-        {
+            ViewModelMain.Current.ViewportSubViewModel.ZoomPercentage = percentage;
         }
     }
 }

+ 5 - 5
PixiEditor/ViewModels/SubViewModels/Main/ClipboardViewModel.cs

@@ -18,9 +18,9 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public ClipboardViewModel(ViewModelMain owner) : base(owner)
         {
-            CopyCommand = new RelayCommand(Copy, Owner.SelectionIsNotEmpty);
-            DuplicateCommand = new RelayCommand(Duplicate, Owner.SelectionIsNotEmpty);
-            CutCommand = new RelayCommand(Cut, Owner.SelectionIsNotEmpty);
+            CopyCommand = new RelayCommand(Copy, Owner.SelectionSubViewModel.SelectionIsNotEmpty);
+            DuplicateCommand = new RelayCommand(Duplicate, Owner.SelectionSubViewModel.SelectionIsNotEmpty);
+            CutCommand = new RelayCommand(Cut, Owner.SelectionSubViewModel.SelectionIsNotEmpty);
             PasteCommand = new RelayCommand(Paste, CanPaste);
         }
 
@@ -34,7 +34,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
         {
             Copy(null);
             Owner.BitmapManager.ActiveLayer.SetPixels(
-                BitmapPixelChanges.FromSingleColoredArray(Owner.ActiveSelection.SelectedPoints.ToArray(),
+                BitmapPixelChanges.FromSingleColoredArray(Owner.SelectionSubViewModel.ActiveSelection.SelectedPoints.ToArray(),
                     Colors.Transparent));
         }
 
@@ -51,7 +51,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
         private void Copy(object parameter)
         {
             ClipboardController.CopyToClipboard(Owner.BitmapManager.ActiveDocument.Layers.ToArray(),
-                Owner.ActiveSelection.SelectedPoints.ToArray(),
+                Owner.SelectionSubViewModel.ActiveSelection.SelectedPoints.ToArray(),
                 Owner.BitmapManager.ActiveDocument.Width,
                 Owner.BitmapManager.ActiveDocument.Height);
         }

+ 1 - 1
PixiEditor/ViewModels/SubViewModels/Main/FileViewModel.cs

@@ -116,7 +116,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             {
                 if (Importer.IsSupportedFile(dialog.FileName))
                     Open(dialog.FileName);
-                Owner.RecenterZoombox = !Owner.RecenterZoombox;
+                Owner.ViewportSubViewModel.CenterViewport();
             }
         }
 

+ 54 - 0
PixiEditor/ViewModels/SubViewModels/Main/SelectionViewModel.cs

@@ -0,0 +1,54 @@
+using PixiEditor.Helpers;
+using PixiEditor.Models.Controllers;
+using PixiEditor.Models.DataHolders;
+using PixiEditor.Models.Enums;
+using PixiEditor.Models.Position;
+using PixiEditor.Models.Tools.Tools;
+using System;
+
+namespace PixiEditor.ViewModels.SubViewModels.Main
+{
+    public class SelectionViewModel : SubViewModel<ViewModelMain>
+    {
+        public RelayCommand DeselectCommand { get; set; }
+        public RelayCommand SelectAllCommand { get; set; }
+
+        private Selection _selection;
+        public Selection ActiveSelection
+        {
+            get => _selection;
+            set
+            {
+                _selection = value;
+                RaisePropertyChanged("ActiveSelection");
+            }
+        }
+        public SelectionViewModel(ViewModelMain owner) : base(owner)
+        {
+            DeselectCommand = new RelayCommand(Deselect, SelectionIsNotEmpty);
+            SelectAllCommand = new RelayCommand(SelectAll, CanSelectAll);
+            ActiveSelection = new Selection(Array.Empty<Coordinates>());
+        }
+
+        public void SelectAll(object parameter)
+        {
+            SelectTool select = new SelectTool();
+            ActiveSelection.SetSelection(select.GetAllSelection(), SelectionType.New);
+        }
+
+        private bool CanSelectAll(object property)
+        {
+            return Owner.BitmapManager.ActiveDocument != null && Owner.BitmapManager.ActiveDocument.Layers.Count > 0;
+        }
+
+        public void Deselect(object parameter)
+        {
+            ActiveSelection?.Clear();
+        }
+
+        public bool SelectionIsNotEmpty(object property)
+        {
+            return ActiveSelection?.SelectedPoints != null && ActiveSelection.SelectedPoints.Count > 0;
+        }
+    }
+}

+ 70 - 0
PixiEditor/ViewModels/SubViewModels/Main/UndoViewModel.cs

@@ -0,0 +1,70 @@
+using PixiEditor.Helpers;
+using PixiEditor.Models.Controllers;
+using PixiEditor.Models.DataHolders;
+
+namespace PixiEditor.ViewModels.SubViewModels.Main
+{
+    public class UndoViewModel : SubViewModel<ViewModelMain>
+    {
+        public RelayCommand UndoCommand { get; set; }
+        public RelayCommand RedoCommand { get; set; }
+
+        private LayerChange[] _undoChanges;
+        public LayerChange[] UndoChanges //This acts like UndoManager process, but it was implemented before process system, so it can be transformed into it
+        {
+            get => _undoChanges;
+            set
+            {
+                _undoChanges = value;
+                for (int i = 0; i < value.Length; i++)
+                    Owner.BitmapManager.ActiveDocument.Layers[value[i].LayerIndex].SetPixels(value[i].PixelChanges);
+            }
+        }
+
+        public UndoViewModel(ViewModelMain owner) : base(owner)
+        {
+            UndoCommand = new RelayCommand(Undo, CanUndo);
+            RedoCommand = new RelayCommand(Redo, CanRedo);
+        }
+
+        /// <summary>
+        ///     Undo last action
+        /// </summary>
+        /// <param name="parameter"></param>
+        public void Undo(object parameter)
+        {
+            Owner.SelectionSubViewModel.Deselect(null);
+            UndoManager.Undo();
+        }
+
+        /// <summary>
+        ///     Returns true if undo can be done.
+        /// </summary>
+        /// <param name="property"></param>
+        /// <returns></returns>
+        private bool CanUndo(object property)
+        {
+            return UndoManager.CanUndo;
+        }
+
+        /// <summary>
+        ///     Redo last action
+        /// </summary>
+        /// <param name="parameter"></param>
+        public void Redo(object parameter)
+        {
+            UndoManager.Redo();
+        }
+
+        /// <summary>
+        ///     Returns true if redo can be done.
+        /// </summary>
+        /// <param name="property"></param>
+        /// <returns></returns>
+        private bool CanRedo(object property)
+        {
+            return UndoManager.CanRedo;
+        }
+
+    }
+}

+ 67 - 0
PixiEditor/ViewModels/SubViewModels/Main/ViewportViewModel.cs

@@ -0,0 +1,67 @@
+using PixiEditor.Helpers;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows;
+
+namespace PixiEditor.ViewModels.SubViewModels.Main
+{
+    public class ViewportViewModel : SubViewModel<ViewModelMain>
+    {
+        public RelayCommand ZoomCommand { get; set; }
+
+        private double _zoomPercentage = 100;
+
+        public double ZoomPercentage
+        {
+            get { return _zoomPercentage; }
+            set
+            {
+                _zoomPercentage = value;
+                RaisePropertyChanged(nameof(ZoomPercentage));
+            }
+        }
+
+        private Point _viewPortPosition;
+
+        public Point ViewportPosition
+        {
+            get => _viewPortPosition;
+            set
+            {
+                _viewPortPosition = value;
+                RaisePropertyChanged(nameof(ViewportPosition));
+            }
+        }
+
+        private bool _recenterZoombox;
+        public bool RecenterZoombox
+        {
+            get => _recenterZoombox;
+            set
+            {
+                _recenterZoombox = value;
+                RaisePropertyChanged(nameof(RecenterZoombox));
+            }
+        }
+
+
+        public ViewportViewModel(ViewModelMain owner) : base(owner)
+        {
+            ZoomCommand = new RelayCommand(ZoomViewport);
+
+        }
+
+        public void CenterViewport()
+        {
+            RecenterZoombox = !RecenterZoombox; //It's a trick to trigger change in UserControl
+        }
+
+        private void ZoomViewport(object parameter)
+        {
+            double zoom = (int)parameter;
+            ZoomPercentage = zoom;
+            ZoomPercentage = 100;
+        }
+    }
+}

+ 32 - 168
PixiEditor/ViewModels/ViewModelMain.cs

@@ -30,24 +30,14 @@ namespace PixiEditor.ViewModels
 
         private Color _primaryColor = Colors.Black;
 
-        private bool _recenterZoombox;
-
         private Color _secondaryColor = Colors.White;
 
-        private Selection _selection;
-
-        private LayerChange[] _undoChanges;
-
         public bool UnsavedDocumentModified { get; set; }
 
         public Action CloseAction { get; set; }
 
-        public static ViewModelMain Current { get; set; }                
-        public RelayCommand UndoCommand { get; set; }
-        public RelayCommand RedoCommand { get; set; }       
-        public RelayCommand SwapColorsCommand { get; set; }
-        public RelayCommand DeselectCommand { get; set; }
-        public RelayCommand SelectAllCommand { get; set; }        
+        public static ViewModelMain Current { get; set; }                         
+        public RelayCommand SwapColorsCommand { get; set; }    
         public RelayCommand ClipCanvasCommand { get; set; }
         public RelayCommand DeletePixelsCommand { get; set; }
         public RelayCommand OpenResizePopupCommand { get; set; }
@@ -56,15 +46,17 @@ namespace PixiEditor.ViewModels
         public RelayCommand OnStartupCommand { get; set; }
         public RelayCommand CloseWindowCommand { get; set; }
         public RelayCommand CenterContentCommand { get; set; }
-        public RelayCommand OpenHyperlinkCommand { get; set; }
-        public RelayCommand ZoomCommand { get; set; }
-        
+        public RelayCommand OpenHyperlinkCommand { get; set; } 
+
         public FileViewModel FileSubViewModel { get; set; }
         public UpdateViewModel UpdateSubViewModel { get; set; }
         public ToolsViewModel ToolsSubViewModel { get; set; }
         public IoViewModel IoSubViewModel { get; set; }
         public LayersViewModel LayersSubViewModel { get; set; }
         public ClipboardViewModel ClipboardSubViewModel { get; set; }
+        public UndoViewModel UndoSubViewModel { get; set; }
+        public SelectionViewModel SelectionSubViewModel { get; set; }
+        public ViewportViewModel ViewportSubViewModel { get; set; }
 
 
         private double _mouseXonCanvas;
@@ -77,7 +69,7 @@ namespace PixiEditor.ViewModels
             set
             {
                 _mouseXonCanvas = value;
-                RaisePropertyChanged("MouseXOnCanvas");
+                RaisePropertyChanged(nameof(MouseXOnCanvas));
             }
         }
 
@@ -87,17 +79,7 @@ namespace PixiEditor.ViewModels
             set
             {
                 _mouseYonCanvas = value;
-                RaisePropertyChanged("MouseYOnCanvas");
-            }
-        }
-
-        public bool RecenterZoombox
-        {
-            get => _recenterZoombox;
-            set
-            {
-                _recenterZoombox = value;
-                RaisePropertyChanged("RecenterZoombox");
+                RaisePropertyChanged(nameof(MouseYOnCanvas));
             }
         }
 
@@ -128,70 +110,24 @@ namespace PixiEditor.ViewModels
             }
         }
 
-        public LayerChange[] UndoChanges //This acts like UndoManager process, but it was implemented before process system, so it can be transformed into it
-        {
-            get => _undoChanges;
-            set
-            {
-                _undoChanges = value;
-                for (int i = 0; i < value.Length; i++)
-                    BitmapManager.ActiveDocument.Layers[value[i].LayerIndex].SetPixels(value[i].PixelChanges);
-            }
-        }
-
-        private double _zoomPercentage = 100;
-
-        public double ZoomPercentage
-        {
-            get { return _zoomPercentage; }
-            set 
-            {
-                _zoomPercentage = value;
-                RaisePropertyChanged(nameof(ZoomPercentage));
-            }
-        }
-
-        private Point _viewPortPosition;
-
-        public Point ViewportPosition
-        {
-            get => _viewPortPosition;
-            set 
-            {
-                _viewPortPosition = value;
-                RaisePropertyChanged(nameof(ViewportPosition));
-            }
-        }
-
         public BitmapManager BitmapManager { get; set; }
         public PixelChangesController ChangesController { get; set; }
 
         public ShortcutController ShortcutController { get; set; }
 
-        public Selection ActiveSelection
-        {
-            get => _selection;
-            set
-            {
-                _selection = value;
-                RaisePropertyChanged("ActiveSelection");
-            }
-        }
-
         public ViewModelMain()
         {
             BitmapManager = new BitmapManager();
             BitmapManager.BitmapOperations.BitmapChanged += BitmapUtility_BitmapChanged;
             BitmapManager.MouseController.StoppedRecordingChanges += MouseController_StoppedRecordingChanges;
             BitmapManager.DocumentChanged += BitmapManager_DocumentChanged;
+
+            SelectionSubViewModel = new SelectionViewModel(this);
+
             ChangesController = new PixelChangesController();
-            UndoCommand = new RelayCommand(Undo, CanUndo);
-            RedoCommand = new RelayCommand(Redo, CanRedo);
-            SwapColorsCommand = new RelayCommand(SwapColors);
-            DeselectCommand = new RelayCommand(Deselect, SelectionIsNotEmpty);
-            SelectAllCommand = new RelayCommand(SelectAll, CanSelectAll);            
+            SwapColorsCommand = new RelayCommand(SwapColors);           
             ClipCanvasCommand = new RelayCommand(ClipCanvas, DocumentIsNotNull);
-            DeletePixelsCommand = new RelayCommand(DeletePixels, SelectionIsNotEmpty);
+            DeletePixelsCommand = new RelayCommand(DeletePixels, SelectionSubViewModel.SelectionIsNotEmpty);
             OpenResizePopupCommand = new RelayCommand(OpenResizePopup, DocumentIsNotNull);
             SelectColorCommand = new RelayCommand(SelectColor);
             RemoveSwatchCommand = new RelayCommand(RemoveSwatch);
@@ -199,7 +135,6 @@ namespace PixiEditor.ViewModels
             CloseWindowCommand = new RelayCommand(CloseWindow);
             CenterContentCommand = new RelayCommand(CenterContent, DocumentIsNotNull);
             OpenHyperlinkCommand = new RelayCommand(OpenHyperlink);
-            ZoomCommand = new RelayCommand(ZoomViewport);
 
             FileSubViewModel = new FileViewModel(this);
             UpdateSubViewModel = new UpdateViewModel(this);
@@ -207,7 +142,10 @@ namespace PixiEditor.ViewModels
             IoSubViewModel = new IoViewModel(this);
             LayersSubViewModel = new LayersViewModel(this);
             ClipboardSubViewModel = new ClipboardViewModel(this);
-           
+            UndoSubViewModel = new UndoViewModel(this);
+            ViewportSubViewModel = new ViewportViewModel(this);
+
+
             ShortcutController = new ShortcutController
             {
                 Shortcuts = new List<Shortcut>
@@ -225,16 +163,16 @@ namespace PixiEditor.ViewModels
                     new Shortcut(Key.M, ToolsSubViewModel.SelectToolCommand, ToolType.Select),
                     new Shortcut(Key.Z, ToolsSubViewModel.SelectToolCommand, ToolType.Zoom),
                     new Shortcut(Key.H, ToolsSubViewModel.SelectToolCommand, ToolType.MoveViewport),
-                    new Shortcut(Key.OemPlus, ZoomCommand, 115),
-                    new Shortcut(Key.OemMinus, ZoomCommand, 85),
+                    new Shortcut(Key.OemPlus, ViewportSubViewModel.ZoomCommand, 115),
+                    new Shortcut(Key.OemMinus, ViewportSubViewModel.ZoomCommand, 85),
                     new Shortcut(Key.OemOpenBrackets, ToolsSubViewModel.ChangeToolSizeCommand, -1),
                     new Shortcut(Key.OemCloseBrackets, ToolsSubViewModel.ChangeToolSizeCommand, 1),
                     //Editor
                     new Shortcut(Key.X, SwapColorsCommand),
-                    new Shortcut(Key.Y, RedoCommand, modifier: ModifierKeys.Control),
-                    new Shortcut(Key.Z, UndoCommand, modifier: ModifierKeys.Control),
-                    new Shortcut(Key.D, DeselectCommand, modifier: ModifierKeys.Control),
-                    new Shortcut(Key.A, SelectAllCommand, modifier: ModifierKeys.Control),
+                    new Shortcut(Key.Y, UndoSubViewModel.RedoCommand, modifier: ModifierKeys.Control),
+                    new Shortcut(Key.Z,  UndoSubViewModel.UndoCommand, modifier: ModifierKeys.Control),
+                    new Shortcut(Key.D, SelectionSubViewModel.DeselectCommand, modifier: ModifierKeys.Control),
+                    new Shortcut(Key.A, SelectionSubViewModel.SelectAllCommand, modifier: ModifierKeys.Control),
                     new Shortcut(Key.C, ClipboardSubViewModel.CopyCommand, modifier: ModifierKeys.Control),
                     new Shortcut(Key.V, ClipboardSubViewModel.PasteCommand, modifier: ModifierKeys.Control),
                     new Shortcut(Key.J, ClipboardSubViewModel.DuplicateCommand, modifier: ModifierKeys.Control),
@@ -254,17 +192,9 @@ namespace PixiEditor.ViewModels
             };
             UndoManager.SetMainRoot(this);
             BitmapManager.PrimaryColor = PrimaryColor;
-            ActiveSelection = new Selection(Array.Empty<Coordinates>());
             Current = this;
         }        
 
-        private void ZoomViewport(object parameter)
-        {
-            double zoom = (int)parameter;
-            ZoomPercentage = zoom;
-            ZoomPercentage = 100;
-        }
-
         private void OpenHyperlink(object parameter)
         {
             if (parameter == null) return;
@@ -327,8 +257,8 @@ namespace PixiEditor.ViewModels
 
         private void ActiveDocument_DocumentSizeChanged(object sender, DocumentSizeChangedEventArgs e)
         {
-            ActiveSelection = new Selection(Array.Empty<Coordinates>());
-            RecenterZoombox = !RecenterZoombox;
+            SelectionSubViewModel.ActiveSelection = new Selection(Array.Empty<Coordinates>());
+            ViewportSubViewModel.CenterViewport();
             UnsavedDocumentModified = true;
         }
 
@@ -355,41 +285,18 @@ namespace PixiEditor.ViewModels
         private void DeletePixels(object parameter)
         {
             BitmapManager.BitmapOperations.DeletePixels(new[] {BitmapManager.ActiveLayer},
-                ActiveSelection.SelectedPoints.ToArray());
+                SelectionSubViewModel.ActiveSelection.SelectedPoints.ToArray());
         }
 
         public void ClipCanvas(object parameter)
         {
             BitmapManager.ActiveDocument?.ClipCanvas();
-        }
-
-        public void SelectAll(object parameter)
-        {
-            SelectTool select = new SelectTool();
-            ActiveSelection.SetSelection(select.GetAllSelection(), SelectionType.New);
-        }
-
-        private bool CanSelectAll(object property)
-        {
-            return BitmapManager.ActiveDocument != null && BitmapManager.ActiveDocument.Layers.Count > 0;
-        }
+        }        
 
         public bool DocumentIsNotNull(object property)
         {
             return BitmapManager.ActiveDocument != null;
-        }
-
-        public void Deselect(object parameter)
-        {
-            ActiveSelection?.Clear();
-        }
-
-        public bool SelectionIsNotEmpty(object property)
-        {
-            return ActiveSelection?.SelectedPoints != null && ActiveSelection.SelectedPoints.Count > 0;
-        }
-
-        
+        }            
 
         private void MouseController_StoppedRecordingChanges(object sender, EventArgs e)
         {
@@ -406,7 +313,7 @@ namespace PixiEditor.ViewModels
                 {
                     LayerChange[] newValues = changes.Select(x => x.Item1).ToArray();
                     LayerChange[] oldValues = changes.Select(x => x.Item2).ToArray();
-                    UndoManager.AddUndoChange(new Change("UndoChanges", oldValues, newValues));
+                    UndoManager.AddUndoChange(new Change("UndoChanges", oldValues, newValues, root: UndoSubViewModel));
                     toolUsed.AfterAddedUndo();
                 }
             }
@@ -436,53 +343,10 @@ namespace PixiEditor.ViewModels
             BitmapManager.PreviewLayer = null;
             UndoManager.UndoStack.Clear();
             UndoManager.RedoStack.Clear();
-            ActiveSelection = new Selection(Array.Empty<Coordinates>());
-            RecenterZoombox = !RecenterZoombox;
+            SelectionSubViewModel.ActiveSelection = new Selection(Array.Empty<Coordinates>());
+            ViewportSubViewModel.CenterViewport();
             Exporter.SaveDocumentPath = null;
             UnsavedDocumentModified = false;
         }
-
-        #region Undo/Redo
-
-        /// <summary>
-        ///     Undo last action
-        /// </summary>
-        /// <param name="parameter"></param>
-        public void Undo(object parameter)
-        {
-            Deselect(null);
-            UndoManager.Undo();
-        }
-
-        /// <summary>
-        ///     Returns true if undo can be done.
-        /// </summary>
-        /// <param name="property"></param>
-        /// <returns></returns>
-        private bool CanUndo(object property)
-        {
-            return UndoManager.CanUndo;
-        }
-
-        /// <summary>
-        ///     Redo last action
-        /// </summary>
-        /// <param name="parameter"></param>
-        public void Redo(object parameter)
-        {
-            UndoManager.Redo();
-        }
-
-        /// <summary>
-        ///     Returns true if redo can be done.
-        /// </summary>
-        /// <param name="property"></param>
-        /// <returns></returns>
-        private bool CanRedo(object property)
-        {
-            return UndoManager.CanRedo;
-        }
-
-        #endregion
     }
 }

+ 10 - 10
PixiEditor/Views/MainWindow.xaml

@@ -86,8 +86,8 @@
                     <MenuItem Header="_Exit" Command="{x:Static SystemCommands.CloseWindowCommand}" />
                 </MenuItem>
                 <MenuItem Header="_Edit">
-                    <MenuItem Header="_Undo" InputGestureText="Ctrl+Z" Command="{Binding UndoCommand}" />
-                    <MenuItem Header="_Redo" InputGestureText="Ctrl+Y" Command="{Binding RedoCommand}" />
+                    <MenuItem Header="_Undo" InputGestureText="Ctrl+Z" Command="{Binding UndoSubViewModel.UndoCommand}" />
+                    <MenuItem Header="_Redo" InputGestureText="Ctrl+Y" Command="{Binding UndoSubViewModel.RedoCommand}" />
                     <Separator />
                     <MenuItem Header="_Cut" Command="{Binding ClipboardSubViewModel.CutCommand}" InputGestureText="Ctrl+X" />
                     <MenuItem Header="_Copy" Command="{Binding ClipboardSubViewModel.CopyCommand}" InputGestureText="Ctrl+C" />
@@ -98,8 +98,8 @@
                               InputGestureText="Delete" />
                 </MenuItem>
                 <MenuItem Header="_Select">
-                    <MenuItem Header="_Select All" Command="{Binding SelectAllCommand}" InputGestureText="Ctrl+A" />
-                    <MenuItem Header="_Deselect" Command="{Binding DeselectCommand}" InputGestureText="Ctrl+D" />
+                    <MenuItem Header="_Select All" Command="{Binding SelectionSubViewModel.SelectAllCommand}" InputGestureText="Ctrl+A" />
+                    <MenuItem Header="_Deselect" Command="{Binding SelectionSubViewModel.DeselectCommand}" InputGestureText="Ctrl+D" />
                 </MenuItem>
                 <MenuItem Header="_Document">
                     <MenuItem Header="Resize Document..." Command="{Binding OpenResizePopupCommand}"
@@ -162,11 +162,11 @@
         </StackPanel>
         <Grid Grid.Column="1" Grid.Row="2" Background="#303030" Margin="0,7,5,0">
             <Grid>
-                <vws:MainDrawingPanel ZoomPercentage="{Binding ZoomPercentage, Mode=TwoWay}" Center="{Binding RecenterZoombox, Mode=TwoWay}" x:Name="DrawingPanel"
+                <vws:MainDrawingPanel ZoomPercentage="{Binding ViewportSubViewModel.ZoomPercentage, Mode=TwoWay}" Center="{Binding ViewportSubViewModel.RecenterZoombox, Mode=TwoWay}" x:Name="DrawingPanel"
                                       CenterOnStart="True" Cursor="{Binding ToolsSubViewModel.ToolCursor}" 
                                       MiddleMouseClickedCommand="{Binding ToolsSubViewModel.SelectToolCommand}" 
                                       MiddleMouseClickedCommandParameter="{x:Static tools:ToolType.MoveViewport}"
-                                      ViewportPosition="{Binding ViewportPosition, Mode=TwoWay}">
+                                      ViewportPosition="{Binding ViewportSubViewModel.ViewportPosition, Mode=TwoWay}">
                     <i:Interaction.Triggers>
                         <i:EventTrigger EventName="MouseMove">
                             <i:InvokeCommandAction Command="{Binding IoSubViewModel.MouseMoveCommand}" />
@@ -209,11 +209,11 @@
                                     </DataTemplate>
                                 </ItemsControl.ItemTemplate>
                             </ItemsControl>
-                            <Image VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding ActiveSelection.SelectionLayer.LayerBitmap}"
+                            <Image VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding SelectionSubViewModel.ActiveSelection.SelectionLayer.LayerBitmap}"
                                    RenderOptions.BitmapScalingMode="NearestNeighbor" Stretch="Uniform"
-                                   Width="{Binding ActiveSelection.SelectionLayer.Width}"
-                                   Height="{Binding ActiveSelection.SelectionLayer.Height}" 
-                                   Margin="{Binding ActiveSelection.SelectionLayer.Offset}" />
+                                   Width="{Binding SelectionSubViewModel.ActiveSelection.SelectionLayer.Width}"
+                                   Height="{Binding SelectionSubViewModel.ActiveSelection.SelectionLayer.Height}" 
+                                   Margin="{Binding SelectionSubViewModel.ActiveSelection.SelectionLayer.Offset}" />
                         </Canvas>
                     </vws:MainDrawingPanel.Item>
                 </vws:MainDrawingPanel>

+ 9 - 9
PixiEditor/Views/UserControls/AnchorPointPicker.xaml

@@ -20,63 +20,63 @@
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" ToolTip="Top left" Grid.Row="0"
                       Grid.Column="0" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" Grid.Row="0" ToolTip="Top center"
                       Grid.Column="1" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" ToolTip="Top right" Grid.Row="0"
                       Grid.Column="2" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" Grid.Row="1" ToolTip="Middle left"
                       Grid.Column="0" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" Grid.Row="1" Grid.Column="1"
                       ToolTip="Middle center" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" Grid.Row="1" Grid.Column="2"
                       ToolTip="Middle right" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" Grid.Row="2" Grid.Column="0"
                       ToolTip="Bottom left" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" Grid.Row="2" Grid.Column="1"
                       ToolTip="Bottom center" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
         <ToggleButton Checked="ToggleButton_Checked" Click="ToggleButton_Click" Margin="0.25"
                       Style="{DynamicResource AnchorPointToggleButtonStyle}" Grid.Row="2" Grid.Column="2"
                       ToolTip="Bottom right" BorderBrush="Black">
             <ToggleButton.Background>
-                <ImageBrush ImageSource="../Images/AnchorDot.png" />
+                <ImageBrush ImageSource="../../Images/AnchorDot.png" />
             </ToggleButton.Background>
         </ToggleButton>
     </Grid>