Tusker/Tusker/Screens/Main/MainTabBarViewController.swift

147 lines
4.7 KiB
Swift
Raw Normal View History

2018-08-21 21:17:25 +00:00
//
// MainTabBarViewController.swift
// Tusker
//
2019-02-08 18:41:19 +00:00
// Created by Shadowfacts on 8/21/18.
2018-08-21 21:17:25 +00:00
// Copyright © 2018 Shadowfacts. All rights reserved.
//
import UIKit
2020-08-31 23:28:50 +00:00
import SwiftUI
2018-08-21 21:17:25 +00:00
2019-01-05 17:59:55 +00:00
class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate {
weak var mastodonController: MastodonController!
2020-06-24 20:40:45 +00:00
private var composePlaceholder: UIViewController!
var selectedTab: Tab {
return Tab(rawValue: selectedIndex)!
}
2018-08-21 21:17:25 +00:00
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
if UIDevice.current.userInterfaceIdiom == .phone {
return .portrait
} else {
return .all
}
}
init(mastodonController: MastodonController) {
self.mastodonController = mastodonController
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
2018-08-21 21:17:25 +00:00
override func viewDidLoad() {
super.viewDidLoad()
2019-01-05 17:59:55 +00:00
self.delegate = self
2020-06-24 20:40:45 +00:00
composePlaceholder = UIViewController()
composePlaceholder.title = "Compose"
composePlaceholder.tabBarItem.image = UIImage(systemName: "pencil")
2019-01-05 17:59:55 +00:00
viewControllers = [
2020-06-24 20:40:45 +00:00
embedInNavigationController(Tab.timelines.createViewController(mastodonController)),
embedInNavigationController(Tab.notifications.createViewController(mastodonController)),
composePlaceholder,
embedInNavigationController(Tab.explore.createViewController(mastodonController)),
embedInNavigationController(Tab.myProfile.createViewController(mastodonController)),
2019-01-05 17:59:55 +00:00
]
2018-08-21 21:17:25 +00:00
}
func embedInNavigationController(_ vc: UIViewController) -> UINavigationController {
if let vc = vc as? UINavigationController {
return vc
} else {
return EnhancedNavigationViewController(rootViewController: vc)
}
}
2018-08-31 02:30:19 +00:00
2019-01-05 17:59:55 +00:00
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
2020-06-24 20:40:45 +00:00
if viewController == composePlaceholder {
presentCompose()
2019-01-05 17:59:55 +00:00
return false
}
if viewController == viewControllers![selectedIndex],
let nav = viewController as? UINavigationController,
nav.viewControllers.count == 1,
let scrollableVC = nav.viewControllers.first as? TabBarScrollableViewController {
scrollableVC.tabBarScrollToTop()
return false
}
2019-01-05 17:59:55 +00:00
return true
}
func setViewController(_ viewController: UIViewController, forTab tab: Tab) {
viewControllers![tab.rawValue] = viewController
}
func viewController(for tab: Tab) -> UIViewController {
return viewControllers![tab.rawValue]
}
}
extension MainTabBarViewController {
2020-06-24 20:40:45 +00:00
enum Tab: Int, Hashable, CaseIterable {
case timelines
case notifications
case compose
case explore
case myProfile
2020-06-24 20:40:45 +00:00
func createViewController(_ mastodonController: MastodonController) -> UIViewController {
switch self {
case .timelines:
return TimelinesPageViewController(mastodonController: mastodonController)
case .notifications:
return NotificationsPageViewController(mastodonController: mastodonController)
case .compose:
2020-08-31 23:28:50 +00:00
return ComposeHostingController(mastodonController: mastodonController)
2020-06-24 20:40:45 +00:00
case .explore:
return ExploreViewController(mastodonController: mastodonController)
case .myProfile:
return MyProfileViewController(mastodonController: mastodonController)
2020-06-24 20:40:45 +00:00
}
}
}
2020-06-24 20:40:45 +00:00
func getTabController(tab: Tab) -> UIViewController? {
if tab == .compose {
2020-06-24 20:40:45 +00:00
return nil
} else {
2020-06-24 20:40:45 +00:00
return viewControllers![tab.rawValue]
}
}
2020-06-24 20:40:45 +00:00
}
extension MainTabBarViewController: TuskerRootViewController {
func presentCompose() {
2020-08-31 23:28:50 +00:00
let vc = ComposeHostingController(mastodonController: mastodonController)
let nav = EnhancedNavigationViewController(rootViewController: vc)
nav.presentationController?.delegate = vc
present(nav, animated: true)
2020-06-24 20:40:45 +00:00
}
2020-06-24 20:40:45 +00:00
func select(tab: Tab) {
if tab == .compose {
2020-06-24 20:40:45 +00:00
presentCompose()
} else {
2020-06-24 20:40:45 +00:00
selectedIndex = tab.rawValue
}
}
2018-08-21 21:17:25 +00:00
}
extension MainTabBarViewController: BackgroundableViewController {
func sceneDidEnterBackground() {
if let selectedVC = selectedViewController as? BackgroundableViewController {
selectedVC.sceneDidEnterBackground()
}
}
}