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