diff --git a/App/Autocomplete/AutocompleteViewController.swift b/App/Autocomplete/AutocompleteViewController.swift index c5ceea3..1885ca0 100644 --- a/App/Autocomplete/AutocompleteViewController.swift +++ b/App/Autocomplete/AutocompleteViewController.swift @@ -7,7 +7,7 @@ import UIKit -protocol AutocompleteViewControllerDelegate: class { +protocol AutocompleteViewControllerDelegate: AnyObject { func autocompleteController(_: AutocompleteViewController, didSelectHistoryItem: HistoryItem) } diff --git a/App/Browser View/BrowserViewController.swift b/App/Browser View/BrowserViewController.swift index 6b24d04..476d70a 100644 --- a/App/Browser View/BrowserViewController.swift +++ b/App/Browser View/BrowserViewController.swift @@ -41,6 +41,14 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat private var commandKeyHeld: Bool = false + private var darkModeEnabled: Bool { + get { tab.bridge.darkModeEnabled } + set { + tab.bridge.darkModeEnabled = newValue + toolbarController.darkModeEnabled = newValue + } + } + override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } init() { @@ -124,8 +132,7 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat // Dark mode button toolbarController.darkModeButton.addAction(UIAction(handler: { [unowned self] _ in - self.tab.bridge.darkModeEnabled = !self.tab.bridge.darkModeEnabled - self.toolbarController.darkModeEnabled = self.tab.bridge.darkModeEnabled + self.darkModeEnabled = !self.darkModeEnabled }), for: .touchUpInside) // Tabs button @@ -192,7 +199,7 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat // Font size adjust toolbarController.urlBar.documentButton.addAction(UIAction(handler: { [unowned self] _ in - let documentControls = DocumentControlViewController() + let documentControls = DocumentControlViewController(darkModeEnabled: tab.bridge.darkModeEnabled) documentControls.modalPresentationStyle = .popover documentControls.popoverPresentationController?.permittedArrowDirections = [ .down, .up ] documentControls.popoverPresentationController?.sourceView = toolbarController.urlBar.documentButton @@ -257,6 +264,12 @@ class BrowserViewController: UIViewController, WKNavigationDelegate, WKUIDelegat } }, for: .touchUpInside) + // Dark mode + documentControls.darkModeView.addAction(UIAction { [unowned self] _ in + self.darkModeEnabled = !self.darkModeEnabled + documentControls.dismiss(animated: true, completion: nil) + }, for: .touchUpInside) + present(documentControls, animated: true, completion: nil) }), for: .touchUpInside) diff --git a/App/Document Controls UI/DocumentControlView.swift b/App/Document Controls UI/DocumentControlView.swift index 0fb8a96..cd868af 100644 --- a/App/Document Controls UI/DocumentControlView.swift +++ b/App/Document Controls UI/DocumentControlView.swift @@ -59,7 +59,7 @@ class DocumentControlView: UIControl let imageSize: CGFloat = 24.0 let bounds = self.bounds.inset(by: layoutMargins) imageView.frame = CGRect( - x: bounds.minX, y: 0.0, + x: bounds.minX + 6.0, y: 0.0, width: imageSize, height: imageSize ).centeredY(inRect: self.bounds) diff --git a/App/Document Controls UI/DocumentControlViewController.swift b/App/Document Controls UI/DocumentControlViewController.swift index 8c939d7..5e7b2ad 100644 --- a/App/Document Controls UI/DocumentControlViewController.swift +++ b/App/Document Controls UI/DocumentControlViewController.swift @@ -15,13 +15,14 @@ class DocumentControlViewController: UIViewController let navigationControlView = NavigationControlsView() let settingsView = DocumentControlView() let readabilityView = DocumentControlView() + let darkModeView = DocumentControlView() var observations: [NSKeyValueObservation] = [] static public let preferredWidth = CGFloat(200.0) - convenience init() { - self.init(nibName: nil, bundle: nil) + init(darkModeEnabled: Bool) { + super.init(nibName: nil, bundle: nil) findOnPageControlView.label.text = "Find On Page" findOnPageControlView.imageView.image = UIImage(systemName: "magnifyingglass") @@ -32,10 +33,20 @@ class DocumentControlViewController: UIViewController readabilityView.label.text = "Reader Mode" readabilityView.imageView.image = UIImage(systemName: "doc.richtext") + if darkModeEnabled { + darkModeView.label.text = "Disable Dark Mode" + } else { + darkModeView.label.text = "Enable Dark Mode" + } + + darkModeView.imageView.image = DarkModeControls.buttonImage(forDarkModeState: darkModeEnabled) + documentControlView.addArrangedSubview(navigationControlView) documentControlView.addArrangedSubview(fontSizeAdjustView) documentControlView.addArrangedSubview(findOnPageControlView) + documentControlView.addArrangedSubview(darkModeView) documentControlView.addArrangedSubview(readabilityView) + documentControlView.addArrangedSubview(settingsView) for (i, view) in documentControlView.arrangedSubviews.enumerated() { @@ -43,6 +54,10 @@ class DocumentControlViewController: UIViewController } } + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func loadView() { self.view = documentControlView } diff --git a/App/KeyboardShortcuts.swift b/App/KeyboardShortcuts.swift index 1cb47a5..e46220c 100644 --- a/App/KeyboardShortcuts.swift +++ b/App/KeyboardShortcuts.swift @@ -8,7 +8,7 @@ import UIKit @objc -protocol ShortcutResponder: class { +protocol ShortcutResponder: AnyObject { @objc optional func focusURLBar(_ sender: Any?) diff --git a/App/Reader View/ReaderViewController.swift b/App/Reader View/ReaderViewController.swift index 30c50a2..6dc1b39 100644 --- a/App/Reader View/ReaderViewController.swift +++ b/App/Reader View/ReaderViewController.swift @@ -23,11 +23,8 @@ class ReaderViewController: UIViewController private let bridge = ProcessBundleBridge(webViewConfiguration: nil) - private let darkModeDisabledImage = UIImage(systemName: "moon.circle") - private let darkModeEnabledImage = UIImage(systemName: "moon.circle.fill") - private lazy var darkModeButton: UIBarButtonItem = { - UIBarButtonItem(image: darkModeEnabledImage, style: .plain, target: self, action: #selector(self.didTapDarkModeButton)) + UIBarButtonItem(image: nil, style: .plain, target: self, action: #selector(self.didTapDarkModeButton)) }() init(readableHTMLString: String, baseURL: URL?) { @@ -53,11 +50,7 @@ class ReaderViewController: UIViewController } private func updateDarkModeButton() { - if darkModeEnabled { - darkModeButton.image = darkModeEnabledImage - } else { - darkModeButton.image = darkModeDisabledImage - } + darkModeButton.image = DarkModeControls.buttonImage(forDarkModeState: darkModeEnabled) } @objc diff --git a/App/Tabs/Tab.swift b/App/Tabs/Tab.swift index 77ce30b..815da62 100644 --- a/App/Tabs/Tab.swift +++ b/App/Tabs/Tab.swift @@ -8,7 +8,7 @@ import UIKit import Combine -protocol TabDelegate: class +protocol TabDelegate: AnyObject { func didBlockScriptOrigin(_ origin: String, forTab: Tab) } diff --git a/App/Titlebar and URL Bar/ToolbarViewController.swift b/App/Titlebar and URL Bar/ToolbarViewController.swift index 31f10fc..ceeda13 100644 --- a/App/Titlebar and URL Bar/ToolbarViewController.swift +++ b/App/Titlebar and URL Bar/ToolbarViewController.swift @@ -7,6 +7,17 @@ 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")! + } + } +} + class ToolbarViewController: UIViewController { let urlBar = URLBar() @@ -24,24 +35,17 @@ class ToolbarViewController: UIViewController var darkModeEnabled: Bool = false { didSet { - if darkModeEnabled { - darkModeButton.setImage(darkModeEnabledImage, for: .normal) - } else { - darkModeButton.setImage(darkModeDisabledImage, for: .normal) - } + darkModeButton.setImage(DarkModeControls.buttonImage(forDarkModeState: darkModeEnabled), 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) + darkModeButton.setImage(DarkModeControls.buttonImage(forDarkModeState: darkModeEnabled), for: .normal) // Share button shareButton.setImage(UIImage(systemName: "square.and.arrow.up"), for: .normal)