Browse Source

Make unique undo dir for each pixieditor instance (also remove storagebasedchange files on dispose)

Equbuxu 3 years ago
parent
commit
b49384d940

+ 4 - 0
PixiEditor/Models/Controllers/UndoManager.cs

@@ -54,6 +54,10 @@ namespace PixiEditor.Models.Controllers
             // Clears RedoStack if last move wasn't redo or undo and if redo stack is greater than 0.
             if (lastChangeWasUndo == false && RedoStack.Count > 0)
             {
+                foreach (var redo in RedoStack)
+                {
+                    redo.Dispose();
+                }
                 RedoStack.Clear();
             }
 

+ 24 - 7
PixiEditor/Models/Undo/StorageBasedChange.cs

@@ -14,9 +14,9 @@ namespace PixiEditor.Models.Undo
     /// <summary>
     ///     A class that allows to save layers on disk and load them on Undo/Redo.
     /// </summary>
-    public class StorageBasedChange
+    public class StorageBasedChange : IDisposable
     {
-        public static string DefaultUndoChangeLocation => Path.Join(Path.GetTempPath(), "PixiEditor", "UndoStack");
+        public static string DefaultUndoChangeLocation { get; } = Path.Join(Path.GetTempPath(), "PixiEditor", Guid.NewGuid().ToString(), "UndoStack");
 
         public string UndoChangeLocation { get; set; }
 
@@ -162,7 +162,9 @@ namespace PixiEditor.Models.Undo
                 redoProcess(parameters);
             };
 
-            return new Change(finalUndoProcess, processArgs, finalRedoProcess, redoProcessParameters, description);
+            var change = new Change(finalUndoProcess, processArgs, finalRedoProcess, redoProcessParameters, description);
+            change.DisposeProcess = (_, _) => Dispose();
+            return change;
         }
 
         /// <summary>
@@ -190,7 +192,9 @@ namespace PixiEditor.Models.Undo
                 undoRedoProcess(layers, StoredLayers, processParameters);
             };
 
-            return new Change(finalProcess, processArgs, finalProcess, processArgs, description);
+            var change = new Change(finalProcess, processArgs, finalProcess, processArgs, description);
+            change.DisposeProcess = (_, _) => Dispose();
+            return change;
         }
 
         /// <summary>
@@ -215,7 +219,9 @@ namespace PixiEditor.Models.Undo
                 redoProcess(parameters);
             };
 
-            return new Change(finalUndoProcess, null, finalRedoProcess, redoProcessParameters, description);
+            var change = new Change(finalUndoProcess, null, finalRedoProcess, redoProcessParameters, description);
+            change.DisposeProcess = (_, _) => Dispose();
+            return change;
         }
 
         /// <summary>
@@ -240,7 +246,9 @@ namespace PixiEditor.Models.Undo
                 redoProcess(layers, StoredLayers);
             };
 
-            return new Change(finalUndoProcess, undoProcessParameters, finalRedoProcess, null, description);
+            var change = new Change(finalUndoProcess, undoProcessParameters, finalRedoProcess, null, description);
+            change.DisposeProcess = (_, _) => Dispose();
+            return change;
         }
 
         /// <summary>
@@ -266,7 +274,9 @@ namespace PixiEditor.Models.Undo
                 redoProcess(layers, StoredLayers, parameters);
             };
 
-            return new Change(finalUndoProcess, undoProcessParameters, finalRedoProcess, redoProcessArgs, description);
+            var change = new Change(finalUndoProcess, undoProcessParameters, finalRedoProcess, redoProcessArgs, description);
+            change.DisposeProcess = (_, _) => Dispose();
+            return change;
         }
 
         /// <summary>
@@ -363,5 +373,12 @@ namespace PixiEditor.Models.Undo
 
             layer.LayerBitmap = targetSizeSurface;
         }
+
+        public void Dispose()
+        {
+            var layers = LoadLayersFromDevice();
+            foreach (var layer in layers)
+                layer.LayerBitmap.Dispose();
+        }
     }
 }

+ 3 - 5
PixiEditor/ViewModels/SubViewModels/Main/UndoViewModel.cs

@@ -18,12 +18,10 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
         {
             UndoCommand = new RelayCommand(Undo, CanUndo);
             RedoCommand = new RelayCommand(Redo, CanRedo);
-            if (!Directory.Exists(StorageBasedChange.DefaultUndoChangeLocation))
-            {
-                Directory.CreateDirectory(StorageBasedChange.DefaultUndoChangeLocation);
-            }
 
-            ClearUndoTempDirectory();
+            var result = Directory.CreateDirectory(StorageBasedChange.DefaultUndoChangeLocation);
+
+            //ClearUndoTempDirectory();
         }
 
         /// <summary>

+ 6 - 1
PixiEditor/ViewModels/ViewModelMain.cs

@@ -325,12 +325,17 @@ namespace PixiEditor.ViewModels
                 if (result == ConfirmationType.Yes)
                 {
                     FileSubViewModel.SaveDocument(false);
+                    //cancel was pressed in the save file dialog
+                    if (!BitmapManager.ActiveDocument.ChangesSaved)
+                        return false;
                 }
             }
 
             if (result != ConfirmationType.Canceled)
             {
-                BitmapManager.Documents.Remove(BitmapManager.ActiveDocument);
+                var doc = BitmapManager.ActiveDocument;
+                BitmapManager.Documents.Remove(doc);
+                doc.Dispose();
 
                 return true;
             }