Browse Source

Improved rotation transform hitbox when zoomed and cursors

flabbet 8 months ago
parent
commit
cb4a676322

+ 12 - 1
src/PixiEditor/Views/Overlays/TransformOverlay/TransformOverlay.cs

@@ -579,7 +579,18 @@ internal class TransformOverlay : Overlay
 
 
     public override bool TestHit(VecD point)
     public override bool TestHit(VecD point)
     {
     {
-        return base.TestHit(point) || Corners.AsScaled(1.25f).IsPointInside(point);
+        const double offsetInPixels = 30;
+        double offsetToScale = offsetInPixels / ZoomScale;
+        ShapeCorners scaled = Corners;
+        ShapeCorners scaledCorners = new ShapeCorners()
+        {
+            BottomLeft = scaled.BottomLeft - new VecD(offsetToScale, -offsetToScale),
+            BottomRight = scaled.BottomRight + new VecD(offsetToScale, offsetToScale),
+            TopLeft = scaled.TopLeft - new VecD(offsetToScale, offsetToScale),
+            TopRight = scaled.TopRight - new VecD(-offsetToScale, offsetToScale),
+        };
+        
+        return base.TestHit(point) || scaledCorners.IsPointInside(point);
     }
     }
 
 
     private void OnMoveHandleReleased(Handle obj, OverlayPointerArgs args)
     private void OnMoveHandleReleased(Handle obj, OverlayPointerArgs args)

+ 16 - 11
src/PixiEditor/Views/Rendering/Scene.cs

@@ -317,11 +317,15 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
         {
         {
             OverlayPointerArgs args = ConstructPointerArgs(e);
             OverlayPointerArgs args = ConstructPointerArgs(e);
 
 
-            Cursor = DefaultCursor;
-            
+            Cursor finalCursor = DefaultCursor;
+
             if (capturedOverlay != null)
             if (capturedOverlay != null)
             {
             {
                 capturedOverlay.MovePointer(args);
                 capturedOverlay.MovePointer(args);
+                if (capturedOverlay.IsHitTestVisible)
+                {
+                    finalCursor = capturedOverlay.Cursor ?? DefaultCursor;
+                }
             }
             }
             else
             else
             {
             {
@@ -352,11 +356,12 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
                     overlay.MovePointer(args);
                     overlay.MovePointer(args);
                     if (overlay.IsHitTestVisible)
                     if (overlay.IsHitTestVisible)
                     {
                     {
-                        Cursor = overlay.Cursor ?? DefaultCursor;
+                        finalCursor = overlay.Cursor ?? DefaultCursor;
                     }
                     }
                 }
                 }
             }
             }
 
 
+            Cursor = finalCursor;
             e.Handled = args.Handled;
             e.Handled = args.Handled;
         }
         }
     }
     }
@@ -377,9 +382,9 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
                 {
                 {
                     if (args.Handled) break;
                     if (args.Handled) break;
                     if (!overlay.IsVisible) continue;
                     if (!overlay.IsVisible) continue;
-                    
-                    if(!overlay.IsHitTestVisible || !overlay.TestHit(args.Point)) continue;
-                    
+
+                    if (!overlay.IsHitTestVisible || !overlay.TestHit(args.Point)) continue;
+
                     overlay.PressPointer(args);
                     overlay.PressPointer(args);
                 }
                 }
             }
             }
@@ -428,8 +433,8 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
                     if (args.Handled) break;
                     if (args.Handled) break;
                     if (!overlay.IsVisible) continue;
                     if (!overlay.IsVisible) continue;
 
 
-                    if(!overlay.IsHitTestVisible || !overlay.TestHit(args.Point)) continue;
-                    
+                    if (!overlay.IsHitTestVisible || !overlay.TestHit(args.Point)) continue;
+
                     overlay.ReleasePointer(args);
                     overlay.ReleasePointer(args);
                 }
                 }
             }
             }
@@ -583,7 +588,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
         resources = null;
         resources = null;
     }
     }
 
 
-    protected  void RenderFrame(PixelSize size)
+    protected void RenderFrame(PixelSize size)
     {
     {
         if (resources != null)
         if (resources != null)
         {
         {
@@ -626,7 +631,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
             foreach (Overlay overlay in AllOverlays)
             foreach (Overlay overlay in AllOverlays)
             {
             {
                 if (!overlay.IsVisible) continue;
                 if (!overlay.IsVisible) continue;
-                
+
                 if (overlay.IsHitTestVisible)
                 if (overlay.IsHitTestVisible)
                 {
                 {
                     Cursor = overlay.Cursor ?? DefaultCursor;
                     Cursor = overlay.Cursor ?? DefaultCursor;
@@ -634,7 +639,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
             }
             }
         }
         }
     }
     }
-    
+
     private void QueueRender()
     private void QueueRender()
     {
     {
         Dispatcher.UIThread.Post(InvalidateVisual, DispatcherPriority.Render);
         Dispatcher.UIThread.Post(InvalidateVisual, DispatcherPriority.Render);