]> git.r.bdr.sh - rbdr/map/commitdiff
Add some debouncing main
authorRuben Beltran del Rio <redacted>
Mon, 16 Sep 2024 18:56:23 +0000 (20:56 +0200)
committerRuben Beltran del Rio <redacted>
Mon, 16 Sep 2024 18:56:23 +0000 (20:56 +0200)
Map/Presentation/Base Components/MapTextEditor.swift
Map/Presentation/Commands/MapCommands.swift
Map/Presentation/MapEditor.swift

index 2e4f279cd3d6ea0266a8d646479b31a1284f6601..ff982034d1681f5247ef83d5ec5f02ef7b556710 100644 (file)
@@ -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
+    }
   }
 }
index c04cb73f8c4b703098cd75bbff0a27aab9b4b91e..35250e26b76124009f5b35aa77c80592cfd197b0 100644 (file)
@@ -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)
index d62d4adfea1bf2259247fa32b7bc874defdbf463..5cda8f961c48c65488f9f969a6a4735083179a27 100644 (file)
@@ -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()
       }