// // MenuController.swift // Tusker // // Created by Shadowfacts on 11/14/20. // Copyright © 2020 Shadowfacts. All rights reserved. // import UIKit struct MenuController { static func composeCommand() -> UIKeyCommand { let selector: Selector if #available(iOS 14.0, *) { selector = #selector(MainSplitViewController.presentCompose) } else { selector = #selector(MainTabBarViewController.presentCompose) } return UIKeyCommand(title: "Compose", action: selector, input: "n", modifierFlags: .command) } static func refreshCommand(discoverabilityTitle: String?) -> UIKeyCommand { return UIKeyCommand(title: "Refresh", action: #selector(RefreshableViewController.refresh), input: "r", modifierFlags: .command, discoverabilityTitle: discoverabilityTitle) } @available(iOS 14.0, *) static func sidebarCommand(item: MainSidebarViewController.Item, command: String) -> UIKeyCommand { let data: Any if case let .tab(tab) = item { data = tab.rawValue } else if case .search = item { data = "search" } else if case .bookmarks = item { data = "bookmarks" } else { fatalError() } return UIKeyCommand( title: item.title, image: UIImage(systemName: item.imageName!), action: #selector(MainSplitViewController.handleSidebarItemCommand(_:)), input: command, modifierFlags: .command, propertyList: data ) } @available(iOS 14.0, *) static func sidebarItemKeyCommands() -> [UIKeyCommand] { return [ sidebarCommand(item: .tab(.timelines), command: "1"), sidebarCommand(item: .tab(.notifications), command: "2"), sidebarCommand(item: .search, command: "3"), sidebarCommand(item: .bookmarks, command: "4"), sidebarCommand(item: .tab(.myProfile), command: "5"), ] } static func buildMainMenu(builder: UIMenuBuilder) { builder.insertChild(buildFileMenu(), atStartOfMenu: .file) builder.insertChild(buildViewMenu(), atStartOfMenu: .view) } private static func buildFileMenu() -> UIMenu { return UIMenu( title: "", image: nil, identifier: nil, options: .displayInline, children: [ composeCommand(), refreshCommand(discoverabilityTitle: nil), ] ) } private static func buildViewMenu() -> UIMenu { let children: [UIMenuElement] if #available(iOS 14.0, *) { children = sidebarItemKeyCommands() } else { children = [] } return UIMenu( title: "", image: nil, identifier: nil, options: .displayInline, children: children ) } } extension MenuController { @available(iOS 14.0, *) class SidebarItem: NSObject, NSCopying { let item: MainSidebarViewController.Item init(item: MainSidebarViewController.Item) { self.item = item } func copy(with zone: NSZone? = nil) -> Any { return SidebarItem(item: self.item) } } }