Settings: Switch to UIKit
This commit is contained in:
@@ -1,22 +1,104 @@
|
||||
//
|
||||
// SettingsViewController.swift
|
||||
// App
|
||||
// SettingsViewController
|
||||
//
|
||||
// Created by James Magahern on 3/3/21.
|
||||
// Created by James Magahern on 6/25/21.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import UIKit
|
||||
|
||||
class SettingsViewController: UIHostingController<SettingsView>
|
||||
#if targetEnvironment(macCatalyst)
|
||||
fileprivate extension NSToolbarItem.Identifier {
|
||||
static let categories = NSToolbarItem.Identifier("preferences.categories")
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !targetEnvironment(macCatalyst)
|
||||
protocol NSToolbarDelegate {}
|
||||
#endif
|
||||
|
||||
class SettingsViewController: UITabBarController, NSToolbarDelegate
|
||||
{
|
||||
var settingsView = SettingsView()
|
||||
#if targetEnvironment(macCatalyst)
|
||||
let toolbar = NSToolbar(identifier: NSToolbar.Identifier("net.buzzert.rossler-attix.preferences-toolbar"))
|
||||
#endif
|
||||
|
||||
init() {
|
||||
super.init(rootView: settingsView)
|
||||
init(windowScene: UIWindowScene) {
|
||||
super.init(nibName: nil, bundle: nil)
|
||||
self.title = "Preferences"
|
||||
|
||||
self.viewControllers = [
|
||||
GeneralSettingsViewController(),
|
||||
RedirectRulesSettingsViewController(),
|
||||
]
|
||||
|
||||
navigationItem.rightBarButtonItem = UIBarButtonItem(systemItem: .done, primaryAction: UIAction { [unowned self] _ in
|
||||
self.dismiss(animated: true, completion: nil)
|
||||
}, menu: nil)
|
||||
|
||||
#if targetEnvironment(macCatalyst)
|
||||
configureTabsForMacIdiom(windowScene: windowScene)
|
||||
#endif
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
#if targetEnvironment(macCatalyst)
|
||||
internal func configureTabsForMacIdiom(windowScene: UIWindowScene) {
|
||||
self.tabBar.isHidden = true
|
||||
|
||||
guard let titlebar = windowScene.titlebar else { return }
|
||||
titlebar.toolbarStyle = .preference
|
||||
|
||||
toolbar.delegate = self
|
||||
toolbar.displayMode = .iconAndLabel
|
||||
|
||||
titlebar.toolbar = toolbar
|
||||
|
||||
windowScene.title = self.title
|
||||
|
||||
toolbar.selectedItemIdentifier = toolbarAllowedItemIdentifiers(toolbar).first
|
||||
}
|
||||
|
||||
// MARK: NSToolbarDelegate
|
||||
@objc
|
||||
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
||||
return viewControllers!.map { NSToolbarItem.Identifier($0.tabBarItem.title!) }
|
||||
}
|
||||
|
||||
@objc
|
||||
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
||||
return toolbarAllowedItemIdentifiers(toolbar)
|
||||
}
|
||||
|
||||
@objc
|
||||
func toolbarSelectableItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
||||
return toolbarAllowedItemIdentifiers(toolbar)
|
||||
}
|
||||
|
||||
@objc
|
||||
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem?
|
||||
{
|
||||
guard let viewController = viewControllers!.first(where: { $0.tabBarItem.title == itemIdentifier.rawValue })
|
||||
else { return nil }
|
||||
|
||||
let item = NSToolbarItem(itemIdentifier: itemIdentifier)
|
||||
item.label = viewController.tabBarItem.title!
|
||||
item.image = viewController.tabBarItem.image!
|
||||
item.action = #selector(didSelectToolbarItem(_:))
|
||||
|
||||
return item
|
||||
}
|
||||
|
||||
@objc
|
||||
internal func didSelectToolbarItem(_ sender: NSToolbarItem) {
|
||||
guard let viewController = viewControllers!.first(where: { $0.tabBarItem.title == sender.itemIdentifier.rawValue }) else { return }
|
||||
|
||||
selectedViewController = viewController
|
||||
toolbar.selectedItemIdentifier = sender.itemIdentifier
|
||||
}
|
||||
#endif // targetEnvironment(macCatalyst)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user