From 8d6c2213ad2b8f9c2fb88b26c3a7c632f35ba0b9 Mon Sep 17 00:00:00 2001 From: Marco Wende Date: Wed, 22 Jul 2026 07:39:56 +0200 Subject: [PATCH] Fix arrows not drawing when dragged left or upward CGRect.maxX/maxY standardize to positive values, collapsing the arrow endpoint onto the start point for negative width/height. Use origin + size instead to preserve direction. Co-Authored-By: Claude Opus 4.6 --- Sources/Editor/AnnotationCanvasView.swift | 3 ++- Sources/Editor/AnnotationRenderer.swift | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Sources/Editor/AnnotationCanvasView.swift b/Sources/Editor/AnnotationCanvasView.swift index 476d661..71e7d3a 100644 --- a/Sources/Editor/AnnotationCanvasView.swift +++ b/Sources/Editor/AnnotationCanvasView.swift @@ -108,7 +108,8 @@ final class AnnotationCanvasView: NSView { let handleRect: CGRect if item.kind == .arrow { let start = item.rect.origin - let end = CGPoint(x: item.rect.maxX, y: item.rect.maxY) + let end = CGPoint(x: item.rect.origin.x + item.rect.size.width, + y: item.rect.origin.y + item.rect.size.height) handleRect = CGRect(x: min(start.x, end.x), y: min(start.y, end.y), width: abs(end.x - start.x), height: abs(end.y - start.y)) } else if item.kind == .text { diff --git a/Sources/Editor/AnnotationRenderer.swift b/Sources/Editor/AnnotationRenderer.swift index 977850d..ccb0b03 100644 --- a/Sources/Editor/AnnotationRenderer.swift +++ b/Sources/Editor/AnnotationRenderer.swift @@ -48,7 +48,8 @@ enum AnnotationRenderer { private static func drawArrow(_ item: AnnotationItem, in context: CGContext) { let start = item.rect.origin - let end = CGPoint(x: item.rect.maxX, y: item.rect.maxY) + let end = CGPoint(x: item.rect.origin.x + item.rect.size.width, + y: item.rect.origin.y + item.rect.size.height) context.move(to: start) context.addLine(to: end) @@ -98,9 +99,11 @@ enum AnnotationRenderer { static func hitTest(point: CGPoint, item: AnnotationItem, tolerance: CGFloat = 6) -> Bool { switch item.kind { case .arrow: + let arrowEnd = CGPoint(x: item.rect.origin.x + item.rect.size.width, + y: item.rect.origin.y + item.rect.size.height) return distanceToLine(point: point, from: item.rect.origin, - to: CGPoint(x: item.rect.maxX, y: item.rect.maxY)) < tolerance + item.lineWidth + to: arrowEnd) < tolerance + item.lineWidth case .rectangle: let outer = item.rect.insetBy(dx: -(tolerance + item.lineWidth), dy: -(tolerance + item.lineWidth))