Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions Free Ruler/RulerController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ class RulerController: NSWindowController, NSWindowDelegate, NotificationObserve
private var mouseTickResumeTimer: Timer?
private let mouseTickResumeDelay: TimeInterval = 0.15
private var mouseIsDraggingRuler = false
var isLeftMouseButtonPressed = {
return NSEvent.pressedMouseButtons & 1 == 1
}

var preferencesWindowOpen = false {
didSet {
Expand Down Expand Up @@ -89,7 +92,7 @@ class RulerController: NSWindowController, NSWindowDelegate, NotificationObserve

func windowDidMove(_ notification: Notification) {
rulerWindow.invalidateShadow()
guard !mouseIsDraggingRuler else { return }
guard !mouseIsDraggingRuler && !isLeftMouseButtonPressed() else { return }
scheduleMouseTickResume()
}

Expand Down Expand Up @@ -118,6 +121,12 @@ class RulerController: NSWindowController, NSWindowDelegate, NotificationObserve
}

override func mouseUp(with event: NSEvent) {
finishMouseDrag(with: event)
}

func finishMouseDrag(with event: NSEvent) {
guard mouseIsDraggingRuler else { return }

mouseIsDraggingRuler = false
scheduleMouseTickResume()
rulerCursorController?.mouseUpInRuler(mouseIsInsideRuler: isMouseInsideRuler(with: event))
Expand All @@ -137,8 +146,6 @@ class RulerController: NSWindowController, NSWindowDelegate, NotificationObserve
}

func enableMouseTicks() {
guard !rulerWindow.rule.showMouseTick || otherWindow?.rule.showMouseTick == false else { return }

rulerWindow.rule.showMouseTick = true
otherWindow?.rule.showMouseTick = true
appDelegate?.resumeMouseTickUpdates(owner: self)
Expand Down
8 changes: 8 additions & 0 deletions Free Ruler/RulerWindow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,21 @@ class RulerWindow: NSPanel {
override func mouseDown(with event: NSEvent) {
nextResponder?.mouseDown(with: event)
super.mouseDown(with: event)

if !leftMouseButtonIsPressed {
(nextResponder as? RulerController)?.finishMouseDrag(with: event)
}
}

override func mouseUp(with event: NSEvent) {
nextResponder?.mouseUp(with: event)
super.mouseUp(with: event)
}

private var leftMouseButtonIsPressed: Bool {
return NSEvent.pressedMouseButtons & 1 == 1
}

}

private func getTitle(for orientation: Orientation) -> String {
Expand Down
63 changes: 63 additions & 0 deletions FreeRulerTests/RulerCoreTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -289,4 +289,67 @@ final class RulerCoreTests: XCTestCase {

XCTAssertTrue(controller.rulerWindow.rule.showMouseTick)
}

func testRulerControllerResumesMouseTicksWhenWindowDragLoopEnds() {
let ruler = Ruler(.horizontal, frame: NSRect(x: 0, y: 0, width: 300, height: Ruler.thickness))
let controller = RulerController(ruler: ruler)
let otherWindow = RulerWindow(Ruler(.vertical, frame: NSRect(x: 0, y: 0, width: Ruler.thickness, height: 300)))
controller.otherWindow = otherWindow
let mouseDownEvent = NSEvent.mouseEvent(
with: .leftMouseDown,
location: NSPoint(x: 10, y: 10),
modifierFlags: [],
timestamp: 0,
windowNumber: controller.rulerWindow.windowNumber,
context: nil,
eventNumber: 0,
clickCount: 1,
pressure: 1
)!

controller.mouseDown(with: mouseDownEvent)
controller.windowDidMove(Notification(name: NSWindow.didMoveNotification, object: controller.rulerWindow))
RunLoop.current.run(until: Date().addingTimeInterval(0.2))

XCTAssertFalse(controller.rulerWindow.rule.showMouseTick)
XCTAssertFalse(otherWindow.rule.showMouseTick)

controller.finishMouseDrag(with: mouseDownEvent)
RunLoop.current.run(until: Date().addingTimeInterval(0.2))

XCTAssertTrue(controller.rulerWindow.rule.showMouseTick)
XCTAssertTrue(otherWindow.rule.showMouseTick)
}

func testGroupedChildMoveDoesNotResumeMouseTicksDuringDrag() {
let draggedController = RulerController(
ruler: Ruler(.horizontal, frame: NSRect(x: 0, y: 0, width: 300, height: Ruler.thickness))
)
let groupedChildController = RulerController(
ruler: Ruler(.vertical, frame: NSRect(x: 0, y: 0, width: Ruler.thickness, height: 300))
)
draggedController.otherWindow = groupedChildController.rulerWindow
groupedChildController.otherWindow = draggedController.rulerWindow
groupedChildController.isLeftMouseButtonPressed = { true }
let mouseDownEvent = NSEvent.mouseEvent(
with: .leftMouseDown,
location: NSPoint(x: 10, y: 10),
modifierFlags: [],
timestamp: 0,
windowNumber: draggedController.rulerWindow.windowNumber,
context: nil,
eventNumber: 0,
clickCount: 1,
pressure: 1
)!

draggedController.mouseDown(with: mouseDownEvent)
groupedChildController.windowDidMove(
Notification(name: NSWindow.didMoveNotification, object: groupedChildController.rulerWindow)
)
RunLoop.current.run(until: Date().addingTimeInterval(0.2))

XCTAssertFalse(draggedController.rulerWindow.rule.showMouseTick)
XCTAssertFalse(groupedChildController.rulerWindow.rule.showMouseTick)
}
}