117 lines
4.1 KiB
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))
|
|
}
|
|
}
|
|
}
|