// // 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)) } } }