Rudimentary autocomplete focus
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user