diff options
| -rw-r--r-- | Map/Presentation/Base Components/MapTextEditor.swift | 18 | ||||
| -rw-r--r-- | Map/Presentation/Commands/MapCommands.swift | 4 | ||||
| -rw-r--r-- | Map/Presentation/MapEditor.swift | 19 |
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() } |