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