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