Files
Attractor/App/Titlebar and URL Bar/ToolbarViewController.swift

138 lines
4.7 KiB
Swift
Raw Normal View History

2020-07-24 19:26:35 -07:00
//
// ToolbarViewController.swift
// SBrowser
//
// Created by James Magahern on 7/23/20.
//
import UIKit
public struct DarkModeControls
{
public static func buttonImage(forDarkModeState enabled: Bool) -> UIImage {
if enabled {
return UIImage(systemName: "moon.circle.fill")!
} else {
return UIImage(systemName: "moon.circle")!
}
}
}
2020-07-24 19:26:35 -07:00
class ToolbarViewController: UIViewController
{
let urlBar = URLBar()
let toolbarView = ToolbarView()
let scriptControllerIconView = ScriptControllerIconView()
2020-08-14 15:55:08 -07:00
let shareButton = ReliefButton()
let darkModeButton = ReliefButton()
let windowButton = ReliefButton()
let newTabButton = ReliefButton()
let backButton = ReliefButton()
let forwardButton = ReliefButton()
let navigationSegmentedButton = SegmentedReliefButton(children: [])
2020-07-24 19:26:35 -07:00
2020-07-29 18:17:22 -07:00
var darkModeEnabled: Bool = false {
didSet {
darkModeButton.setImage(DarkModeControls.buttonImage(forDarkModeState: darkModeEnabled), for: .normal)
2020-07-29 18:17:22 -07:00
}
}
2020-07-24 19:26:35 -07:00
init() {
super.init(nibName: nil, bundle: nil)
toolbarView.urlBar = urlBar
2020-07-29 19:24:05 -07:00
// Dark mode button
darkModeButton.setImage(DarkModeControls.buttonImage(forDarkModeState: darkModeEnabled), for: .normal)
2020-07-29 19:24:05 -07:00
// Share button
2020-07-24 19:26:35 -07:00
shareButton.setImage(UIImage(systemName: "square.and.arrow.up"), for: .normal)
2020-07-29 19:24:05 -07:00
// 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)
2020-08-14 15:55:08 -07:00
// Navigation control
navigationSegmentedButton.children = [ backButton, forwardButton ]
// New tab button
newTabButton.setImage(UIImage(systemName: "plus"), for: .normal)
let toolbarAnimationDuration: TimeInterval = 0.3
2024-07-29 19:21:51 -07:00
urlBar.textField.addAction(.init(handler: { [weak self] _ in
guard let self, let parent else { return }
// xxx: Not sure why I need to refer to parent here. This view controller isn't inheriting anything.
if parent.traitCollection.horizontalSizeClass == .compact {
UIView.animate(withDuration: toolbarAnimationDuration) { [unowned self] in
self.toolbarView.cancelButtonVisible = self.urlBar.textField.isFirstResponder
}
}
}), for: [ .editingDidBegin, .editingDidEnd ])
toolbarView.cancelButton.addAction(.init(handler: { [urlBar] action in
urlBar.textField.resignFirstResponder()
}), for: .touchUpInside)
2020-07-29 19:24:05 -07:00
2024-07-29 19:21:51 -07:00
reconfigureButtons(for: traitCollection.horizontalSizeClass)
2020-07-29 19:24:05 -07:00
}
2024-07-29 19:21:51 -07:00
public func reconfigureButtons(for horizontalSizeClass: UIUserInterfaceSizeClass) {
toolbarView.leadingButtonsView.removeAllButtonViews()
toolbarView.trailingButtonsView.removeAllButtonViews()
2020-07-29 19:24:05 -07:00
2020-08-14 15:55:08 -07:00
let spacerView = { () -> SpacerView in
2022-02-21 15:52:18 -08:00
SpacerView(space: 20.0)
2020-08-14 15:55:08 -07:00
}
2020-07-29 19:24:05 -07:00
// Setup toolbar based on trait collection
2024-07-29 19:21:51 -07:00
if horizontalSizeClass == .compact {
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
toolbarView.trailingButtonsView.addButtonView(newTabButton)
toolbarView.trailingButtonsView.addButtonView(windowButton)
2020-07-29 19:24:05 -07:00
} else {
2020-08-14 15:55:08 -07:00
toolbarView.leadingButtonsView.addButtonView(navigationSegmentedButton)
toolbarView.leadingButtonsView.addButtonView(spacerView())
toolbarView.trailingButtonsView.addButtonView(shareButton)
2020-08-14 15:55:08 -07:00
toolbarView.trailingButtonsView.addButtonView(spacerView())
toolbarView.trailingButtonsView.addButtonView(darkModeButton)
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
2020-08-14 15:55:08 -07:00
toolbarView.trailingButtonsView.addButtonView(spacerView())
toolbarView.trailingButtonsView.addButtonView(newTabButton)
toolbarView.trailingButtonsView.addButtonView(windowButton)
2020-07-29 19:24:05 -07:00
}
2020-07-24 19:26:35 -07:00
}
override func loadView() {
self.view = toolbarView
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
2020-08-14 15:55:08 -07:00
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)
}
}