Skip to content

Commit b754902

Browse files
fix quickly moving out of overlay not removing it
1 parent b403e21 commit b754902

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

FatSidebar/FatSidebarItem.swift

+10-10
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,16 @@ public class FatSidebarItem: NSView {
475475
}
476476
overlay.overlayFinished = { [weak self] in self?.overlay = nil }
477477

478+
NotificationCenter.default.addObserver(
479+
overlay,
480+
selector: #selector(FatSidebarItemOverlay.hoverDidStart),
481+
name: FatSidebarItemOverlay.hoverStarted,
482+
object: nil)
483+
484+
if let scrollView = enclosingScrollView {
485+
overlay.setupScrollSyncing(scrollView: scrollView)
486+
}
487+
478488
windowContentView.addSubview(overlay)
479489
(animated
480490
? overlay.animator()
@@ -488,16 +498,6 @@ public class FatSidebarItem: NSView {
488498
return frame
489499
}()
490500

491-
NotificationCenter.default.addObserver(
492-
overlay,
493-
selector: #selector(FatSidebarItemOverlay.hoverDidStart),
494-
name: FatSidebarItemOverlay.hoverStarted,
495-
object: nil)
496-
497-
if let scrollView = enclosingScrollView {
498-
overlay.setupScrollSyncing(scrollView: scrollView)
499-
}
500-
501501
return overlay
502502
}()
503503
}

FatSidebar/FatSidebarItemOverlay.swift

+34-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,23 @@ class FatSidebarItemOverlay: FatSidebarItem {
1515
// MARK: - Hovering
1616

1717
static var hoverStarted: Notification.Name { return Notification.Name(rawValue: "fat sidebar hover did start") }
18+
var didExit = false
1819
var overlayFinished: (() -> Void)?
1920

2021
private var trackingArea: NSTrackingArea?
2122

2223
override func updateTrackingAreas() {
2324
super.updateTrackingAreas()
2425

25-
if let oldTrackingArea = trackingArea { self.removeTrackingArea(oldTrackingArea) }
26+
if let oldTrackingArea = self.trackingArea { self.removeTrackingArea(oldTrackingArea) }
27+
28+
guard !didExit else { return }
29+
30+
createAndAssignTrackingArea()
31+
fireEnteredOrExitedWithInitialMouseCoordinates()
32+
}
33+
34+
fileprivate func createAndAssignTrackingArea() {
2635

2736
let newTrackingArea = NSTrackingArea(
2837
rect: self.bounds,
@@ -33,7 +42,25 @@ class FatSidebarItemOverlay: FatSidebarItem {
3342
self.trackingArea = newTrackingArea
3443
}
3544

45+
fileprivate func fireEnteredOrExitedWithInitialMouseCoordinates() {
46+
47+
guard let absoluteMousePoint = self.window?.mouseLocationOutsideOfEventStream else { return }
48+
49+
let mousePoint = self.convert(absoluteMousePoint, from: nil)
50+
51+
if NSPointInRect(mousePoint, self.bounds) {
52+
mouseDidEnter()
53+
} else {
54+
mouseDidExit()
55+
}
56+
}
57+
3658
override func mouseEntered(with event: NSEvent) {
59+
mouseDidEnter()
60+
}
61+
62+
/// - note: Use when event is not available, as in `updateTrackingRect`.
63+
fileprivate func mouseDidEnter() {
3764

3865
self.window?.disableCursorRects()
3966
NSCursor.pointingHand().set()
@@ -50,7 +77,13 @@ class FatSidebarItemOverlay: FatSidebarItem {
5077
}
5178

5279
override func mouseExited(with event: NSEvent) {
80+
mouseDidExit()
81+
}
82+
83+
/// - note: Use when event is not available, as in `updateTrackingRect`.
84+
fileprivate func mouseDidExit() {
5385

86+
didExit = true // Call before endHover to prevend updateTrackingRect loop
5487
endHover()
5588
}
5689

0 commit comments

Comments
 (0)