Rudimentary autocomplete focus

This commit is contained in:
James Magahern
2021-03-09 00:14:48 -08:00
parent b550868b50
commit 80a897ece6
3 changed files with 42 additions and 2 deletions

View File

@@ -29,6 +29,8 @@ class AutocompleteViewController: UIViewController, UICollectionViewDelegate
case HistoryItems case HistoryItems
} }
override var canBecomeFirstResponder: Bool { true }
public let collectionView: UICollectionView public let collectionView: UICollectionView
private let autocompleteView: AutocompleteView private let autocompleteView: AutocompleteView

View File

@@ -54,6 +54,8 @@ class BrowserViewController: UIViewController
override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent }
internal var changingFocusToAutocompleteController = false
init() { init() {
self.tab = tabController.tabs.first! self.tab = tabController.tabs.first!
self.tabBarViewController = TabBarViewController(tabController: tabController) self.tabBarViewController = TabBarViewController(tabController: tabController)
@@ -198,6 +200,7 @@ class BrowserViewController: UIViewController
}), for: .touchUpInside) }), for: .touchUpInside)
// TextField delegate // TextField delegate
toolbarController.urlBar.delegate = self
toolbarController.urlBar.textField.delegate = self toolbarController.urlBar.textField.delegate = self
// Autocomplete controller // Autocomplete controller
@@ -551,8 +554,10 @@ extension BrowserViewController: UITextFieldDelegate
} }
func textFieldDidEndEditing(_ textField: UITextField) { func textFieldDidEndEditing(_ textField: UITextField) {
if !changingFocusToAutocompleteController {
autocompleteViewController.view.isHidden = true autocompleteViewController.view.isHidden = true
} }
}
} }
extension BrowserViewController: ReaderViewControllerDelegate extension BrowserViewController: ReaderViewControllerDelegate
@@ -561,3 +566,12 @@ extension BrowserViewController: ReaderViewControllerDelegate
tab.beginLoadingURL(navigationURL) tab.beginLoadingURL(navigationURL)
} }
} }
extension BrowserViewController: URLBarDelegate
{
func urlBarRequestedFocusEscape(_ urlBar: URLBar) {
changingFocusToAutocompleteController = true
_ = self.autocompleteViewController.becomeFirstResponder()
changingFocusToAutocompleteController = false
}
}

View File

@@ -7,13 +7,29 @@
import UIKit 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 class URLBar: ReliefButton
{ {
let textField = UITextField(frame: .zero) let textField = TextFieldWithKeyCommands(frame: .zero)
let refreshButton = UIButton(frame: .zero) let refreshButton = UIButton(frame: .zero)
let errorButton = UIButton(frame: .zero) let errorButton = UIButton(frame: .zero)
let documentButton = UIButton(frame: .zero) let documentButton = UIButton(frame: .zero)
weak var delegate: URLBarDelegate?
public enum LoadProgress { public enum LoadProgress {
case complete case complete
case loading(progress: Double) case loading(progress: Double)
@@ -57,6 +73,9 @@ class URLBar: ReliefButton
// Mask view visibility is affected by editing state. // Mask view visibility is affected by editing state.
self.layoutSubviews() self.layoutSubviews()
}), for: [ .editingDidBegin, .editingDidEnd ]) }), for: [ .editingDidBegin, .editingDidEnd ])
textField.keyCommands = [
UIKeyCommand(action: #selector(Self.downKeyPressed), input: UIKeyCommand.inputDownArrow)
]
addSubview(textField) addSubview(textField)
textField.addAction(.init(handler: { [textField, refreshButton] _ in textField.addAction(.init(handler: { [textField, refreshButton] _ in
@@ -89,6 +108,11 @@ class URLBar: ReliefButton
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
@objc
private func downKeyPressed(_ sender: Any?) {
self.delegate?.urlBarRequestedFocusEscape(self)
}
private func updateProgressIndicator() { private func updateProgressIndicator() {
setErrorButtonAnimating(false) setErrorButtonAnimating(false)