93 lines
2.7 KiB
Swift
93 lines
2.7 KiB
Swift
//
|
|
// PageboyNavigateable.swift
|
|
// Mastodon
|
|
//
|
|
// Created by MainasuK on 2022-5-11.
|
|
//
|
|
|
|
import UIKit
|
|
import Pageboy
|
|
import MastodonLocalization
|
|
|
|
typealias PageboyNavigateable = PageboyNavigateableCore & PageboyNavigateableRelay
|
|
|
|
protocol PageboyNavigateableCore: AnyObject {
|
|
var navigateablePageViewController: PageboyViewController { get }
|
|
var pageboyNavigateKeyCommands: [UIKeyCommand] { get }
|
|
|
|
func pageboyNavigateKeyCommandHandler(_ sender: UIKeyCommand)
|
|
func navigate(direction: PageboyNavigationDirection)
|
|
}
|
|
|
|
@objc protocol PageboyNavigateableRelay: AnyObject {
|
|
func pageboyNavigateKeyCommandHandlerRelay(_ sender: UIKeyCommand)
|
|
}
|
|
|
|
enum PageboyNavigationDirection: String, CaseIterable {
|
|
case previous
|
|
case next
|
|
|
|
var title: String {
|
|
switch self {
|
|
case .previous: return L10n.Common.Controls.Keyboard.SegmentedControl.previousSection
|
|
case .next: return L10n.Common.Controls.Keyboard.SegmentedControl.nextSection
|
|
}
|
|
}
|
|
|
|
// UIKeyCommand input
|
|
var input: String {
|
|
switch self {
|
|
case .previous: return "["
|
|
case .next: return "]"
|
|
}
|
|
}
|
|
|
|
var modifierFlags: UIKeyModifierFlags {
|
|
switch self {
|
|
case .previous: return [.shift, .command]
|
|
case .next: return [.shift, .command]
|
|
}
|
|
}
|
|
|
|
var propertyList: Any {
|
|
return rawValue
|
|
}
|
|
}
|
|
|
|
extension PageboyNavigateableCore where Self: PageboyNavigateableRelay {
|
|
var pageboyNavigateKeyCommands: [UIKeyCommand] {
|
|
PageboyNavigationDirection.allCases.map { direction in
|
|
UIKeyCommand(
|
|
title: direction.title,
|
|
image: nil,
|
|
action: #selector(Self.pageboyNavigateKeyCommandHandlerRelay(_:)),
|
|
input: direction.input,
|
|
modifierFlags: direction.modifierFlags,
|
|
propertyList: direction.propertyList,
|
|
alternates: [],
|
|
discoverabilityTitle: nil,
|
|
attributes: [],
|
|
state: .off
|
|
)
|
|
}
|
|
}
|
|
|
|
func pageboyNavigateKeyCommandHandler(_ sender: UIKeyCommand) {
|
|
guard let rawValue = sender.propertyList as? String,
|
|
let direction = PageboyNavigationDirection(rawValue: rawValue) else { return }
|
|
navigate(direction: direction)
|
|
}
|
|
|
|
}
|
|
|
|
extension PageboyNavigateableCore {
|
|
func navigate(direction: PageboyNavigationDirection) {
|
|
switch direction {
|
|
case .previous:
|
|
navigateablePageViewController.scrollToPage(.previous, animated: true)
|
|
case .next:
|
|
navigateablePageViewController.scrollToPage(.next, animated: true)
|
|
}
|
|
}
|
|
}
|