Browse Source

Added enable disable snapping

flabbet 10 months ago
parent
commit
571f679cc7

+ 2 - 0
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml

@@ -131,6 +131,8 @@
             <system:String x:Key="icon-swatches">&#xE982;</system:String>
             <system:String x:Key="icon-nodes">&#xe984;</system:String>
             <system:String x:Key="icon-onion">&#xe985;</system:String>
+            
+            <system:String x:Key="icon-snapping">&#xfffd;</system:String>
         </ResourceDictionary>
     </Styles.Resources>
     

+ 49 - 0
src/PixiEditor/Models/Controllers/InputDevice/SnappingController.cs

@@ -9,6 +9,7 @@ public class SnappingController
     private string highlightedXAxis = string.Empty;
     private string highlightedYAxis = string.Empty;
     private VecD? highlightedPoint = null;
+    private bool snappingEnabled = true;
 
     /// <summary>
     ///     Minimum distance that object has to be from snap point to snap to it. Expressed in pixels.
@@ -48,6 +49,21 @@ public class SnappingController
         }
     }
 
+    public bool SnappingEnabled
+    {
+        get => snappingEnabled;
+        set
+        {
+            snappingEnabled = value;
+            if (!value)
+            {
+                HighlightedXAxis = string.Empty;
+                HighlightedYAxis = string.Empty;
+                HighlightedPoint = null;
+            }
+        }
+    }
+
     public event Action<string> HorizontalHighlightChanged;
     public event Action<string> VerticalHighlightChanged;
     public event Action<VecD?> HighlightedPointChanged;
@@ -55,6 +71,12 @@ public class SnappingController
 
     public double? SnapToHorizontal(double xPos, out string snapAxis)
     {
+        if (!SnappingEnabled)
+        {
+            snapAxis = string.Empty;
+            return null;
+        }
+        
         if (HorizontalSnapPoints.Count == 0)
         {
             snapAxis = string.Empty;
@@ -83,6 +105,12 @@ public class SnappingController
 
     public double? SnapToVertical(double yPos, out string snapAxisKey)
     {
+        if (!SnappingEnabled)
+        {
+            snapAxisKey = string.Empty;
+            return null;
+        }
+        
         if (VerticalSnapPoints.Count == 0)
         {
             snapAxisKey = string.Empty;
@@ -149,6 +177,13 @@ public class SnappingController
 
     public VecD GetSnapDeltaForPoints(VecD[] points, out string xAxis, out string yAxis)
     {
+        if (!SnappingEnabled)
+        {
+            xAxis = string.Empty;
+            yAxis = string.Empty;
+            return VecD.Zero;
+        }
+        
         bool hasXSnap = false;
         bool hasYSnap = false;
         VecD snapDelta = VecD.Zero;
@@ -189,6 +224,13 @@ public class SnappingController
 
     public VecD GetSnapPoint(VecD pos, out string xAxis, out string yAxis)
     {
+        if (!SnappingEnabled)
+        {
+            xAxis = string.Empty;
+            yAxis = string.Empty;
+            return pos;
+        }
+        
         double? snapX = SnapToHorizontal(pos.X, out string snapAxisX);
         double? snapY = SnapToVertical(pos.Y, out string snapAxisY);
 
@@ -200,6 +242,13 @@ public class SnappingController
 
     public VecD GetSnapDeltaForPoint(VecD pos, out string xAxis, out string yAxis)
     {
+        if (!SnappingEnabled)
+        {
+            xAxis = string.Empty;
+            yAxis = string.Empty;
+            return VecD.Zero;
+        }
+        
         double? snapX = SnapToHorizontal(pos.X, out string snapAxisX);
         double? snapY = SnapToVertical(pos.Y, out string snapAxisY);
 

+ 11 - 0
src/PixiEditor/ViewModels/Document/SnappingViewModel.cs

@@ -7,8 +7,19 @@ namespace PixiEditor.ViewModels.Document;
 
 public class SnappingViewModel : PixiObservableObject, ISnappingHandler
 {
+    private bool snappingEnabled = true;
     public SnappingController SnappingController { get; } = new SnappingController();
 
+    public bool SnappingEnabled
+    {
+        get => snappingEnabled;
+        set
+        {
+            SetProperty(ref snappingEnabled, value);
+            SnappingController.SnappingEnabled = value;
+        }
+    }
+
     public SnappingViewModel()
     {
         SnappingController.AddXYAxis("Root", VecD.Zero);

+ 1 - 1
src/PixiEditor/Views/Dock/DocumentTemplate.axaml

@@ -34,7 +34,7 @@
         FlipX="{Binding FlipX, Mode=TwoWay}"
         FlipY="{Binding FlipY, Mode=TwoWay}"
         Channels="{Binding Channels, Mode=TwoWay}"
-        SnappingController="{Binding ActiveDocument.SnappingViewModel.SnappingController, Source={viewModels1:MainVM DocumentManagerSVM}}"
+        SnappingViewModel="{Binding ActiveDocument.SnappingViewModel, Source={viewModels1:MainVM DocumentManagerSVM}}"
         ContextRequested="Viewport_OnContextMenuOpening"
         Document="{Binding Document}">
         <viewportControls:Viewport.ContextFlyout>

+ 5 - 0
src/PixiEditor/Views/Main/ViewportControls/Viewport.axaml

@@ -107,6 +107,11 @@
                                           Content="{DynamicResource icon-x-flip}"
                                           Cursor="Hand" />
                         </StackPanel>
+                        <Separator/>
+                        <ToggleButton Margin="10 0 0 0" Width="32" Height="32"
+                                      ui:Translator.TooltipKey="TOGGLE_SNAPPING" Classes="OverlayToggleButton pixi-icon"
+                                      Content="{DynamicResource icon-snapping}"
+                                      IsChecked="{Binding SnappingViewModel.SnappingEnabled, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=viewportControls:Viewport}, Mode=TwoWay}"/>
                     </StackPanel>
                 </Border>
             </overlays:TogglableFlyout.Child>

+ 6 - 6
src/PixiEditor/Views/Main/ViewportControls/Viewport.axaml.cs

@@ -93,13 +93,13 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
     public static readonly StyledProperty<bool> IsOverCanvasProperty = AvaloniaProperty.Register<Viewport, bool>(
         "IsOverCanvas");
 
-    public static readonly StyledProperty<SnappingController> SnappingControllerProperty = AvaloniaProperty.Register<Viewport, SnappingController>(
-        nameof(SnappingController));
+    public static readonly StyledProperty<SnappingViewModel> SnappingViewModelProperty = AvaloniaProperty.Register<Viewport, SnappingViewModel>(
+        nameof(SnappingViewModel));
 
-    public SnappingController SnappingController
+    public SnappingViewModel SnappingViewModel
     {
-        get => GetValue(SnappingControllerProperty);
-        set => SetValue(SnappingControllerProperty, value);
+        get => GetValue(SnappingViewModelProperty);
+        set => SetValue(SnappingViewModelProperty, value);
     }
 
     public bool IsOverCanvas
@@ -331,7 +331,7 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
 
     private void OnScaleChanged(double newScale)
     {
-        SnappingController.SnapDistance = SnappingController.DefaultSnapDistance / newScale;
+        SnappingViewModel.SnappingController.SnapDistance = SnappingController.DefaultSnapDistance / newScale;
     }
 
     private void OnAttachedToVisualTree(object? sender, VisualTreeAttachmentEventArgs e)

+ 3 - 13
src/PixiEditor/Views/Overlays/TransformOverlay/TransformOverlay.cs

@@ -115,16 +115,6 @@ internal class TransformOverlay : Overlay
         set => SetValue(ActionCompletedProperty, value);
     }
 
-    public static readonly StyledProperty<bool> SnappingEnabledProperty =
-        AvaloniaProperty.Register<TransformOverlay, bool>(
-            nameof(SnappingEnabled), defaultValue: true);
-
-    public bool SnappingEnabled
-    {
-        get => GetValue(SnappingEnabledProperty);
-        set => SetValue(SnappingEnabledProperty, value);
-    }
-
     public static readonly StyledProperty<SnappingController> SnappingControllerProperty =
         AvaloniaProperty.Register<TransformOverlay, SnappingController>(
             nameof(SnappingController));
@@ -523,7 +513,7 @@ internal class TransformOverlay : Overlay
 
     private SnapData TrySnapCorners(ShapeCorners rawCorners)
     {
-        if (!SnappingEnabled || SnappingController is null)
+        if (SnappingController is null)
         {
             return new SnapData();
         }
@@ -721,7 +711,7 @@ internal class TransformOverlay : Overlay
     // https://www.desmos.com/calculator/drdxuriovg
     private SnapData TrySnapAnchorAlongLine(VecD anchor, VecD origin)
     {
-        if (!SnappingEnabled || SnappingController is null)
+        if (SnappingController is null)
         {
             return new SnapData();
         }
@@ -779,7 +769,7 @@ internal class TransformOverlay : Overlay
 
     private SnapData TrySnapAnchor(VecD anchorPos)
     {
-        if (!SnappingEnabled || SnappingController is null)
+        if (SnappingController is null)
         {
             return new SnapData();
         }