Skip to content

Commit 4d9d1d0

Browse files
committed
Update View When Folds Change
1 parent 8ee94b5 commit 4d9d1d0

2 files changed

Lines changed: 20 additions & 6 deletions

File tree

Sources/CodeEditSourceEditor/Gutter/LineFolding/FoldingRibbonView.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import Foundation
99
import AppKit
1010
import CodeEditTextView
11+
import Combine
1112

1213
#warning("Replace before release")
1314
fileprivate let demoFoldProvider = IndentationLineFoldProvider()
@@ -83,6 +84,8 @@ class FoldingRibbonView: NSView {
8384
}
8485
}.cgColor
8586

87+
private var foldUpdateCancellable: AnyCancellable?
88+
8689
override public var isFlipped: Bool {
8790
true
8891
}
@@ -96,12 +99,20 @@ class FoldingRibbonView: NSView {
9699
super.init(frame: .zero)
97100
layerContentsRedrawPolicy = .onSetNeedsDisplay
98101
clipsToBounds = false
102+
103+
foldUpdateCancellable = model.foldsUpdatedPublisher.sink {
104+
self.needsDisplay = true
105+
}
99106
}
100107

101108
required init?(coder: NSCoder) {
102109
fatalError("init(coder:) has not been implemented")
103110
}
104111

112+
deinit {
113+
foldUpdateCancellable?.cancel()
114+
}
115+
105116
// MARK: - Hover
106117

107118
override func updateTrackingAreas() {

Sources/CodeEditSourceEditor/Gutter/LineFolding/LineFoldingModel.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import AppKit
99
import CodeEditTextView
10+
import Combine
1011

1112
/// # Basic Premise
1213
///
@@ -25,6 +26,8 @@ class LineFoldingModel: NSObject, NSTextStorageDelegate {
2526
weak var foldProvider: LineFoldProvider?
2627
weak var textView: TextView?
2728

29+
lazy var foldsUpdatedPublisher = PassthroughSubject<Void, Never>()
30+
2831
init(textView: TextView, foldProvider: LineFoldProvider?) {
2932
self.textView = textView
3033
self.foldProvider = foldProvider
@@ -64,25 +67,25 @@ class LineFoldingModel: NSObject, NSTextStorageDelegate {
6467
parent: currentFold,
6568
subFolds: []
6669
)
67-
if currentDepth == 0 {
70+
71+
if currentFold == nil {
6872
foldCache.append(newFold)
73+
} else {
74+
currentFold?.subFolds.append(newFold)
6975
}
70-
currentFold?.subFolds.append(newFold)
7176
currentFold = newFold
7277
} else if foldDepth < currentDepth {
7378
// End this fold
7479
if let fold = currentFold {
7580
fold.lineRange = fold.lineRange.lowerBound...linePosition.index
76-
77-
if foldDepth == 0 {
78-
currentFold = nil
79-
}
8081
}
8182
currentFold = currentFold?.parent
8283
}
8384

8485
currentDepth = foldDepth
8586
}
87+
88+
foldsUpdatedPublisher.send()
8689
}
8790

8891
func invalidateLine(lineNumber: Int) {

0 commit comments

Comments
 (0)