Browse Source

Nudge selected object

Equbuxu 2 years ago
parent
commit
5efb475665

+ 11 - 2
src/ChunkyImageLib/DataHolders/ShapeCorners.cs

@@ -55,7 +55,8 @@ public struct ShapeCorners
     {
         get
         {
-            Span<VecD> lengths = stackalloc[] {
+            Span<VecD> lengths = stackalloc[] 
+            {
                 TopLeft - TopRight,
                 TopRight - BottomRight,
                 BottomRight - BottomLeft,
@@ -133,7 +134,7 @@ public struct ShapeCorners
         TopLeft = TopLeft.ReflectY(horAxisY),
         TopRight = TopRight.ReflectY(horAxisY)
     };
-    
+
     public ShapeCorners AsMirroredAcrossVerAxis(int verAxisX) => new ShapeCorners
     {
         BottomLeft = BottomLeft.ReflectX(verAxisX),
@@ -150,6 +151,14 @@ public struct ShapeCorners
         TopRight = TopRight.Rotate(angle, around)
     };
 
+    public ShapeCorners AsTranslated(VecD delta) => new ShapeCorners
+    {
+        BottomLeft = BottomLeft + delta,
+        BottomRight = BottomRight + delta,
+        TopLeft = TopLeft + delta,
+        TopRight = TopRight + delta
+    };
+
     public static bool operator !=(ShapeCorners left, ShapeCorners right) => !(left == right);
     public static bool operator == (ShapeCorners left, ShapeCorners right)
     {

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

@@ -178,4 +178,9 @@ internal class ChangeExecutionController
     {
         currentSession?.OnLineOverlayMoved(start, end);
     }
+
+    public void SelectedObjectNudgedInlet(VecI distance)
+    {
+        currentSession?.OnSelectedObjectNudged(distance);
+    }
 }

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

@@ -227,6 +227,14 @@ internal class DocumentOperationsModule
         Internals.ActionAccumulator.AddActions(new Redo_Action());
     }
 
+    public void NudgeSelectedObject(VecI distance)
+    {
+        if (Internals.ChangeController.IsChangeActive)
+        {
+            Internals.ChangeController.SelectedObjectNudgedInlet(distance);
+        }    
+    }
+
     public void MoveStructureMember(Guid memberToMove, Guid memberToMoveIntoOrNextTo, StructureMemberPlacement placement)
     {
         if (Internals.ChangeController.IsChangeActive || memberToMove == memberToMoveIntoOrNextTo)

+ 7 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineToolExecutor.cs

@@ -81,6 +81,13 @@ internal class LineToolExecutor : UpdateableChangeExecutor
         internals!.ActionAccumulator.AddActions(new DrawLine_Action(memberGuid, (VecI)start, (VecI)end, strokeWidth, strokeColor, StrokeCap.Butt, drawOnMask));
     }
 
+    public override void OnSelectedObjectNudged(VecI distance)
+    {
+        if (!transforming)
+            return;
+        document!.LineToolOverlayViewModel.Nudge(distance);
+    }
+
     public override void OnMidChangeUndo()
     {
         if (!transforming)

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

@@ -45,6 +45,8 @@ internal class PasteImageExecutor : UpdateableChangeExecutor
         internals!.ActionAccumulator.AddActions(new PasteImage_Action(image, corners, memberGuid, false, drawOnMask));
     }
 
+    public override void OnSelectedObjectNudged(VecI distance) => document!.TransformViewModel.Nudge(distance);
+
     public override void OnMidChangeUndo() => document!.TransformViewModel.Undo();
 
     public override void OnMidChangeRedo() => document!.TransformViewModel.Redo();

+ 7 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/ShapeToolExecutor.cs

@@ -114,6 +114,13 @@ internal abstract class ShapeToolExecutor<T> : UpdateableChangeExecutor where T
         onEnded?.Invoke(this);
     }
 
+    public override void OnSelectedObjectNudged(VecI distance)
+    {
+        if (!transforming)
+            return;
+        document!.TransformViewModel.Nudge(distance);
+    }
+
     public override void OnMidChangeUndo()
     {
         if (!transforming)

+ 3 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/TransformReferenceLayerExecutor.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Models.Enums;
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
@@ -25,6 +26,8 @@ internal class TransformReferenceLayerExecutor : UpdateableChangeExecutor
         internals!.ActionAccumulator.AddActions(new TransformReferenceLayer_Action(corners));
     }
 
+    public override void OnSelectedObjectNudged(VecI distance) => document!.TransformViewModel.Nudge(distance);
+
     public override void OnMidChangeUndo() => document!.TransformViewModel.Undo();
 
     public override void OnMidChangeRedo() => document!.TransformViewModel.Redo();

+ 3 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/TransformSelectedAreaExecutor.cs

@@ -1,4 +1,5 @@
 using ChunkyImageLib.DataHolders;
+using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels.SubViewModels.Document;
 using PixiEditor.ViewModels.SubViewModels.Tools.Tools;
@@ -45,6 +46,8 @@ internal class TransformSelectedAreaExecutor : UpdateableChangeExecutor
             new TransformSelectedArea_Action(membersToTransform!, corners, tool!.KeepOriginalImage, false));
     }
 
+    public override void OnSelectedObjectNudged(VecI distance) => document!.TransformViewModel.Nudge(distance);
+
     public override void OnMidChangeUndo() => document!.TransformViewModel.Undo();
 
     public override void OnMidChangeRedo() => document!.TransformViewModel.Redo();

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

@@ -49,4 +49,5 @@ internal abstract class UpdateableChangeExecutor
     public virtual void OnLineOverlayMoved(VecD start, VecD end) { }
     public virtual void OnMidChangeUndo() { }
     public virtual void OnMidChangeRedo() { }
+    public virtual void OnSelectedObjectNudged(VecI distance) { }
 }

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

@@ -1,6 +1,7 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 using PixiEditor;
+using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels;
@@ -142,6 +143,16 @@ internal class DocumentTransformViewModel : NotifyableObject
         return true;
     }
 
+    public bool Nudge(VecD distance)
+    {
+        if (undoStack is null)
+            return false;
+
+        RequestedCorners = Corners.AsTranslated(distance);
+        undoStack.AddState((Corners, InternalState), TransformOverlayStateType.Nudge);
+        return true;
+    }
+
     public void HideTransform()
     {
         if (undoStack is null)

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

@@ -80,6 +80,16 @@ internal class LineToolOverlayViewModel : NotifyableObject
         IsEnabled = false;
     }
 
+    public bool Nudge(VecD distance)
+    {
+        if (undoStack is null)
+            return false;
+        LineStart = LineStart + distance;
+        LineEnd = LineEnd + distance;
+        undoStack.AddState((lineStart, lineEnd), TransformOverlayStateType.Nudge);
+        return true;
+    }
+
     public bool Undo()
     {
         if (undoStack is null)

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Document/TransformOverlays/TransformOverlayActionType.cs

@@ -2,7 +2,7 @@
 internal enum TransformOverlayStateType
 {
     /// <summary>
-    /// The overlay was properly moved via mouse
+    /// The overlay was moved via mouse
     /// </summary>
     Move,
 

+ 11 - 0
src/PixiEditor/ViewModels/SubViewModels/Main/SelectionViewModel.cs

@@ -1,4 +1,5 @@
 using System.Windows.Input;
+using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Models.Commands.Attributes.Commands;
 
 namespace PixiEditor.ViewModels.SubViewModels.Main;
@@ -40,4 +41,14 @@ internal class SelectionViewModel : SubViewModel<ViewModelMain>
     {
         Owner.DocumentManagerSubViewModel.ActiveDocument?.Operations.TransformSelectedArea(false);
     }
+
+    [Command.Basic("PixiEditor.Selection.NudgeSelectedObjectLeft", "Nudge selected object left", "Nudge selected object left", Key = Key.Left, Parameter = new int[] { -1, 0 }, IconPath = "E76B", IconEvaluator = "PixiEditor.FontIcon")]
+    [Command.Basic("PixiEditor.Selection.NudgeSelectedObjectRight", "Nudge selected object right", "Nudge selected object right", Key = Key.Right, Parameter = new int[] { 1, 0 }, IconPath = "E76C", IconEvaluator = "PixiEditor.FontIcon")]
+    [Command.Basic("PixiEditor.Selection.NudgeSelectedObjectUp", "Nudge selected object up", "Nudge selected object up", Key = Key.Up, Parameter = new int[] { 0, -1 }, IconPath = "E70E", IconEvaluator = "PixiEditor.FontIcon")]
+    [Command.Basic("PixiEditor.Selection.NudgeSelectedObjectDown", "Nudge selected object down", "Nudge selected object down", Key = Key.Down, Parameter = new int[] { 0, 1 }, IconPath = "E70D", IconEvaluator = "PixiEditor.FontIcon")]
+    public void NudgeSelectedObject(int[] dist)
+    {
+        VecI distance = new(dist[0], dist[1]);
+        Owner.DocumentManagerSubViewModel.ActiveDocument?.Operations.NudgeSelectedObject(distance);
+    }
 }