Browse Source

Added undo to merge, remve and move layers

flabbet 4 years ago
parent
commit
21ff158424

+ 2 - 2
PixiEditor/Models/Controllers/UndoManager.cs

@@ -130,7 +130,7 @@ namespace PixiEditor.Models.Controllers
 
             Action<object[]> process = (object[] props) =>
             {
-                foreach (var prop in props)
+                foreach (var prop in props.Reverse())
                 {
                     Change change = (Change)prop;
                     if (change.Process == null)
@@ -144,7 +144,7 @@ namespace PixiEditor.Models.Controllers
                 }
             };
 
-            Change change = new Change(reverseProcess, changes, process, changes, description);
+            Change change = new(reverseProcess, changes, process, changes, description);
             AddUndoChange(change);
         }
 

+ 28 - 10
PixiEditor/Models/DataHolders/Document/Document.Layers.cs

@@ -100,28 +100,36 @@ namespace PixiEditor.Models.DataHolders
 
             int oldIndex = Layers.IndexOf(layer);
 
+            var oldLayerStrcuture = LayerStructure.Clone();
+
             MoveLayerInStructureProcess(args);
 
+            AddLayerStructureToUndo(oldLayerStrcuture);
+
             UndoManager.AddUndoChange(new Change(
                 ReverseMoveLayerInStructureProcess,
                 new object[] { oldIndex, layerGuid },
                 MoveLayerInStructureProcess,
                 args,
                 "Move layer"));
+
+            UndoManager.SquashUndoChanges(2, "Move layer");
         }
 
         public void MoveFolderInStructure(Guid groupGuid, Guid referenceLayer, bool above = false)
         {
             var args = new object[] { groupGuid, referenceLayer, above };
 
+            var oldLayerStructure = LayerStructure.Clone();
+
             MoveFolderInStructureProcess(args);
 
+            AddLayerStructureToUndo(oldLayerStructure);
+
             //UndoManager.AddUndoChange(new Change(
-            //    ReverseMoveLayerInStructureProcess,
-            //    new object[] { oldIndex, layerGuid, oldLayerFolder },
-            //    MoveLayerInStructureProcess,
-            //    args,
-            //    "Move layer"));
+            //    MoveFolderInStructureProcess, ));
+
+            UndoManager.SquashUndoChanges(2, "Move gorup");
         }
 
         public void AddNewLayer(string name, WriteableBitmap bitmap, bool setAsActive = true)
@@ -286,8 +294,7 @@ namespace PixiEditor.Models.DataHolders
 
             RemoveLayersProcess(guidArgs);
 
-            UndoManager.AddUndoChange(
-                new Change(nameof(LayerStructure), oldLayerStructure, LayerStructure.Clone(), root: this));
+            AddLayerStructureToUndo(oldLayerStructure);
 
             InjectRemoveActiveLayersUndo(guidArgs, change);
 
@@ -296,6 +303,12 @@ namespace PixiEditor.Models.DataHolders
             SetNextLayerAsActive(firstIndex);
         }
 
+        public void AddLayerStructureToUndo(LayerStructure oldLayerStructure)
+        {
+            UndoManager.AddUndoChange(
+                new Change(nameof(LayerStructure), oldLayerStructure, LayerStructure.Clone(), root: this));
+        }
+
         public Layer MergeLayers(Layer[] layersToMerge, bool nameOfLast, int index)
         {
             if (layersToMerge == null || layersToMerge.Length < 2)
@@ -352,18 +365,23 @@ namespace PixiEditor.Models.DataHolders
 
             IEnumerable<Layer> undoArgs = layersToMerge;
 
-            StorageBasedChange undoChange = new StorageBasedChange(this, undoArgs);
+            var oldLayerStructure = LayerStructure.Clone();
+
+            StorageBasedChange undoChange = new(this, undoArgs);
 
             int[] indexes = layersToMerge.Select(x => Layers.IndexOf(x)).ToArray();
 
             var layer = MergeLayers(layersToMerge, nameIsLastLayers, Layers.IndexOf(layersToMerge[0]));
 
+            AddLayerStructureToUndo(oldLayerStructure);
+
             UndoManager.AddUndoChange(undoChange.ToChange(
                 InsertLayersAtIndexesProcess,
                 new object[] { indexes[0] },
                 MergeLayersProcess,
-                new object[] { indexes, nameIsLastLayers, layer.LayerGuid },
-                "Undo merge layers"));
+                new object[] { indexes, nameIsLastLayers, layer.LayerGuid }));
+
+            UndoManager.SquashUndoChanges(2, "Undo merge layers");
 
             return layer;
         }