mastodon-ios/Mastodon/Protocol/PagerTabStripNavigateable.s...

107 lines
3.3 KiB
Swift

//
// PagerTabStripNavigateable.swift
// Mastodon
//
// Created by MainasuK on 2022-6-2.
//
import UIKit
import XLPagerTabStrip
import MastodonLocalization
typealias PagerTabStripNavigateable = PagerTabStripNavigateableCore & PagerTabStripNavigateableRelay
protocol PagerTabStripNavigateableCore: AnyObject {
var navigateablePageViewController: PagerTabStripViewController { get }
var pagerTabStripNavigateKeyCommands: [UIKeyCommand] { get }
func pagerTabStripNavigateKeyCommandHandler(_ sender: UIKeyCommand)
func navigate(direction: PagerTabStripNavigationDirection)
}
@objc protocol PagerTabStripNavigateableRelay: AnyObject {
func pagerTabStripNavigateKeyCommandHandlerRelay(_ sender: UIKeyCommand)
}
enum PagerTabStripNavigationDirection: 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 PagerTabStripNavigateableCore where Self: PagerTabStripNavigateableRelay {
var pagerTabStripNavigateKeyCommands: [UIKeyCommand] {
PagerTabStripNavigationDirection.allCases.map { direction in
UIKeyCommand(
title: direction.title,
image: nil,
action: #selector(Self.pagerTabStripNavigateKeyCommandHandlerRelay(_:)),
input: direction.input,
modifierFlags: direction.modifierFlags,
propertyList: direction.propertyList,
alternates: [],
discoverabilityTitle: nil,
attributes: [],
state: .off
)
}
}
func pagerTabStripNavigateKeyCommandHandler(_ sender: UIKeyCommand) {
guard let rawValue = sender.propertyList as? String,
let direction = PagerTabStripNavigationDirection(rawValue: rawValue) else { return }
navigate(direction: direction)
}
}
extension PagerTabStripNavigateableCore {
func navigate(direction: PagerTabStripNavigationDirection) {
let index = navigateablePageViewController.currentIndex
let targetIndex: Int
switch direction {
case .previous:
targetIndex = index - 1
case .next:
targetIndex = index + 1
}
guard targetIndex >= 0,
!navigateablePageViewController.viewControllers.isEmpty,
targetIndex < navigateablePageViewController.viewControllers.count,
navigateablePageViewController.canMoveTo(index: targetIndex)
else {
return
}
navigateablePageViewController.moveToViewController(at: targetIndex)
}
}