diff options
Diffstat (limited to 'Map/Presentation/Base Components/MapTextEditor.swift')
| -rw-r--r-- | Map/Presentation/Base Components/MapTextEditor.swift | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/Map/Presentation/Base Components/MapTextEditor.swift b/Map/Presentation/Base Components/MapTextEditor.swift index 18b2fbc..4790a70 100644 --- a/Map/Presentation/Base Components/MapTextEditor.swift +++ b/Map/Presentation/Base Components/MapTextEditor.swift @@ -17,7 +17,8 @@ import SwiftUI class MapTextEditorController: NSViewController { - @Binding var document: MapDocument + @Binding var text: String + var highlightRanges: [Range<String.Index>] { didSet { updateHighlights() @@ -44,10 +45,10 @@ class MapTextEditorController: NSViewController { private let changeDebouncer: Debouncer = Debouncer(seconds: 1) init( - document: Binding<MapDocument>, highlightRanges: [Range<String.Index>], selectedRange: Int, + text: Binding<String>, highlightRanges: [Range<String.Index>], selectedRange: Int, onChange: @escaping () -> Void ) { - self._document = document + self._text = text self.onChange = onChange self.highlightRanges = highlightRanges self.selectedRange = selectedRange @@ -68,7 +69,7 @@ class MapTextEditorController: NSViewController { textView.allowsUndo = true textView.delegate = self textView.textStorage?.delegate = self - textView.string = self.document.text + textView.string = self.text textView.isEditable = true textView.font = .monospacedSystemFont(ofSize: 16.0, weight: .regular) self.view = scrollView @@ -79,12 +80,12 @@ class MapTextEditorController: NSViewController { updateHighlights() } - private var textView: NSTextView? { + var currentTextView: NSTextView? { return (view as? NSScrollView)?.documentView as? NSTextView } private func updateHighlights() { - if let textView { + if let textView = currentTextView { if let textStorage = textView.textStorage { textStorage.removeAttribute( .backgroundColor, range: NSRange(location: 0, length: textStorage.length)) @@ -105,7 +106,7 @@ class MapTextEditorController: NSViewController { } private func focusOnResult() { - if let textView { + if let textView = currentTextView { if let textStorage = textView.textStorage { if selectedRange < highlightRanges.count { let range = highlightRanges[selectedRange] @@ -121,7 +122,7 @@ extension MapTextEditorController: NSTextViewDelegate { func textDidChange(_ obj: Notification) { if let textField = obj.object as? NSTextView { - self.document.text = textField.string + self.text = textField.string changeDebouncer.debounce { DispatchQueue.main.async { @@ -235,16 +236,26 @@ extension MapTextEditorController: NSTextStorageDelegate { struct MapTextEditor: NSViewControllerRepresentable { - @Binding var document: MapDocument + @Binding var text: String var highlightRanges: [Range<String.Index>] var selectedRange: Int var onChange: () -> Void = {} + init( + text: Binding<String>, highlightRanges: [Range<String.Index>] = [], selectedRange: Int = 0, + onChange: @escaping () -> Void = {} + ) { + self._text = text + self.highlightRanges = highlightRanges + self.selectedRange = selectedRange + self.onChange = onChange + } + func makeNSViewController( context: NSViewControllerRepresentableContext<MapTextEditor> ) -> MapTextEditorController { return MapTextEditorController( - document: $document, highlightRanges: highlightRanges, selectedRange: selectedRange, + text: $text, highlightRanges: highlightRanges, selectedRange: selectedRange, onChange: onChange) } @@ -256,5 +267,12 @@ struct MapTextEditor: NSViewControllerRepresentable { if nsViewController.selectedRange != selectedRange { nsViewController.selectedRange = selectedRange } + + // Update text view content if text has changed + if let textView = nsViewController.currentTextView { + if textView.string != text { + textView.string = text + } + } } } |