فهرست منبع

Universal rounding and clamping

CPKreuz 2 سال پیش
والد
کامیت
26cc575650

+ 2 - 9
src/PixiEditor/Models/DataHolders/Guides/DirectionalGuide.cs

@@ -126,16 +126,9 @@ internal class DirectionalGuide : Guide
 
         var renderer = (GuideRenderer)sender;
         var position = e.GetPosition(renderer);
+        var size = Document.SizeBindable;
 
-        var offset = IsVertical ? position.X : position.Y;
-        if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
-        {
-            Offset = Math.Round(offset, MidpointRounding.AwayFromZero);
-        }
-        else
-        {
-            Offset = Math.Round(offset * 2, MidpointRounding.AwayFromZero) / 2;
-        }
+        Offset = RoundModAndClamp(IsVertical ? position.X : position.Y, IsVertical ? size.X : size.Y);
     }
 
     private void Renderer_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

+ 2 - 2
src/PixiEditor/Models/DataHolders/Guides/GridGuide.cs

@@ -191,8 +191,8 @@ internal class GridGuide : Guide
         e.Handled = true;
         var point = e.GetPosition(renderer);
 
-        VerticalOffset = Math.Round(point.X);
-        HorizontalOffset = Math.Round(point.Y);
+        VerticalOffset = RoundModAndClamp(point.X, document.SizeBindable.X);
+        HorizontalOffset = RoundModAndClamp(point.Y, document.SizeBindable.X);
     }
 
     private void RendererOnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)

+ 18 - 0
src/PixiEditor/Models/DataHolders/Guides/Guide.cs

@@ -1,4 +1,5 @@
 using System.Windows.Controls;
+using System.Windows.Input;
 using System.Windows.Media;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.ViewModels.SubViewModels.Document;
@@ -107,5 +108,22 @@ namespace PixiEditor.Models.DataHolders.Guides
                 renderer.InvalidateVisual();
             }
         }
+        
+        protected double RoundMod(double value)
+        {
+            if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.LeftShift))
+            {
+                return Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2;
+            }
+
+            if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.LeftAlt))
+            {
+                return value;
+            }
+
+            return Math.Round(value);
+        }
+
+        protected double RoundModAndClamp(double value, double max) => Math.Clamp(RoundMod(value), 0, max);
     }
 }

+ 3 - 10
src/PixiEditor/Models/DataHolders/Guides/LineGuide.cs

@@ -233,16 +233,9 @@ namespace PixiEditor.Models.DataHolders.Guides
 
             if (isMoving.Value)
             {
-                if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
-                {
-                    X = Math.Round(x, MidpointRounding.AwayFromZero);
-                    Y = Math.Round(y, MidpointRounding.AwayFromZero);
-                }
-                else
-                {
-                    X = Math.Round(x * 2, MidpointRounding.AwayFromZero) / 2;
-                    Y = Math.Round(y * 2, MidpointRounding.AwayFromZero) / 2;
-                }
+                var size = Document.SizeBindable;
+                X = RoundModAndClamp(x, size.X);
+                Y = RoundModAndClamp(y, size.Y);
             }
             else
             {

+ 0 - 14
src/PixiEditor/Models/DataHolders/Guides/RectangleGuide.cs

@@ -314,20 +314,6 @@ internal class RectangleGuide : Guide
         return (GrabbedPoint)index;
     }
 
-    private double RoundMod(double value)
-    {
-        if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
-        {
-            return Math.Round(value);
-        }
-        else if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
-        {
-            return value;
-        }
-
-        return Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2;
-    }
-
     enum GrabbedPoint
     {
         TopLeft,