source: ps/trunk/binaries/data/mods/public/gui/hotkeys/HotkeysPage.js@ 25282

Last change on this file since 25282 was 25282, checked in by Freagarach, 3 years ago

Fix some translations.

  • Idle builder hotkey r25174 / rP25174.
  • "Other hotkey"-catagory.
  • Tooltipless hotkeys.

Patch by: @nwtour
Differential revision: https://code.wildfiregames.com/D3862

  • Property svn:eol-style set to native
File size: 6.3 KB
Line 
1class 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
193function init()
194{
195 let hotkeyPage = new HotkeysPage(new HotkeyMetadata());
196}
197
198HotkeysPage.prototype.UnavailableTooltipString = markForTranslation("No tooltip available.");
Note: See TracBrowser for help on using the repository browser.