Browse Source

Transform overlay rotation snapping

Equbuxu 3 years ago
parent
commit
b49957ea5a

+ 18 - 36
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentTransformViewModel.cs

@@ -1,76 +1,58 @@
-using System.ComponentModel;
-using ChunkyImageLib.DataHolders;
+using ChunkyImageLib.DataHolders;
 using PixiEditor.Models.Enums;
 using PixiEditor.Views.UserControls.TransformOverlay;
 
 namespace PixiEditor.ViewModels.SubViewModels.Document;
 #nullable enable
-internal class DocumentTransformViewModel : INotifyPropertyChanged
+internal class DocumentTransformViewModel : NotifyableObject
 {
     private TransformState internalState;
     public TransformState InternalState
     {
         get => internalState;
-        set
-        {
-            internalState = value;
-            PropertyChanged?.Invoke(this, new(nameof(InternalState)));
-        }
+        set => SetProperty(ref internalState, value);
     }
 
     private TransformCornerFreedom cornerFreedom;
     public TransformCornerFreedom CornerFreedom
     {
         get => cornerFreedom;
-        set
-        {
-            cornerFreedom = value;
-            PropertyChanged?.Invoke(this, new(nameof(CornerFreedom)));
-        }
+        set => SetProperty(ref cornerFreedom, value);
     }
 
     private TransformSideFreedom sideFreedom;
     public TransformSideFreedom SideFreedom
     {
         get => sideFreedom;
-        set
-        {
-            sideFreedom = value;
-            PropertyChanged?.Invoke(this, new(nameof(SideFreedom)));
-        }
+        set => SetProperty(ref sideFreedom, value);
     }
 
     private bool lockRotation;
     public bool LockRotation
     {
         get => lockRotation;
-        set
-        {
-            lockRotation = value;
-            PropertyChanged?.Invoke(this, new(nameof(LockRotation)));
-        }
+        set => SetProperty(ref lockRotation, value);
+    }
+
+    private bool snapToAngles;
+    public bool SnapToAngles
+    {
+        get => snapToAngles;
+        set => SetProperty(ref snapToAngles, value);
     }
 
     private bool transformActive;
     public bool TransformActive
     {
         get => transformActive;
-        set
-        {
-            transformActive = value;
-            PropertyChanged?.Invoke(this, new(nameof(TransformActive)));
-        }
+        set => SetProperty(ref transformActive, value);
     }
 
     private ShapeCorners requestedCorners;
     public ShapeCorners RequestedCorners
     {
         get => requestedCorners;
-        set
-        {
-            requestedCorners = value;
-            PropertyChanged?.Invoke(this, new(nameof(RequestedCorners)));
-        }
+        set => SetProperty(ref requestedCorners, value);
     }
 
     private ShapeCorners corners;
@@ -79,12 +61,11 @@ internal class DocumentTransformViewModel : INotifyPropertyChanged
         get => corners;
         set
         {
-            corners = value;
-            PropertyChanged?.Invoke(this, new(nameof(Corners)));
+            SetProperty(ref corners, value);
             TransformMoved?.Invoke(this, value);
         }
     }
-    public event PropertyChangedEventHandler? PropertyChanged;
+
     public event EventHandler<ShapeCorners>? TransformMoved;
 
     private DocumentTransformMode activeTransformMode = DocumentTransformMode.Rotation;
@@ -109,6 +90,7 @@ internal class DocumentTransformViewModel : INotifyPropertyChanged
         var requestedCornerFreedom = TransformCornerFreedom.Scale;
         var requestedSideFreedom = TransformSideFreedom.Stretch;
 
+        SnapToAngles = isShiftDown;
         if (isShiftDown)
         {
             requestedCornerFreedom = TransformCornerFreedom.ScaleProportionally;

+ 2 - 1
src/PixiEditor/Views/UserControls/TransformOverlay/TransformOverlay.cs

@@ -233,7 +233,8 @@ internal class TransformOverlay : Decorator
     private bool ShouldRotate(VecD mousePos)
     {
         if (Corners.IsPointInside(mousePos) ||
-            TransformHelper.GetAnchorInPosition(mousePos, Corners, InternalState.Origin, ZoomboxScale) is not null)
+            TransformHelper.GetAnchorInPosition(mousePos, Corners, InternalState.Origin, ZoomboxScale) is not null ||
+            TransformHelper.IsWithinTransformHandle(TransformHelper.GetDragHandlePos(Corners, ZoomboxScale), mousePos, ZoomboxScale))
             return false;
         return TransformHelper.GetAnchorInPosition(mousePos, Corners, InternalState.Origin, ZoomboxScale, 15) is not null;
     }

+ 1 - 0
src/PixiEditor/Views/UserControls/Viewport.xaml

@@ -129,6 +129,7 @@
                         CornerFreedom="{Binding Document.TransformViewModel.CornerFreedom}"
                         SideFreedom="{Binding Document.TransformViewModel.SideFreedom}"
                         LockRotation="{Binding Document.TransformViewModel.LockRotation}"
+                        SnapToAngles="{Binding Document.TransformViewModel.SnapToAngles}"
                         InternalState="{Binding Document.TransformViewModel.InternalState, Mode=TwoWay}"
                         ZoomboxScale="{Binding Zoombox.Scale}"/>
                     <Grid IsHitTestVisible="False" SnapsToDevicePixels="True"