GBA001/Delta/Components/Action.swift
2020-02-06 14:37:21 -08:00

143 lines
3.2 KiB
Swift

//
// Action.swift
// Delta
//
// Created by Riley Testut on 5/18/16.
// Copyright © 2016 Riley Testut. All rights reserved.
//
import UIKit
extension Action
{
enum Style
{
case `default`
case cancel
case destructive
case selected
var alertActionStyle: UIAlertAction.Style {
switch self
{
case .default, .selected: return .default
case .cancel: return .cancel
case .destructive: return .destructive
}
}
var previewActionStyle: UIPreviewAction.Style? {
switch self
{
case .default: return .default
case .destructive: return .destructive
case .selected: return .selected
case .cancel: return nil
}
}
}
}
@available(iOS 13, *)
extension Action.Style
{
var menuAttributes: UIMenuElement.Attributes {
switch self
{
case .default, .cancel, .selected: return []
case .destructive: return .destructive
}
}
var menuState: UIMenuElement.State {
switch self
{
case .default, .cancel, .destructive: return .off
case .selected: return .on
}
}
}
struct Action
{
var title: String
var style: Style
var image: UIImage? = nil
var action: ((Action) -> Void)?
init(title: String, style: Style = .default, image: UIImage? = nil, action: ((Action) -> Void)? = nil)
{
self.title = title
self.style = style
self.image = image
self.action = action
}
}
extension UIAlertAction
{
convenience init(_ action: Action)
{
self.init(title: action.title, style: action.style.alertActionStyle) { (alertAction) in
action.action?(action)
}
}
}
extension UIPreviewAction
{
convenience init?(_ action: Action)
{
guard let previewActionStyle = action.style.previewActionStyle else { return nil }
self.init(title: action.title, style: previewActionStyle) { (previewAction, viewController) in
action.action?(action)
}
}
}
extension UIAlertController
{
convenience init(actions: [Action])
{
self.init(title: nil, message: nil, preferredStyle: .actionSheet)
for action in actions.alertActions
{
self.addAction(action)
}
}
}
@available(iOS 13.0, *)
extension UIAction
{
convenience init?(_ action: Action)
{
guard action.style != .cancel else { return nil }
self.init(title: action.title, image: action.image, attributes: action.style.menuAttributes, state: action.style.menuState) { _ in
action.action?(action)
}
}
}
extension RangeReplaceableCollection where Iterator.Element == Action
{
var alertActions: [UIAlertAction] {
let actions = self.map { UIAlertAction($0) }
return actions
}
var previewActions: [UIPreviewAction] {
let actions = self.compactMap { UIPreviewAction($0) }
return actions
}
@available(iOS 13.0, *)
var menuActions: [UIAction] {
let actions = self.compactMap { UIAction($0) }
return actions
}
}