Files
Attractor/App/Titlebar and URL Bar/ToolbarViewController.swift
2020-08-14 15:55:08 -07:00

133 lines
4.5 KiB
Swift

//
// ToolbarViewController.swift
// SBrowser
//
// Created by James Magahern on 7/23/20.
//
import UIKit
class ToolbarViewController: UIViewController
{
let urlBar = URLBar()
let toolbarView = ToolbarView()
let scriptControllerIconView = ScriptControllerIconView()
let shareButton = ReliefButton()
let darkModeButton = ReliefButton()
let windowButton = ReliefButton()
let newTabButton = ReliefButton()
let backButton = ReliefButton()
let forwardButton = ReliefButton()
let navigationSegmentedButton = SegmentedReliefButton(children: [])
var darkModeEnabled: Bool = false {
didSet {
if darkModeEnabled {
darkModeButton.setImage(darkModeEnabledImage, for: .normal)
} else {
darkModeButton.setImage(darkModeDisabledImage, for: .normal)
}
}
}
private let darkModeDisabledImage = UIImage(systemName: "moon.circle")
private let darkModeEnabledImage = UIImage(systemName: "moon.circle.fill")
init() {
super.init(nibName: nil, bundle: nil)
toolbarView.urlBar = urlBar
// Dark mode button
darkModeButton.setImage(darkModeDisabledImage, for: .normal)
// Share button
shareButton.setImage(UIImage(systemName: "square.and.arrow.up"), for: .normal)
// Window button
windowButton.setImage(UIImage(systemName: "rectangle.on.rectangle"), for: .normal)
// Back button
backButton.setImage(UIImage(systemName: "chevron.left"), for: .normal)
// Forward button
forwardButton.setImage(UIImage(systemName: "chevron.right"), for: .normal)
// Navigation control
navigationSegmentedButton.children = [ backButton, forwardButton ]
// New tab button
newTabButton.setImage(UIImage(systemName: "plus"), for: .normal)
let toolbarAnimationDuration: TimeInterval = 0.3
urlBar.textField.addAction(.init(handler: { [traitCollection, toolbarView, urlBar] _ in
if traitCollection.horizontalSizeClass == .compact {
UIView.animate(withDuration: toolbarAnimationDuration) {
toolbarView.cancelButtonVisible = urlBar.textField.isFirstResponder
}
}
}), for: [ .editingDidBegin, .editingDidEnd ])
toolbarView.cancelButton.addAction(.init(handler: { [urlBar] action in
urlBar.textField.resignFirstResponder()
}), for: .touchUpInside)
traitCollectionDidChange(nil)
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
toolbarView.leadingButtonsView.removeAllButtonViews()
toolbarView.trailingButtonsView.removeAllButtonViews()
let spacerView = { () -> SpacerView in
SpacerView(space: 24.0)
}
// Setup toolbar based on trait collection
if traitCollection.horizontalSizeClass == .compact {
toolbarView.trailingButtonsView.addButtonView(darkModeButton)
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
toolbarView.trailingButtonsView.addButtonView(windowButton)
} else {
toolbarView.leadingButtonsView.addButtonView(navigationSegmentedButton)
toolbarView.leadingButtonsView.addButtonView(spacerView())
toolbarView.trailingButtonsView.addButtonView(shareButton)
toolbarView.trailingButtonsView.addButtonView(spacerView())
toolbarView.trailingButtonsView.addButtonView(darkModeButton)
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
toolbarView.trailingButtonsView.addButtonView(spacerView())
toolbarView.trailingButtonsView.addButtonView(newTabButton)
toolbarView.trailingButtonsView.addButtonView(windowButton)
}
}
override func loadView() {
self.view = toolbarView
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class SpacerView: UIView {
internal var space: CGFloat = 0
convenience init(space: CGFloat) {
self.init(frame: .zero)
self.space = space
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
CGSize(width: space, height: size.height)
}
}