Rudimentary autocomplete focus
This commit is contained in:
@@ -29,6 +29,8 @@ class AutocompleteViewController: UIViewController, UICollectionViewDelegate
|
||||
case HistoryItems
|
||||
}
|
||||
|
||||
override var canBecomeFirstResponder: Bool { true }
|
||||
|
||||
public let collectionView: UICollectionView
|
||||
|
||||
private let autocompleteView: AutocompleteView
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user