Tusker/Tusker/Screens/Main/MainSplitViewController.swift

117 lines
4.1 KiB
Swift

//
// MainSplitViewController.swift
// Tusker
//
// Created by Shadowfacts on 6/23/20.
// Copyright © 2020 Shadowfacts. All rights reserved.
//
import UIKit
@available(iOS 14.0, *)
class MainSplitViewController: UISplitViewController {
weak var mastodonController: MastodonController!
private var sidebar: MainSidebarViewController!
private var detailViewControllers: [MainSidebarViewController.Item: UIViewController] = [:]
init(mastodonController: MastodonController) {
self.mastodonController = mastodonController
super.init(style: .doubleColumn)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
preferredDisplayMode = .oneBesideSecondary
preferredSplitBehavior = .tile
presentsWithGesture = false
showsSecondaryOnlyButton = false
sidebar = MainSidebarViewController(mastodonController: mastodonController)
sidebar.sidebarDelegate = self
setViewController(sidebar, for: .primary)
select(item: .tab(.timelines))
setViewController(MainTabBarViewController(mastodonController: mastodonController), for: .compact)
}
func select(item: MainSidebarViewController.Item) {
let itemController = getOrCreateDetailViewController(item: item)
setViewController(itemController, for: .secondary)
}
func getOrCreateDetailViewController(item: MainSidebarViewController.Item) -> UIViewController? {
if let existing = detailViewControllers[item] {
return existing
} else {
guard let new = item.createRootViewController(mastodonController) else { return nil }
let nav = EnhancedNavigationViewController(rootViewController: new)
// Prevents the navigation bar from going transparent when switching sidebar sections.
nav.navigationBar.scrollEdgeAppearance = nav.navigationBar.standardAppearance
detailViewControllers[item] = nav
return nav
}
}
}
@available(iOS 14.0, *)
extension MainSplitViewController: MainSidebarViewControllerDelegate {
func sidebarRequestPresentCompose(_ sidebarViewController: MainSidebarViewController) {
presentCompose()
}
func sidebar(_ sidebarViewController: MainSidebarViewController, didSelectItem item: MainSidebarViewController.Item) {
select(item: item)
}
}
@available(iOS 14.0, *)
fileprivate extension MainSidebarViewController.Item {
func createRootViewController(_ mastodonController: MastodonController) -> UIViewController? {
switch self {
case let .tab(tab):
return tab.createViewController(mastodonController)
case .search:
return SearchViewController(mastodonController: mastodonController)
case .bookmarks:
return BookmarksTableViewController(mastodonController: mastodonController)
case let .list(list):
return ListTimelineViewController(for: list, mastodonController: mastodonController)
case let .savedHashtag(hashtag):
return HashtagTimelineViewController(for: hashtag, mastodonController: mastodonController)
case let .savedInstance(url):
return InstanceTimelineViewController(for: url, parentMastodonController: mastodonController)
default:
return nil
}
}
}
@available(iOS 14.0, *)
extension MainSplitViewController: TuskerRootViewController {
func presentCompose() {
let compose = ComposeViewController(mastodonController: mastodonController)
let navigationController = EnhancedNavigationViewController(rootViewController: compose)
navigationController.presentationController?.delegate = compose
present(navigationController, animated: true)
}
func select(tab: MainTabBarViewController.Tab) {
if tab == .compose {
presentCompose()
} else {
select(item: .tab(tab))
}
}
}