1 // Copyright 2015-present 650 Industries. All rights reserved. 2 3 import Foundation 4 import UIKit 5 6 @objc 7 open class DevMenuAction: DevMenuScreenItem, DevMenuCallableProvider { 8 @objc 9 public var callable: DevMenuExportedAction 10 11 @objc 12 public var action: () -> Void { 13 get { return self.callable.action } 14 set { self.callable.action = newValue } 15 } 16 17 @objc 18 open var isAvailable: () -> Bool { 19 get { 20 return self.callable.isAvailable 21 } 22 set { 23 self.callable.isAvailable = newValue 24 } 25 } 26 27 @objc 28 open var isEnabled: () -> Bool = { false } 29 30 @objc 31 open var label: () -> String = { "" } 32 33 @objc 34 open var detail: () -> String = { "" } 35 36 @objc 37 open var glyphName: () -> String = { "" } 38 39 @objc 40 public init(withId id: String) { 41 self.callable = DevMenuExportedAction(withId: id, withAction: {}) 42 super.init(type: .Action) 43 } 44 45 @objc 46 public convenience init(withId id: String, action: @escaping () -> Void) { 47 self.init(withId: id) 48 self.callable.action = action 49 } 50 51 @objc 52 public convenience init(withId id: String, _ action: @escaping () -> Void) { 53 self.init(withId: id, action: action) 54 } 55 registerCallablenull56 public func registerCallable() -> DevMenuExportedCallable? { 57 return self.callable 58 } 59 60 @objc registerKeyCommandnull61 open func registerKeyCommand(input: String, modifiers: UIKeyModifierFlags) { 62 self.callable.registerKeyCommand(input: input, modifiers: modifiers) 63 } 64 65 @objc serializenull66 open override func serialize() -> [String: Any] { 67 var dict = super.serialize() 68 dict["actionId"] = self.callable.id 69 dict["keyCommand"] = self.callable.keyCommand == nil ? nil : [ 70 "input": self.callable.keyCommand!.input!, 71 "modifiers": exportKeyCommandModifiers() 72 ] 73 74 dict["isAvailable"] = isAvailable() 75 dict["isEnabled"] = isAvailable() 76 dict["label"] = label() 77 dict["detail"] = detail() 78 dict["glyphName"] = glyphName() 79 80 return dict 81 } 82 exportKeyCommandModifiersnull83 private func exportKeyCommandModifiers() -> Int { 84 var exportedValue = 0 85 let keyCommand = self.callable.keyCommand! 86 87 if keyCommand.modifierFlags.contains(.control) { 88 exportedValue += 1 << 0 89 } 90 91 if keyCommand.modifierFlags.contains(.alternate) { 92 exportedValue += 1 << 1 93 } 94 95 if keyCommand.modifierFlags.contains(.command) { 96 exportedValue += 1 << 2 97 } 98 99 if keyCommand.modifierFlags.contains(.shift) { 100 exportedValue += 1 << 3 101 } 102 103 return exportedValue 104 } 105 } 106