Tusker/Tusker/Controllers/MenuController.swift

110 lines
3.3 KiB
Swift
Raw Normal View History

2020-11-14 16:10:20 +00:00
//
// MenuController.swift
// Tusker
//
// Created by Shadowfacts on 11/14/20.
// Copyright © 2020 Shadowfacts. All rights reserved.
//
import UIKit
struct MenuController {
2020-11-14 16:55:19 +00:00
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)
}
2020-11-14 16:10:20 +00:00
static func refreshCommand(discoverabilityTitle: String?) -> UIKeyCommand {
return UIKeyCommand(title: "Refresh", action: #selector(RefreshableViewController.refresh), input: "r", modifierFlags: .command, discoverabilityTitle: discoverabilityTitle)
}
2020-11-14 17:15:49 +00:00
@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"),
]
}
2020-11-14 16:10:20 +00:00
static func buildMainMenu(builder: UIMenuBuilder) {
2020-11-14 16:55:19 +00:00
builder.insertChild(buildFileMenu(), atStartOfMenu: .file)
2020-11-14 17:15:49 +00:00
builder.insertChild(buildViewMenu(), atStartOfMenu: .view)
2020-11-14 16:10:20 +00:00
}
2020-11-14 16:55:19 +00:00
private static func buildFileMenu() -> UIMenu {
2020-11-14 16:10:20 +00:00
return UIMenu(
title: "",
image: nil,
identifier: nil,
options: .displayInline,
children: [
2020-11-14 16:55:19 +00:00
composeCommand(),
2020-11-14 16:10:20 +00:00
refreshCommand(discoverabilityTitle: nil),
]
)
}
2020-11-14 17:15:49 +00:00
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)
}
}
2020-11-14 16:10:20 +00:00
}