Quellcode durchsuchen

Fixed handles rendering bug

Krzysztof Krysiński vor 3 Wochen
Ursprung
Commit
0bf8ac828d

+ 1 - 1
src/PixiEditor.Extensions/UI/Overlays/IHandle.cs

@@ -10,6 +10,6 @@ public interface IHandle
     public Paint? StrokePaint { get; set; }
     public double ZoomScale { get; set; }
 
-    public void Draw(Canvas target);
+    protected void Draw(Canvas target);
     protected void OnPressed(OverlayPointerArgs args);
 }

+ 1 - 1
src/PixiEditor/Views/Overlays/BrushShapeOverlay/BrushShapeOverlay.cs

@@ -70,7 +70,7 @@ internal class BrushShapeOverlay : Overlay
         Refresh();
     }
 
-    public override void RenderOverlay(Canvas context, RectD canvasBounds) => Render(context);
+    protected override void OnRenderOverlay(Canvas context, RectD canvasBounds) => Render(context);
 
     public void Render(Canvas targetCanvas)
     {

+ 1 - 1
src/PixiEditor/Views/Overlays/GridLinesOverlay.cs

@@ -52,7 +52,7 @@ public class GridLinesOverlay : Overlay
         return visibilityConverter.Check(ZoomScale * Math.Min(GridXSize, GridYSize));
     }
 
-    public override void RenderOverlay(Canvas context, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas context, RectD canvasBounds)
     {
         // Draw lines in vertical and horizontal directions, size should be relative to the scale
 

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

@@ -24,13 +24,13 @@ public class AnchorHandle : RectangleHandle
         StrokePaint = paint;
     }
 
-    public override void Draw(Canvas context)
+    protected override void OnDraw(Canvas context)
     {
         paint.StrokeWidth = (float)(1.0 / ZoomScale);
         selectedPaint.StrokeWidth = (float)(2.5 / ZoomScale);
         
         StrokePaint = IsSelected ? selectedPaint : paint;
         StrokePaint.Style = PaintStyle.Stroke;
-        base.Draw(context);
+        base.OnDraw(context);
     }
 }

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

@@ -17,7 +17,7 @@ public class ControlPointHandle : Handle
         Size = new VecD(GetResource<double>("AnchorHandleSize"));
     }
 
-    public override void Draw(Canvas target)
+    protected override void OnDraw(Canvas target)
     {
         float radius = (float)(Size.X / 2);
         radius /= (float)ZoomScale;

+ 14 - 2
src/PixiEditor/Views/Overlays/Handles/Handle.cs

@@ -47,6 +47,7 @@ public abstract class Handle : IHandle
     private bool isPressed;
     private bool isHovered;
     private bool moved;
+    private bool isRendered;
 
     public Handle(IOverlay owner)
     {
@@ -57,13 +58,19 @@ public abstract class Handle : IHandle
             : new VecD(16);
     }
 
-    public abstract void Draw(Canvas target);
+    public void Draw(Canvas target)
+    {
+        isRendered = true;
+        OnDraw(target);
+    }
+
+    protected abstract void OnDraw(Canvas target);
 
     public virtual void OnPressed(OverlayPointerArgs args) { }
 
     public virtual bool IsWithinHandle(VecD handlePos, VecD pos, double zoomboxScale)
     {
-        return TransformHelper.IsWithinHandle(handlePos, pos, zoomboxScale, Size + HitSizeMargin);
+        return TransformHelper.IsWithinHandle(handlePos, pos, zoomboxScale, Size + HitSizeMargin) && isRendered;
     }
 
     public static T? GetResource<T>(string key)
@@ -205,4 +212,9 @@ public abstract class Handle : IHandle
             args.Handled = true;
         }
     }
+
+    public void ResetIsRendered()
+    {
+        isRendered = false;
+    }
 }

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

@@ -18,7 +18,7 @@ public class OriginAnchor : Handle
 
     }
 
-    public override void Draw(Canvas context)
+    protected override void OnDraw(Canvas context)
     {
         double radius = Size.LongestAxis / ZoomScale / 2;
         

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

@@ -14,7 +14,7 @@ public class RectangleHandle : Handle
     {
     }
 
-    public override void Draw(Canvas context)
+    protected override void OnDraw(Canvas context)
     {
         double scaleMultiplier = (1.0 / ZoomScale);
         double radius = AnchorRadius * scaleMultiplier;

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

@@ -28,7 +28,7 @@ public class TransformHandle : Handle
         Cursor = new Cursor(StandardCursorType.SizeAll);
     }
 
-    public override void Draw(Canvas context)
+    protected override void OnDraw(Canvas context)
     {
         double scaleMultiplier = (1.0 / ZoomScale);
         double radius = AnchorRadius * scaleMultiplier;

+ 1 - 1
src/PixiEditor/Views/Overlays/LineToolOverlay/LineToolOverlay.cs

@@ -182,7 +182,7 @@ internal class LineToolOverlay : Overlay
         blackPaint.StrokeWidth = 1 / (float)newZoom;
     }
 
-    public override void RenderOverlay(Canvas context, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas context, RectD canvasBounds)
     {
         VecD mappedStart = LineStart;
         VecD mappedEnd = LineEnd;

+ 9 - 1
src/PixiEditor/Views/Overlays/Overlay.cs

@@ -86,7 +86,15 @@ public abstract class Overlay : Decorator, IOverlay // TODO: Maybe make it not a
 
     public virtual bool CanRender() => true;
 
-    public abstract void RenderOverlay(Canvas context, RectD canvasBounds);
+    public void RenderOverlay(Canvas context, RectD canvasBounds)
+    {
+        foreach (var handle in Handles)
+        {
+            handle.ResetIsRendered();
+        }
+        OnRenderOverlay(context, canvasBounds);
+    }
+    protected abstract void OnRenderOverlay(Canvas context, RectD canvasBounds);
 
     public void Refresh()
     {

+ 6 - 5
src/PixiEditor/Views/Overlays/PathOverlay/VectorPathOverlay.cs

@@ -94,7 +94,7 @@ public class VectorPathOverlay : Overlay
         transformHandle.ZoomScale = newZoom;
     }
 
-    public override void RenderOverlay(Canvas context, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas context, RectD canvasBounds)
     {
         if (Path is null)
         {
@@ -105,7 +105,7 @@ public class VectorPathOverlay : Overlay
 
         RenderHandles(context);
 
-        if (canInsert)
+        if (canInsert && CapturedHandle == null)
         {
             insertPreviewHandle.Draw(context);
         }
@@ -148,9 +148,10 @@ public class VectorPathOverlay : Overlay
                 }
 
                 var handle = anchorHandles[anchorIndex];
-                var nextIndex = subPath.GetNextPoint(anchorIndex)?.Index ?? 0;
-                bool nextIsSelected = nextIndex < anchorHandles.Count &&
-                                      anchorHandles[nextIndex].IsSelected;
+                var nextLocalIndex = subPath.GetNextPoint(point.Index)?.Index ?? 0;
+                int nextGlobalIndex = editablePath.GetGlobalIndex(subPath, nextLocalIndex);
+                bool nextIsSelected = nextGlobalIndex < anchorHandles.Count &&
+                                      anchorHandles[nextGlobalIndex].IsSelected;
                 bool drawControl1 = handle.IsSelected;
                 bool drawControl2 = nextIsSelected;
 

+ 1 - 1
src/PixiEditor/Views/Overlays/ReferenceLayerOverlay.cs

@@ -79,7 +79,7 @@ internal class ReferenceLayerOverlay : Overlay
         FadeOutProperty.Changed.Subscribe(FadeOutChanged);
     }
 
-    public override void RenderOverlay(Canvas context, RectD dirtyCanvasBounds)
+    protected override void OnRenderOverlay(Canvas context, RectD dirtyCanvasBounds)
     {
         if (ReferenceLayer is { ReferenceTexture: not null })
         {

+ 1 - 1
src/PixiEditor/Views/Overlays/SelectionOverlay/SelectionOverlay.cs

@@ -114,7 +114,7 @@ internal class SelectionOverlay : Overlay
         }
     }
 
-    public override void RenderOverlay(Canvas context, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas context, RectD canvasBounds)
     {
         if (isAnimating)
         {

+ 1 - 1
src/PixiEditor/Views/Overlays/SnappingOverlay.cs

@@ -51,7 +51,7 @@ internal class SnappingOverlay : Overlay
         IsHitTestVisible = false;
     }
 
-    public override void RenderOverlay(Canvas context, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas context, RectD canvasBounds)
     {
         if (SnappingController is null || SuppressEvents)
         {

+ 1 - 1
src/PixiEditor/Views/Overlays/SymmetryOverlay/SymmetryOverlay.cs

@@ -115,7 +115,7 @@ internal class SymmetryOverlay : Overlay
         VerticalAxisXProperty.Changed.Subscribe(OnPositionUpdate);
     }
 
-    public override void RenderOverlay(Canvas drawingContext, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas drawingContext, RectD canvasBounds)
     {
         if (!HorizontalAxisVisible && !VerticalAxisVisible)
             return;

+ 1 - 1
src/PixiEditor/Views/Overlays/TextOverlay/TextOverlay.cs

@@ -215,7 +215,7 @@ internal class TextOverlay : Overlay
     }
 
 
-    public override void RenderOverlay(Canvas context, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas context, RectD canvasBounds)
     {
         if (!IsEditing) return;
 

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

@@ -360,7 +360,7 @@ internal class TransformOverlay : Overlay
 
     private VecD pos;
 
-    public override void RenderOverlay(Canvas drawingContext, RectD canvasBounds)
+    protected override void OnRenderOverlay(Canvas drawingContext, RectD canvasBounds)
     {
         DrawOverlay(drawingContext, canvasBounds.Size, Corners, InternalState.Origin, (float)ZoomScale);