Browse Source

Fixed transform overlay stuck TL anchor at 0,0

Krzysztof Krysiński 4 months ago
parent
commit
e133d8284a

+ 1 - 1
src/PixiEditor/Views/Overlays/Handles/AnchorHandle.cs

@@ -14,7 +14,7 @@ public class AnchorHandle : RectangleHandle
     private Paint selectedPaint;
     private Paint selectedPaint;
     
     
     public bool IsSelected { get; set; } = false;
     public bool IsSelected { get; set; } = false;
-    
+
     public AnchorHandle(Overlay owner) : base(owner)
     public AnchorHandle(Overlay owner) : base(owner)
     {
     {
         Size = new VecD(GetResource<double>("AnchorHandleSize"));
         Size = new VecD(GetResource<double>("AnchorHandleSize"));

+ 1 - 0
src/PixiEditor/Views/Overlays/Handles/Handle.cs

@@ -22,6 +22,7 @@ public delegate void HandleEvent(Handle source, OverlayPointerArgs args);
 
 
 public abstract class Handle : IHandle
 public abstract class Handle : IHandle
 {
 {
+    public string Name { get; set; }
     public Paint? FillPaint { get; set; } = GetPaint("HandleBackgroundBrush");
     public Paint? FillPaint { get; set; } = GetPaint("HandleBackgroundBrush");
     public Paint? StrokePaint { get; set; } = GetPaint("HandleBrush", PaintStyle.Stroke);
     public Paint? StrokePaint { get; set; } = GetPaint("HandleBrush", PaintStyle.Stroke);
     public double ZoomScale { get; set; } = 1.0;
     public double ZoomScale { get; set; } = 1.0;

+ 24 - 17
src/PixiEditor/Views/Overlays/TransformOverlay/TransformOverlay.cs

@@ -162,8 +162,9 @@ internal class TransformOverlay : Overlay
         set => SetValue(ScaleFromCenterProperty, value);
         set => SetValue(ScaleFromCenterProperty, value);
     }
     }
 
 
-    public static readonly StyledProperty<bool> CanAlignToPixelsProperty = AvaloniaProperty.Register<TransformOverlay, bool>(
-        nameof(CanAlignToPixels), defaultValue: true);
+    public static readonly StyledProperty<bool> CanAlignToPixelsProperty =
+        AvaloniaProperty.Register<TransformOverlay, bool>(
+            nameof(CanAlignToPixels), defaultValue: true);
 
 
     public bool CanAlignToPixels
     public bool CanAlignToPixels
     {
     {
@@ -180,15 +181,16 @@ internal class TransformOverlay : Overlay
         set => SetValue(LockShearProperty, value);
         set => SetValue(LockShearProperty, value);
     }
     }
 
 
-    public static readonly StyledProperty<ICommand> TransformDraggedCommandProperty = AvaloniaProperty.Register<TransformOverlay, ICommand>(
-        nameof(TransformDraggedCommand));
+    public static readonly StyledProperty<ICommand> TransformDraggedCommandProperty =
+        AvaloniaProperty.Register<TransformOverlay, ICommand>(
+            nameof(TransformDraggedCommand));
 
 
     public ICommand TransformDraggedCommand
     public ICommand TransformDraggedCommand
     {
     {
         get => GetValue(TransformDraggedCommandProperty);
         get => GetValue(TransformDraggedCommandProperty);
         set => SetValue(TransformDraggedCommandProperty, value);
         set => SetValue(TransformDraggedCommandProperty, value);
     }
     }
-    
+
     static TransformOverlay()
     static TransformOverlay()
     {
     {
         AffectsRender<TransformOverlay>(CornersProperty, ZoomScaleProperty, SideFreedomProperty, CornerFreedomProperty,
         AffectsRender<TransformOverlay>(CornersProperty, ZoomScaleProperty, SideFreedomProperty, CornerFreedomProperty,
@@ -299,6 +301,7 @@ internal class TransformOverlay : Overlay
     public TransformOverlay()
     public TransformOverlay()
     {
     {
         topLeftHandle = new AnchorHandle(this);
         topLeftHandle = new AnchorHandle(this);
+        topLeftHandle.Name = "TL";
         topRightHandle = new AnchorHandle(this);
         topRightHandle = new AnchorHandle(this);
         bottomLeftHandle = new AnchorHandle(this);
         bottomLeftHandle = new AnchorHandle(this);
         bottomRightHandle = new AnchorHandle(this);
         bottomRightHandle = new AnchorHandle(this);
@@ -310,6 +313,7 @@ internal class TransformOverlay : Overlay
         moveHandle.StrokePaint = handlePen;
         moveHandle.StrokePaint = handlePen;
         centerHandle = new RectangleHandle(this);
         centerHandle = new RectangleHandle(this);
         centerHandle.Size = rightHandle.Size;
         centerHandle.Size = rightHandle.Size;
+        centerHandle.HitTestVisible = false;
 
 
         originHandle = new(this) { StrokePaint = blackFreqDashedPen, SecondaryHandlePen = whiteFreqDashedPen, };
         originHandle = new(this) { StrokePaint = blackFreqDashedPen, SecondaryHandlePen = whiteFreqDashedPen, };
 
 
@@ -414,6 +418,7 @@ internal class TransformOverlay : Overlay
         if (ShowHandles)
         if (ShowHandles)
         {
         {
             centerHandle.Position = VecD.Zero;
             centerHandle.Position = VecD.Zero;
+            centerHandle.HitTestVisible = capturedAnchor == Anchor.Origin;
             topLeftHandle.Position = topLeft;
             topLeftHandle.Position = topLeft;
             topRightHandle.Position = topRight;
             topRightHandle.Position = topRight;
             bottomLeftHandle.Position = bottomLeft;
             bottomLeftHandle.Position = bottomLeft;
@@ -457,25 +462,27 @@ internal class TransformOverlay : Overlay
             context.DrawPath(rotateCursorGeometry, whiteFillPen);
             context.DrawPath(rotateCursorGeometry, whiteFillPen);
             context.DrawPath(rotateCursorGeometry, cursorBorderPaint);
             context.DrawPath(rotateCursorGeometry, cursorBorderPaint);
         }
         }
-        
+
         context.RestoreToCount(saved);
         context.RestoreToCount(saved);
-        
+
         saved = context.Save();
         saved = context.Save();
 
 
         if (ShowHandles && shearCursorActive)
         if (ShowHandles && shearCursorActive)
         {
         {
             var matrix = Matrix3X3.CreateTranslation((float)lastPointerPos.X, (float)lastPointerPos.Y);
             var matrix = Matrix3X3.CreateTranslation((float)lastPointerPos.X, (float)lastPointerPos.Y);
-            
+
             matrix = matrix.PostConcat(Matrix3X3.CreateTranslation(
             matrix = matrix.PostConcat(Matrix3X3.CreateTranslation(
                 (float)-shearCursorGeometry.VisualAABB.Center.X,
                 (float)-shearCursorGeometry.VisualAABB.Center.X,
                 (float)-shearCursorGeometry.VisualAABB.Center.Y));
                 (float)-shearCursorGeometry.VisualAABB.Center.Y));
-            
+
             matrix = matrix.PostConcat(Matrix3X3.CreateScale(
             matrix = matrix.PostConcat(Matrix3X3.CreateScale(
-                20 / zoomboxScale / (float)shearCursorGeometry.VisualAABB.Size.X, 20 / zoomboxScale / (float)shearCursorGeometry.VisualAABB.Size.Y,
+                20 / zoomboxScale / (float)shearCursorGeometry.VisualAABB.Size.X,
+                20 / zoomboxScale / (float)shearCursorGeometry.VisualAABB.Size.Y,
                 (float)lastPointerPos.X, (float)lastPointerPos.Y));
                 (float)lastPointerPos.X, (float)lastPointerPos.Y));
 
 
-            if(hoveredAnchor is Anchor.Right or Anchor.Left)
-                matrix = matrix.PostConcat(Matrix3X3.CreateRotationDegrees(90, (float)lastPointerPos.X, (float)lastPointerPos.Y));
+            if (hoveredAnchor is Anchor.Right or Anchor.Left)
+                matrix = matrix.PostConcat(Matrix3X3.CreateRotationDegrees(90, (float)lastPointerPos.X,
+                    (float)lastPointerPos.Y));
 
 
             context.SetMatrix(context.TotalMatrix.Concat(matrix));
             context.SetMatrix(context.TotalMatrix.Concat(matrix));
 
 
@@ -551,7 +558,7 @@ internal class TransformOverlay : Overlay
     {
     {
         if (args.PointerButton != MouseButton.Left)
         if (args.PointerButton != MouseButton.Left)
             return;
             return;
-        
+
         lastClickCount = args.ClickCount;
         lastClickCount = args.ClickCount;
 
 
         if (Handles.Any(x => x.IsWithinHandle(x.Position, args.Point, ZoomScale))) return;
         if (Handles.Any(x => x.IsWithinHandle(x.Position, args.Point, ZoomScale))) return;
@@ -716,12 +723,12 @@ internal class TransformOverlay : Overlay
 
 
     private bool CanShear(VecD mousePos, out Anchor side)
     private bool CanShear(VecD mousePos, out Anchor side)
     {
     {
-        if(LockShear)
+        if (LockShear)
         {
         {
             side = default;
             side = default;
             return false;
             return false;
         }
         }
-        
+
         double distance = 20 / ZoomScale;
         double distance = 20 / ZoomScale;
         var sides = new[] { Anchor.Top, Anchor.Bottom, Anchor.Left, Anchor.Right };
         var sides = new[] { Anchor.Top, Anchor.Bottom, Anchor.Left, Anchor.Right };
 
 
@@ -791,11 +798,11 @@ internal class TransformOverlay : Overlay
         SnappingController.HighlightedYAxis = snapDeltaResult.SnapAxisYName;
         SnappingController.HighlightedYAxis = snapDeltaResult.SnapAxisYName;
 
 
         VecD from = originOnStartMove;
         VecD from = originOnStartMove;
-        
+
         Corners = ApplyCornersWithDelta(cornersOnStartMove, delta, snapDelta);
         Corners = ApplyCornersWithDelta(cornersOnStartMove, delta, snapDelta);
 
 
         InternalState = InternalState with { Origin = originOnStartMove + delta + snapDelta };
         InternalState = InternalState with { Origin = originOnStartMove + delta + snapDelta };
-        
+
         VecD to = InternalState.Origin;
         VecD to = InternalState.Origin;
         TransformDraggedCommand?.Execute((from, to));
         TransformDraggedCommand?.Execute((from, to));
     }
     }