From 80a897ece61cca6f99ded4696b08a926e1892a66 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Tue, 9 Mar 2021 00:14:48 -0800 Subject: [PATCH] Rudimentary autocomplete focus --- .../AutocompleteViewController.swift | 2 ++ App/Browser View/BrowserViewController.swift | 16 +++++++++++- App/Titlebar and URL Bar/URLBar.swift | 26 ++++++++++++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/App/Autocomplete/AutocompleteViewController.swift b/App/Autocomplete/AutocompleteViewController.swift index 1885ca0..52e8ba4 100644 --- a/App/Autocomplete/AutocompleteViewController.swift +++ b/App/Autocomplete/AutocompleteViewController.swift @@ -29,6 +29,8 @@ class AutocompleteViewController: UIViewController, UICollectionViewDelegate case HistoryItems } + override var canBecomeFirstResponder: Bool { true } + public let collectionView: UICollectionView private let autocompleteView: AutocompleteView diff --git a/App/Browser View/BrowserViewController.swift b/App/Browser View/BrowserViewController.swift index 1ae9ebb..a00d4a9 100644 --- a/App/Browser View/BrowserViewController.swift +++ b/App/Browser View/BrowserViewController.swift @@ -54,6 +54,8 @@ class BrowserViewController: UIViewController override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } + internal var changingFocusToAutocompleteController = false + init() { self.tab = tabController.tabs.first! self.tabBarViewController = TabBarViewController(tabController: tabController) @@ -198,6 +200,7 @@ class BrowserViewController: UIViewController }), for: .touchUpInside) // TextField delegate + toolbarController.urlBar.delegate = self toolbarController.urlBar.textField.delegate = self // Autocomplete controller @@ -551,7 +554,9 @@ extension BrowserViewController: UITextFieldDelegate } func textFieldDidEndEditing(_ textField: UITextField) { - autocompleteViewController.view.isHidden = true + if !changingFocusToAutocompleteController { + autocompleteViewController.view.isHidden = true + } } } @@ -561,3 +566,12 @@ extension BrowserViewController: ReaderViewControllerDelegate tab.beginLoadingURL(navigationURL) } } + +extension BrowserViewController: URLBarDelegate +{ + func urlBarRequestedFocusEscape(_ urlBar: URLBar) { + changingFocusToAutocompleteController = true + _ = self.autocompleteViewController.becomeFirstResponder() + changingFocusToAutocompleteController = false + } +} diff --git a/App/Titlebar and URL Bar/URLBar.swift b/App/Titlebar and URL Bar/URLBar.swift index ecdbb40..b65ae4c 100644 --- a/App/Titlebar and URL Bar/URLBar.swift +++ b/App/Titlebar and URL Bar/URLBar.swift @@ -7,13 +7,29 @@ import UIKit +protocol URLBarDelegate: AnyObject +{ + func urlBarRequestedFocusEscape(_ urlBar: URLBar) +} + +class TextFieldWithKeyCommands: UITextField +{ + internal var _keyCommands: [UIKeyCommand]? = [] + override var keyCommands: [UIKeyCommand]? { + get { _keyCommands } + set { _keyCommands = newValue } + } +} + class URLBar: ReliefButton { - let textField = UITextField(frame: .zero) + let textField = TextFieldWithKeyCommands(frame: .zero) let refreshButton = UIButton(frame: .zero) let errorButton = UIButton(frame: .zero) let documentButton = UIButton(frame: .zero) + weak var delegate: URLBarDelegate? + public enum LoadProgress { case complete case loading(progress: Double) @@ -57,6 +73,9 @@ class URLBar: ReliefButton // Mask view visibility is affected by editing state. self.layoutSubviews() }), for: [ .editingDidBegin, .editingDidEnd ]) + textField.keyCommands = [ + UIKeyCommand(action: #selector(Self.downKeyPressed), input: UIKeyCommand.inputDownArrow) + ] addSubview(textField) textField.addAction(.init(handler: { [textField, refreshButton] _ in @@ -89,6 +108,11 @@ class URLBar: ReliefButton fatalError("init(coder:) has not been implemented") } + @objc + private func downKeyPressed(_ sender: Any?) { + self.delegate?.urlBarRequestedFocusEscape(self) + } + private func updateProgressIndicator() { setErrorButtonAnimating(false)