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