aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Map/Presentation/Base Components/MapTextEditor.swift18
-rw-r--r--Map/Presentation/Commands/MapCommands.swift4
-rw-r--r--Map/Presentation/MapEditor.swift19
3 files changed, 19 insertions, 22 deletions
diff --git a/Map/Presentation/Base Components/MapTextEditor.swift b/Map/Presentation/Base Components/MapTextEditor.swift
index 2e4f279..ff98203 100644
--- a/Map/Presentation/Base Components/MapTextEditor.swift
+++ b/Map/Presentation/Base Components/MapTextEditor.swift
@@ -89,10 +89,11 @@ class MapTextEditorController: NSViewController {
textStorage.removeAttribute(
.backgroundColor, range: NSRange(location: 0, length: textStorage.length))
- for range in highlightRanges {
+ for (index, range) in highlightRanges.enumerated() {
let nsRange = NSRange(range, in: textStorage.string)
- textStorage.addAttribute(.backgroundColor, value: NSColor.Syntax.match, range: nsRange)
+ let color = index == selectedRange ? NSColor.Syntax.highlightMatch : NSColor.Syntax.match
+ textStorage.addAttribute(.backgroundColor, value: color, range: nsRange)
}
textView.needsDisplay = true
@@ -108,19 +109,10 @@ class MapTextEditorController: NSViewController {
let range = highlightRanges[selectedRange]
let nsRange = NSRange(range, in: textStorage.string)
textView.scrollRangeToVisible(nsRange)
- textView.selectedRange = nsRange
}
}
}
}
-
- private func setSelectionColor() {
- guard let textView = self.textView else { return }
-
- var selectedTextAttributes = textView.selectedTextAttributes
- selectedTextAttributes[.backgroundColor] = NSColor.yellow.withAlphaComponent(0.3)
- textView.selectedTextAttributes = selectedTextAttributes
- }
}
extension MapTextEditorController: NSTextViewDelegate {
@@ -259,6 +251,8 @@ struct MapTextEditor: NSViewControllerRepresentable {
context: NSViewControllerRepresentableContext<MapTextEditor>
) {
nsViewController.highlightRanges = highlightRanges
- nsViewController.selectedRange = selectedRange
+ if nsViewController.selectedRange != selectedRange {
+ nsViewController.selectedRange = selectedRange
+ }
}
}
diff --git a/Map/Presentation/Commands/MapCommands.swift b/Map/Presentation/Commands/MapCommands.swift
index c04cb73..35250e2 100644
--- a/Map/Presentation/Commands/MapCommands.swift
+++ b/Map/Presentation/Commands/MapCommands.swift
@@ -67,9 +67,7 @@ struct MapCommands: Commands {
CommandGroup(after: CommandGroupPlacement.pasteboard) {
Divider()
Button("Find...") {
- withAnimation {
- isSearching = isSearching != nil ? !isSearching! : true
- }
+ isSearching = isSearching != nil ? !isSearching! : true
}.keyboardShortcut(
"f", modifiers: EventModifiers([.command])
).disabled(document == nil)
diff --git a/Map/Presentation/MapEditor.swift b/Map/Presentation/MapEditor.swift
index d62d4ad..5cda8f9 100644
--- a/Map/Presentation/MapEditor.swift
+++ b/Map/Presentation/MapEditor.swift
@@ -20,6 +20,8 @@ struct MapEditor: View {
@State var selectedEvolution: StageType = .behavior
@State var isSearching: Bool = false
+ private let changeDebouncer: Debouncer = Debouncer(seconds: 0.05)
+
@AppStorage("viewStyle") var viewStyle: ViewStyle = .horizontal
let zoomRange = Constants.kMinZoom...Constants.kMaxZoom
@@ -28,9 +30,11 @@ struct MapEditor: View {
@State var searchTerm = ""
@State var selectedTerm = 0
- var results: [Range<String.Index>] {
+ @State var results: [Range<String.Index>] = []
+
+ private func updateRanges() {
if !isSearching || searchTerm.isEmpty {
- return []
+ results = []
}
let options: NSString.CompareOptions = [.caseInsensitive, .diacriticInsensitive]
var searchRange = document.text.startIndex..<document.text.endIndex
@@ -41,7 +45,7 @@ struct MapEditor: View {
searchRange = range.upperBound..<document.text.endIndex
}
- return ranges
+ results = ranges
}
@@ -72,15 +76,16 @@ struct MapEditor: View {
},
onDismiss: {
- withAnimation {
- isSearching = false
- }
+ isSearching = false
}
)
.onChange(
of: searchTerm,
{
- selectedTerm = 0
+ changeDebouncer.debounce {
+ updateRanges()
+ selectedTerm = 0
+ }
})
Divider()
}