Browse Source

Added possibility to undo when transform overlay is active

flabbet 10 months ago
parent
commit
fd0d5a0b83

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Drawing/TransformSelected_UpdateableChange.cs

@@ -267,7 +267,7 @@ internal class TransformSelected_UpdateableChange : UpdateableChange
             infos.Add(SelectionChangeHelper.DoSelectionTransform(target, originalPath!, originalSelectionBounds,
                 masterCorners, cornersToSelectionOffset, originalCornersSize));
         }
-
+        
         hasEnqueudImages = false;
         ignoreInUndo = false;
         return infos;

+ 8 - 0
src/PixiEditor/Models/DocumentModels/ChangeExecutionController.cs

@@ -271,4 +271,12 @@ internal class ChangeExecutionController
     {
         currentSession?.OnColorChanged(color, false);
     }
+
+    public T? TryGetExecutorFeature<T>()
+    {
+        if (currentSession is T feature)
+            return feature;
+        
+        return default;
+    }
 }

+ 8 - 3
src/PixiEditor/Models/DocumentModels/Public/DocumentOperationsModule.cs

@@ -422,12 +422,17 @@ internal class DocumentOperationsModule : IDocumentOperations
     /// </summary>
     public void Undo()
     {
-        if (Internals.ChangeController.IsChangeOfTypeActive<IMidChangeUndoableExecutor>())
+        IMidChangeUndoableExecutor executor = Internals.ChangeController.TryGetExecutorFeature<IMidChangeUndoableExecutor>();
+        if (executor is { CanUndo: true })
         {
-            Internals.ChangeController.MidChangeUndoInlet();
+            executor.OnMidChangeUndo();
             return;
         }
-
+        
+        if(Internals.ChangeController.IsBlockingChangeActive)
+            return;
+        
+        Internals.ChangeController.TryStopActiveExecutor();
         Internals.ActionAccumulator.AddActions(new Undo_Action());
     }
 

+ 2 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/ComplexShapeToolExecutor.cs

@@ -32,6 +32,8 @@ internal abstract class ComplexShapeToolExecutor<T> : SimpleShapeToolExecutor wh
     private IBasicShapeToolbar toolbar;
     private IColorsHandler? colorsVM;
 
+    public override bool CanUndo => document.TransformHandler.HasUndo;
+
     public override ExecutionState Start()
     {
         if (base.Start() == ExecutionState.Error)

+ 1 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/Features/IMidChangeUndoableExecutor.cs

@@ -4,4 +4,5 @@ public interface IMidChangeUndoableExecutor : IExecutorFeature
 {
     public void OnMidChangeUndo();
     public void OnMidChangeRedo();
+    public bool CanUndo { get; }
 }

+ 2 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineExecutor.cs

@@ -26,6 +26,8 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
     private IColorsHandler? colorsVM;
     private ILineToolbar? toolbar;
 
+    public override bool CanUndo => document.LineToolOverlayHandler.HasUndo; 
+
     public override ExecutionState Start()
     {
         if (base.Start() == ExecutionState.Error)

+ 1 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/PasteImageExecutor.cs

@@ -75,6 +75,7 @@ internal class PasteImageExecutor : UpdateableChangeExecutor, ITransformableExec
     public void OnMidChangeUndo() => document!.TransformHandler.Undo();
 
     public void OnMidChangeRedo() => document!.TransformHandler.Redo();
+    public bool CanUndo => document!.TransformHandler.HasUndo; 
 
     public void OnTransformApplied()
     {

+ 2 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SimpleShapeToolExecutor.cs

@@ -207,6 +207,8 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
     protected virtual void PrecisePositionChangeTransformMode(VecD pos) { }
     public abstract void OnMidChangeUndo();
     public abstract void OnMidChangeRedo();
+    public abstract bool CanUndo { get; } 
+
     public bool IsFeatureEnabled(IExecutorFeature feature)
     {
         if (feature is ITransformableExecutor)

+ 1 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/TransformSelectedExecutor.cs

@@ -133,6 +133,7 @@ internal class TransformSelectedExecutor : UpdateableChangeExecutor, ITransforma
     public void OnMidChangeUndo() => document!.TransformHandler.Undo();
 
     public void OnMidChangeRedo() => document!.TransformHandler.Redo();
+    public bool CanUndo => document!.TransformHandler.HasUndo; 
 
     public void OnTransformApplied()
     {

+ 1 - 0
src/PixiEditor/Models/Handlers/ILineOverlayHandler.cs

@@ -10,4 +10,5 @@ internal interface ILineOverlayHandler
     public bool Undo();
     public bool Redo();
     public void Show(VecD startPos, VecD endPos, bool showApplyButton);
+    public bool HasUndo { get; }
 }

+ 1 - 0
src/PixiEditor/Models/Handlers/ITransformHandler.cs

@@ -13,4 +13,5 @@ internal interface ITransformHandler : IHandler
     public bool Undo();
     public bool Redo();
     public bool Nudge(VecD distance);
+    public bool HasUndo { get; }
 }

+ 2 - 0
src/PixiEditor/ViewModels/Document/TransformOverlays/DocumentTransformViewModel.cs

@@ -179,6 +179,8 @@ internal class DocumentTransformViewModel : ObservableObject, ITransformHandler
         return true;
     }
 
+    public bool HasUndo => undoStack is not null && undoStack.UndoCount > 0; 
+
     public void HideTransform()
     {
         if (undoStack is null)

+ 2 - 0
src/PixiEditor/ViewModels/Document/TransformOverlays/LineToolOverlayViewModel.cs

@@ -80,6 +80,8 @@ internal class LineToolOverlayViewModel : ObservableObject, ILineOverlayHandler
         ShowApplyButton = showApplyButton;
     }
 
+    public bool HasUndo => undoStack is not null && undoStack.UndoCount > 0; 
+
     public void Hide()
     {
         if (undoStack is null)

+ 2 - 0
src/PixiEditor/ViewModels/Document/TransformOverlays/TransformOverlayUndoStack.cs

@@ -29,6 +29,8 @@ internal class TransformOverlayUndoStack<TState> where TState : struct
     }
 
     public TState? PeekCurrent() => current?.State;
+    
+    public int UndoCount => undoStack.Count;
 
     public TState? Undo()
     {