@@ -18,6 +18,7 @@ protocol VisibleRangeProviderDelegate: AnyObject {
18
18
@MainActor
19
19
class VisibleRangeProvider {
20
20
private weak var textView : TextView ?
21
+ private weak var minimapView : MinimapView ?
21
22
weak var delegate : VisibleRangeProviderDelegate ?
22
23
23
24
var documentRange : NSRange {
@@ -29,56 +30,44 @@ class VisibleRangeProvider {
29
30
return IndexSet ( integersIn: textView? . visibleTextRange ?? NSRange ( ) )
30
31
} ( )
31
32
32
- init ( textView: TextView ) {
33
+ init ( textView: TextView , minimapView : MinimapView ? ) {
33
34
self . textView = textView
35
+ self . minimapView = minimapView
34
36
35
37
if let scrollView = textView. enclosingScrollView {
36
38
NotificationCenter . default. addObserver (
37
39
self ,
38
- selector: #selector( visibleTextChanged ( _ : ) ) ,
40
+ selector: #selector( visibleTextChanged) ,
39
41
name: NSView . frameDidChangeNotification,
40
42
object: scrollView
41
43
)
42
44
43
45
NotificationCenter . default. addObserver (
44
46
self ,
45
- selector: #selector( visibleTextChanged ( _ : ) ) ,
47
+ selector: #selector( visibleTextChanged) ,
46
48
name: NSView . boundsDidChangeNotification,
47
49
object: scrollView. contentView
48
50
)
49
- } else {
50
- NotificationCenter . default. addObserver (
51
- self ,
52
- selector: #selector( visibleTextChanged ( _: ) ) ,
53
- name: NSView . frameDidChangeNotification,
54
- object: textView
55
- )
56
51
}
57
- }
58
52
59
- func updateVisibleSet( textView: TextView ) {
60
- if let newVisibleRange = textView. visibleTextRange {
61
- visibleSet = IndexSet ( integersIn: newVisibleRange)
62
- }
53
+ NotificationCenter . default. addObserver (
54
+ self ,
55
+ selector: #selector( visibleTextChanged) ,
56
+ name: NSView . frameDidChangeNotification,
57
+ object: textView
58
+ )
63
59
}
64
60
65
61
/// Updates the view to highlight newly visible text when the textview is scrolled or bounds change.
66
- @objc func visibleTextChanged( _ notification: Notification ) {
67
- let textView : TextView
68
- if let clipView = notification. object as? NSClipView ,
69
- let documentView = clipView. enclosingScrollView? . documentView as? TextView {
70
- textView = documentView
71
- } else if let scrollView = notification. object as? NSScrollView ,
72
- let documentView = scrollView. documentView as? TextView {
73
- textView = documentView
74
- } else if let documentView = notification. object as? TextView {
75
- textView = documentView
76
- } else {
62
+ @objc func visibleTextChanged( ) {
63
+ guard let textViewVisibleRange = textView? . visibleTextRange else {
77
64
return
78
65
}
79
-
80
- updateVisibleSet ( textView: textView)
81
-
66
+ var visibleSet = IndexSet ( integersIn: textViewVisibleRange)
67
+ if !( minimapView? . isHidden ?? true ) , let minimapVisibleRange = minimapView? . visibleTextRange {
68
+ visibleSet. formUnion ( IndexSet ( integersIn: minimapVisibleRange) )
69
+ }
70
+ self . visibleSet = visibleSet
82
71
delegate? . visibleSetDidUpdate ( visibleSet)
83
72
}
84
73
0 commit comments