From 3f9ecdcf04394cf85cd2c8df8005e97c9c7be934 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Tue, 21 May 2024 10:56:18 +0200 Subject: [PATCH 1/2] Scroll address bar to caret when using arrows --- .../NavigationBar/View/AddressBarTextEditor.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift b/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift index bf5c1c6c7f..1a146be0f5 100644 --- a/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift +++ b/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift @@ -292,12 +292,14 @@ final class AddressBarTextEditor: NSTextView { guard let index = nextWordSelectionIndex(backwards: false) else { return } self.selectedRange = NSRange(location: index, length: 0) + scrollToCaret() } override func moveWordLeft(_ sender: Any?) { guard let index = nextWordSelectionIndex(backwards: true) else { return } self.selectedRange = NSRange(location: index, length: 0) + scrollToCaret() } override func moveWordRightAndModifySelection(_ sender: Any?) { @@ -305,12 +307,14 @@ final class AddressBarTextEditor: NSTextView { guard selectionAffinity == .downstream || selectedRange.length == 0 else { // current selection is from right to left: reset selection to the upper bound self.selectedRange = NSRange(location: selectedRange.upperBound, length: 0) + scrollToCaret() return } guard let index = nextWordSelectionIndex(backwards: false) else { return } let range = NSRange(location: selectedRange.location, length: index - selectedRange.location) self.setSelectedRange(range, affinity: .downstream, stillSelecting: false) + scrollToCaret() } override func moveWordLeftAndModifySelection(_ sender: Any?) { @@ -318,12 +322,14 @@ final class AddressBarTextEditor: NSTextView { guard selectionAffinity == .upstream || selectedRange.length == 0 else { // current selection is from left to right: reset selection to the upper bound self.selectedRange = NSRange(location: selectedRange.lowerBound, length: 0) + scrollToCaret() return } guard let index = nextWordSelectionIndex(backwards: true) else { return } let range = NSRange(location: index, length: selectedRange.upperBound - index) self.setSelectedRange(range, affinity: .upstream, stillSelecting: false) + scrollToCaret() } override func deleteForward(_ sender: Any?) { @@ -422,6 +428,11 @@ final class AddressBarTextEditor: NSTextView { breakUndoCoalescing() } + private func scrollToCaret() { + guard let layoutManager = layoutManager, let textContainer = textContainer else { return } + let caretRect = layoutManager.boundingRect(forGlyphRange: selectedRange(), in: textContainer) + scrollToVisible(caretRect) + } } final class AddressBarTextFieldCell: NSTextFieldCell { From 637d49991d0c28777d28d5cd37257caadc4da281 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Fri, 24 May 2024 11:06:57 +0200 Subject: [PATCH 2/2] scroll bar to end or start of selection --- .../View/AddressBarTextEditor.swift | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift b/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift index 1a146be0f5..c235f193d1 100644 --- a/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift +++ b/DuckDuckGo/NavigationBar/View/AddressBarTextEditor.swift @@ -307,14 +307,13 @@ final class AddressBarTextEditor: NSTextView { guard selectionAffinity == .downstream || selectedRange.length == 0 else { // current selection is from right to left: reset selection to the upper bound self.selectedRange = NSRange(location: selectedRange.upperBound, length: 0) - scrollToCaret() return } guard let index = nextWordSelectionIndex(backwards: false) else { return } let range = NSRange(location: selectedRange.location, length: index - selectedRange.location) self.setSelectedRange(range, affinity: .downstream, stillSelecting: false) - scrollToCaret() + self.scrollToSelectionEnd() } override func moveWordLeftAndModifySelection(_ sender: Any?) { @@ -322,14 +321,13 @@ final class AddressBarTextEditor: NSTextView { guard selectionAffinity == .upstream || selectedRange.length == 0 else { // current selection is from left to right: reset selection to the upper bound self.selectedRange = NSRange(location: selectedRange.lowerBound, length: 0) - scrollToCaret() return } guard let index = nextWordSelectionIndex(backwards: true) else { return } let range = NSRange(location: index, length: selectedRange.upperBound - index) self.setSelectedRange(range, affinity: .upstream, stillSelecting: false) - scrollToCaret() + self.scrollToSelectionStart() } override func deleteForward(_ sender: Any?) { @@ -433,6 +431,17 @@ final class AddressBarTextEditor: NSTextView { let caretRect = layoutManager.boundingRect(forGlyphRange: selectedRange(), in: textContainer) scrollToVisible(caretRect) } + + private func scrollToSelectionStart() { + let startRange = NSRange(location: selectedRange().location, length: 0) + self.scrollRangeToVisible(startRange) + } + + private func scrollToSelectionEnd() { + let endRange = NSRange(location: selectedRange.location + selectedRange.length, length: 0) + self.scrollRangeToVisible(endRange) + } + } final class AddressBarTextFieldCell: NSTextFieldCell {