Browse Source

Refactor MagicWand selection and fix undo

Updated MagicWand_UpdateableChange to use the current selection path directly for operations and simplified revert logic. Reordered ChangeBoundary_Action addition in MagicWandToolExecutor to occur after update/finish actions..
Francespo 1 month ago
parent
commit
8dacac794c

+ 3 - 3
src/PixiEditor.ChangeableDocument/Changes/Selection/MagicWand/MagicWand_UpdateableChange.cs

@@ -71,8 +71,7 @@ internal class MagicWand_UpdateableChange : UpdateableChange
         }
         else
         {
-            originalPath = originalPath!.Op(path, mode.ToVectorPathOp());
-            target.Selection.SelectionPath = originalPath;
+            target.Selection.SelectionPath = target.Selection.SelectionPath!.Op(path, mode.ToVectorPathOp());
         }
         toDispose.Dispose();
 
@@ -81,7 +80,8 @@ internal class MagicWand_UpdateableChange : UpdateableChange
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
-        (var toDispose, target.Selection.SelectionPath) = (target.Selection.SelectionPath, new VectorPath(originalPath!));
+        var toDispose = target.Selection.SelectionPath;
+        target.Selection.SelectionPath = new VectorPath(originalPath!);
         toDispose.Dispose();
         return new Selection_ChangeInfo(new VectorPath(target.Selection.SelectionPath));
     }

+ 3 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/MagicWandToolExecutor.cs

@@ -40,21 +40,21 @@ internal class MagicWandToolExecutor : UpdateableChangeExecutor
 
     public override void OnPixelPositionChange(VecI pos)
     {
-        internals!.ActionAccumulator.AddActions(new ChangeBoundary_Action());
         AddUpdateAction(pos);
+        internals!.ActionAccumulator.AddActions(new ChangeBoundary_Action());
     }
 
     public override void OnLeftMouseButtonUp(VecD argsPositionOnCanvas)
     {
-        internals!.ActionAccumulator.AddActions(new ChangeBoundary_Action());
         AddFinishAction();
+        internals!.ActionAccumulator.AddActions(new ChangeBoundary_Action());
         onEnded!(this);
     }
 
     public override void ForceStop()
     {
-        internals!.ActionAccumulator.AddActions(new ChangeBoundary_Action());
         AddFinishAction();
+        internals!.ActionAccumulator.AddActions(new ChangeBoundary_Action());
     }
 
     private void AddUpdateAction(VecI pos)