1 | class HotkeysPage
|
---|
2 | {
|
---|
3 | constructor(metadata)
|
---|
4 | {
|
---|
5 | this.metadata = metadata;
|
---|
6 |
|
---|
7 | Engine.GetGUIObjectByName("hotkeyList").onMouseLeftDoubleClickItem = () => {
|
---|
8 | let idx = Engine.GetGUIObjectByName("hotkeyList").selected;
|
---|
9 | let picker = new HotkeyPicker(
|
---|
10 | this.metadata,
|
---|
11 | this.onHotkeyPicked.bind(this),
|
---|
12 | Engine.GetGUIObjectByName("hotkeyList").list_data[idx],
|
---|
13 | clone(this.hotkeys[Engine.GetGUIObjectByName("hotkeyList").list_data[idx]])
|
---|
14 | );
|
---|
15 | };
|
---|
16 | Engine.GetGUIObjectByName("hotkeyList").onHoverChange = () => this.onHotkeyHover();
|
---|
17 |
|
---|
18 | Engine.GetGUIObjectByName("hotkeyFilter").onSelectionChange = () => this.setupHotkeyList();
|
---|
19 | Engine.GetGUIObjectByName("hotkeyFilter").onHoverChange = () => this.onFilterHover();
|
---|
20 |
|
---|
21 | Engine.GetGUIObjectByName("hotkeyTextFilter").onTextEdit = () => this.setupHotkeyList();
|
---|
22 |
|
---|
23 | this.saveButton = Engine.GetGUIObjectByName("hotkeySave");
|
---|
24 | this.saveButton.enabled = false;
|
---|
25 |
|
---|
26 | Engine.GetGUIObjectByName("hotkeyClose").onPress = () => Engine.PopGuiPage();
|
---|
27 | Engine.GetGUIObjectByName("hotkeyReset").onPress = () => this.resetUserHotkeys();
|
---|
28 | this.saveButton.onPress = () => {
|
---|
29 | this.saveUserHotkeys();
|
---|
30 | this.saveButton.enabled = false;
|
---|
31 | };
|
---|
32 |
|
---|
33 | this.setupHotkeyData();
|
---|
34 | this.setupFilters();
|
---|
35 | this.setupHotkeyList();
|
---|
36 | }
|
---|
37 |
|
---|
38 | setupHotkeyData()
|
---|
39 | {
|
---|
40 | let hotkeydata = Engine.GetHotkeyMap();
|
---|
41 | this.hotkeys = hotkeydata;
|
---|
42 | let categories = clone(this.metadata.categories);
|
---|
43 | for (let name in categories)
|
---|
44 | categories[name].hotkeys = [];
|
---|
45 | // Add hotkeys defined in the metadata but not in the C++ map.
|
---|
46 | for (let hotkeyName in this.metadata.hotkeys)
|
---|
47 | if (!this.hotkeys[hotkeyName])
|
---|
48 | this.hotkeys[hotkeyName] = [];
|
---|
49 | for (let hotkeyName in this.hotkeys)
|
---|
50 | {
|
---|
51 | if (this.metadata.hotkeys[hotkeyName])
|
---|
52 | for (let cat of this.metadata.hotkeys[hotkeyName].categories)
|
---|
53 | categories[cat].hotkeys.push(hotkeyName);
|
---|
54 | else
|
---|
55 | categories[this.metadata.DEFAULT_CATEGORY].hotkeys.push(hotkeyName);
|
---|
56 | }
|
---|
57 | for (let cat in categories)
|
---|
58 | categories[cat].hotkeys.sort((a, b) => {
|
---|
59 | if (!this.metadata.hotkeys[a] || !this.metadata.hotkeys[b])
|
---|
60 | return !this.metadata.hotkeys[a] ? 1 : -1;
|
---|
61 | return this.metadata.hotkeys[a].order - this.metadata.hotkeys[b].order;
|
---|
62 | });
|
---|
63 | for (let cat in categories)
|
---|
64 | if (categories[cat].hotkeys.length === 0)
|
---|
65 | delete categories[cat];
|
---|
66 | this.categories = categories;
|
---|
67 | }
|
---|
68 |
|
---|
69 | setupFilters()
|
---|
70 | {
|
---|
71 | let dropdown = Engine.GetGUIObjectByName("hotkeyFilter");
|
---|
72 | let names = [];
|
---|
73 | for (let cat in this.categories)
|
---|
74 | names.push(translateWithContext("hotkey metadata", this.categories[cat].name));
|
---|
75 | dropdown.list = [translate("All Hotkeys")].concat(names);
|
---|
76 | dropdown.list_data = [-1].concat(Object.keys(this.categories));
|
---|
77 | dropdown.selected = 0;
|
---|
78 | }
|
---|
79 |
|
---|
80 | setupHotkeyList()
|
---|
81 | {
|
---|
82 | let hotkeyList = Engine.GetGUIObjectByName("hotkeyList");
|
---|
83 | hotkeyList.selected = -1;
|
---|
84 | let textFilter = Engine.GetGUIObjectByName("hotkeyTextFilter").caption.toLowerCase();
|
---|
85 |
|
---|
86 | let hotkeys;
|
---|
87 | let dropdown = Engine.GetGUIObjectByName("hotkeyFilter");
|
---|
88 | if (dropdown.selected && dropdown.selected !== 0)
|
---|
89 | hotkeys = this.categories[dropdown.list_data[dropdown.selected]].hotkeys;
|
---|
90 | else
|
---|
91 | hotkeys = Object.values(this.categories).map(x => x.hotkeys).flat();
|
---|
92 | hotkeys = hotkeys.filter(x => {
|
---|
93 | return x.indexOf(textFilter) !== -1 ||
|
---|
94 | translateWithContext("hotkey metadata", this.metadata.hotkeys[x]?.name || x).toLowerCase().indexOf(textFilter) !== -1;
|
---|
95 | });
|
---|
96 |
|
---|
97 | hotkeyList.list_name = hotkeys.map(x => translateWithContext("hotkey metadata", this.metadata.hotkeys[x]?.name || x));
|
---|
98 | hotkeyList.list_mapping = hotkeys.map(x => formatHotkeyCombinations(this.hotkeys[x]));
|
---|
99 | hotkeyList.list = hotkeys.map(() => 0);
|
---|
100 | hotkeyList.list_data = hotkeys.map(x => x);
|
---|
101 | }
|
---|
102 |
|
---|
103 | onFilterHover()
|
---|
104 | {
|
---|
105 | let dropdown = Engine.GetGUIObjectByName("hotkeyFilter");
|
---|
106 | if (dropdown.hovered === -1)
|
---|
107 | dropdown.tooltip = "";
|
---|
108 | else if (dropdown.hovered === 0)
|
---|
109 | dropdown.tooltip = translate("All available hotkeys.");
|
---|
110 | else
|
---|
111 | dropdown.tooltip = translateWithContext("hotkey metadata", this.categories[dropdown.list_data[dropdown.hovered]].desc);
|
---|
112 | }
|
---|
113 |
|
---|
114 | onHotkeyHover()
|
---|
115 | {
|
---|
116 | let hotkeyList = Engine.GetGUIObjectByName("hotkeyList");
|
---|
117 | if (hotkeyList.hovered === -1)
|
---|
118 | hotkeyList.tooltip = "";
|
---|
119 | else
|
---|
120 | {
|
---|
121 | let hotkey = hotkeyList.list_data[hotkeyList.hovered];
|
---|
122 | hotkeyList.tooltip = this.metadata.hotkeys[hotkey]?.desc ?
|
---|
123 | translateWithContext("hotkey metadata", this.metadata.hotkeys[hotkey]?.desc) :
|
---|
124 | translate(this.UnavailableTooltipString);
|
---|
125 | }
|
---|
126 | }
|
---|
127 |
|
---|
128 | onHotkeyPicked(picker, success)
|
---|
129 | {
|
---|
130 | picker.close();
|
---|
131 | if (!success)
|
---|
132 | return;
|
---|
133 |
|
---|
134 | // Remove empty combinations which the picker added.
|
---|
135 | picker.combinations = picker.combinations.filter(x => x.length);
|
---|
136 |
|
---|
137 | this.hotkeys[picker.name] = picker.combinations;
|
---|
138 | // Have to find the correct line.
|
---|
139 | let panel = Engine.GetGUIObjectByName("hotkeyList");
|
---|
140 | for (let cat in this.categories)
|
---|
141 | {
|
---|
142 | let idx = this.categories[cat].hotkeys.findIndex(([name, _]) => name == picker.name);
|
---|
143 | if (idx === -1)
|
---|
144 | continue;
|
---|
145 | this.categories[cat].hotkeys[idx][1] = picker.combinations;
|
---|
146 | }
|
---|
147 |
|
---|
148 | this.saveButton.enabled = true;
|
---|
149 | this.setupHotkeyList();
|
---|
150 | }
|
---|
151 |
|
---|
152 | resetUserHotkeys()
|
---|
153 | {
|
---|
154 | messageBox(
|
---|
155 | 400, 200,
|
---|
156 | translate("Reset all hotkeys to default values?\nWARNING: this cannot be reversed."),
|
---|
157 | translate("Confirmation"),
|
---|
158 | [translate("No"), translate("Yes")],
|
---|
159 | [
|
---|
160 | () => {},
|
---|
161 | () => {
|
---|
162 | for (let cat in this.categories)
|
---|
163 | this.categories[cat].hotkeys.forEach(([name, _]) => {
|
---|
164 | Engine.ConfigDB_RemoveValue("user", "hotkey." + name);
|
---|
165 | });
|
---|
166 | Engine.ConfigDB_WriteFile("user", "config/user.cfg");
|
---|
167 | Engine.ReloadHotkeys();
|
---|
168 | this.saveButton.enabled = false;
|
---|
169 | this.setupHotkeyData();
|
---|
170 | this.setupHotkeyList();
|
---|
171 | }
|
---|
172 | ]);
|
---|
173 | }
|
---|
174 |
|
---|
175 | saveUserHotkeys()
|
---|
176 | {
|
---|
177 | for (let hotkey in this.hotkeys)
|
---|
178 | Engine.ConfigDB_RemoveValue("user", "hotkey." + hotkey);
|
---|
179 | Engine.ReloadHotkeys();
|
---|
180 | let defaultData = Engine.GetHotkeyMap();
|
---|
181 | for (let hotkey in this.hotkeys)
|
---|
182 | {
|
---|
183 | let keymap = formatHotkeyCombinations(this.hotkeys[hotkey], false);
|
---|
184 | if (keymap.join("") !== formatHotkeyCombinations(defaultData[hotkey], false).join(""))
|
---|
185 | Engine.ConfigDB_CreateValues("user", "hotkey." + hotkey, keymap);
|
---|
186 | }
|
---|
187 | Engine.ConfigDB_WriteFile("user", "config/user.cfg");
|
---|
188 | Engine.ReloadHotkeys();
|
---|
189 | }
|
---|
190 | }
|
---|
191 |
|
---|
192 |
|
---|
193 | function init()
|
---|
194 | {
|
---|
195 | let hotkeyPage = new HotkeysPage(new HotkeyMetadata());
|
---|
196 | }
|
---|
197 |
|
---|
198 | HotkeysPage.prototype.UnavailableTooltipString = markForTranslation("No tooltip available.");
|
---|