From d60d1e7b16606b082c9883bd499ba5802de96954 Mon Sep 17 00:00:00 2001 From: Pascal Date: Fri, 19 Jun 2026 23:39:23 -0400 Subject: [PATCH] Refactor mouse location handling in ruler classes * Simplified mouse location updates in AppDelegate by removing unnecessary rounding. * Introduced dedicated methods in HorizontalRule and VerticalRule for rounding mouse coordinates, enhancing code clarity and maintainability. * Added unit tests to verify the rounding functionality for mouse coordinates in ruler classes. --- Free Ruler/AppDelegate.swift | 4 +--- Free Ruler/HorizontalRule.swift | 6 +++++- Free Ruler/VerticalRule.swift | 6 +++++- FreeRulerTests/RulerCoreTests.swift | 4 ++++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Free Ruler/AppDelegate.swift b/Free Ruler/AppDelegate.swift index 4918791..2199584 100644 --- a/Free Ruler/AppDelegate.swift +++ b/Free Ruler/AppDelegate.swift @@ -867,9 +867,7 @@ extension AppDelegate { } private func updateMouseLocation() { - var mouseLoc = NSEvent.mouseLocation - mouseLoc.x = mouseLoc.x.rounded() - mouseLoc.y = mouseLoc.y.rounded() + let mouseLoc = NSEvent.mouseLocation for controller in rulerManager.controllers where controller.isVisible { controller.drawMouseTick(at: mouseLoc) diff --git a/Free Ruler/HorizontalRule.swift b/Free Ruler/HorizontalRule.swift index 33d8576..161e523 100644 --- a/Free Ruler/HorizontalRule.swift +++ b/Free Ruler/HorizontalRule.swift @@ -120,7 +120,11 @@ class HorizontalRule: RuleView { let windowPoint = window.convertPoint(fromScreen: mouseLoc) let viewPoint = convert(windowPoint, from: nil) - mouseTickX = viewPoint.x + mouseTickX = mouseTickX(forLocalMouseX: viewPoint.x) + } + + func mouseTickX(forLocalMouseX localMouseX: CGFloat) -> CGFloat { + return localMouseX.rounded() } func drawMouseTick(_ mouseTickX: CGFloat) { diff --git a/Free Ruler/VerticalRule.swift b/Free Ruler/VerticalRule.swift index f395648..c2169c1 100644 --- a/Free Ruler/VerticalRule.swift +++ b/Free Ruler/VerticalRule.swift @@ -125,7 +125,11 @@ class VerticalRule: RuleView { let windowPoint = window.convertPoint(fromScreen: mouseLoc) let viewPoint = convert(windowPoint, from: nil) - mouseTickY = viewPoint.y + mouseTickY = mouseTickY(forLocalMouseY: viewPoint.y) + } + + func mouseTickY(forLocalMouseY localMouseY: CGFloat) -> CGFloat { + return localMouseY.rounded() } func drawMouseTick(_ mouseTickY: CGFloat) { diff --git a/FreeRulerTests/RulerCoreTests.swift b/FreeRulerTests/RulerCoreTests.swift index d2065a8..cb48e22 100644 --- a/FreeRulerTests/RulerCoreTests.swift +++ b/FreeRulerTests/RulerCoreTests.swift @@ -2033,6 +2033,8 @@ final class RulerCoreTests: XCTestCase { rule.mouseTickLineX(forTickX: 299, growthDirection: .negative), 299 ) + XCTAssertEqual(rule.mouseTickX(forLocalMouseX: 50.49), 50) + XCTAssertEqual(rule.mouseTickX(forLocalMouseX: 50.5), 51) let bottomTick = rule.tickLine(forX: 50, length: 10, rulerHeight: 40, tickSide: .bottom) XCTAssertEqual(bottomTick.start, CGPoint(x: 50, y: 1)) @@ -2093,6 +2095,8 @@ final class RulerCoreTests: XCTestCase { rule.mouseTickLineY(forTickY: 1, growthDirection: .positive), 1 ) + XCTAssertEqual(rule.mouseTickY(forLocalMouseY: 50.49), 50) + XCTAssertEqual(rule.mouseTickY(forLocalMouseY: 50.5), 51) let rightTick = rule.tickLine(forY: 250, length: 10, rulerWidth: 40, tickSide: .right) XCTAssertEqual(rightTick.start, CGPoint(x: 39, y: 250))