Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/public/gui/hotkeys/HotkeysPage.js
class HotkeysPage | class HotkeysPage | ||||
{ | { | ||||
constructor() | constructor(metadata) | ||||
{ | { | ||||
this.metadata = metadata; | |||||
Engine.GetGUIObjectByName("hotkeyList").onMouseLeftDoubleClickItem = () => { | Engine.GetGUIObjectByName("hotkeyList").onMouseLeftDoubleClickItem = () => { | ||||
let idx = Engine.GetGUIObjectByName("hotkeyList").selected; | let idx = Engine.GetGUIObjectByName("hotkeyList").selected; | ||||
let picker = new HotkeyPicker( | let picker = new HotkeyPicker( | ||||
this.metadata, | |||||
this.onHotkeyPicked.bind(this), | this.onHotkeyPicked.bind(this), | ||||
Engine.GetGUIObjectByName("hotkeyList").list_data[idx], | Engine.GetGUIObjectByName("hotkeyList").list_data[idx], | ||||
clone(this.hotkeys[Engine.GetGUIObjectByName("hotkeyList").list_data[idx]]) | clone(this.hotkeys[Engine.GetGUIObjectByName("hotkeyList").list_data[idx]]) | ||||
); | ); | ||||
}; | }; | ||||
Engine.GetGUIObjectByName("hotkeyList").onHoverChange = () => this.onHoverChange(); | |||||
Engine.GetGUIObjectByName("hotkeyFilter").onSelectionChange = () => this.setupHotkeyList(); | Engine.GetGUIObjectByName("hotkeyFilter").onSelectionChange = () => this.setupHotkeyList(); | ||||
Engine.GetGUIObjectByName("hotkeyFilter").onHoverChange = () => { | |||||
let dropdown = Engine.GetGUIObjectByName("hotkeyFilter"); | |||||
if (dropdown.hovered === -1) | |||||
dropdown.tooltip = ""; | |||||
else | |||||
{ | |||||
if (dropdown.list_data[dropdown.hovered] == -1) | |||||
dropdown.tooltip = ""; | |||||
else | |||||
dropdown.tooltip = translate(this.categories[dropdown.list_data[dropdown.hovered]].desc); | |||||
} | |||||
}; | |||||
Engine.GetGUIObjectByName("hotkeyTextFilter").onTextEdit = () => this.setupHotkeyList(); | Engine.GetGUIObjectByName("hotkeyTextFilter").onTextEdit = () => this.setupHotkeyList(); | ||||
this.saveButton = Engine.GetGUIObjectByName("hotkeySave"); | this.saveButton = Engine.GetGUIObjectByName("hotkeySave"); | ||||
this.saveButton.enabled = false; | this.saveButton.enabled = false; | ||||
Engine.GetGUIObjectByName("hotkeyClose").onPress = () => Engine.PopGuiPage(); | Engine.GetGUIObjectByName("hotkeyClose").onPress = () => Engine.PopGuiPage(); | ||||
Engine.GetGUIObjectByName("hotkeyReset").onPress = () => this.resetUserHotkeys(); | Engine.GetGUIObjectByName("hotkeyReset").onPress = () => this.resetUserHotkeys(); | ||||
this.saveButton.onPress = () => { | this.saveButton.onPress = () => { | ||||
this.saveUserHotkeys(); | this.saveUserHotkeys(); | ||||
this.saveButton.enabled = false; | this.saveButton.enabled = false; | ||||
}; | }; | ||||
this.setupHotkeyData(); | this.setupHotkeyData(); | ||||
this.setupFilters(); | this.setupFilters(); | ||||
this.setupHotkeyList(); | this.setupHotkeyList(); | ||||
} | } | ||||
setupHotkeyData() | |||||
{ | |||||
let hotkeydata = Engine.GetHotkeyMap(); | |||||
this.hotkeys = hotkeydata; | |||||
let categories = clone(this.metadata.categories); | |||||
for (let name in categories) | |||||
categories[name].hotkeys = []; | |||||
for (let hotkeyName in this.hotkeys) | |||||
{ | |||||
if (this.metadata.hotkeys[hotkeyName]) | |||||
for (let cat of this.metadata.hotkeys[hotkeyName].categories) | |||||
categories[cat].hotkeys.push(hotkeyName); | |||||
else | |||||
categories[this.metadata.DEFAULT_CATEGORY].hotkeys.push(hotkeyName); | |||||
} | |||||
for (let cat in categories) | |||||
categories[cat].hotkeys.sort((a, b) => { | |||||
if (!this.metadata.hotkeys[a] || !this.metadata.hotkeys[b]) | |||||
return !this.metadata.hotkeys[a] ? 1 : -1; | |||||
return this.metadata.hotkeys[a].order - this.metadata.hotkeys[b].order; | |||||
}); | |||||
for (let cat in categories) | |||||
if (categories[cat].hotkeys.length === 0) | |||||
delete categories[cat]; | |||||
this.categories = categories; | |||||
} | |||||
setupFilters() | setupFilters() | ||||
{ | { | ||||
let dropdown = Engine.GetGUIObjectByName("hotkeyFilter"); | let dropdown = Engine.GetGUIObjectByName("hotkeyFilter"); | ||||
let names = []; | let names = []; | ||||
for (let cat in this.categories) | for (let cat in this.categories) | ||||
names.push(this.categories[cat].label); | names.push(translate(this.categories[cat].name)); | ||||
dropdown.list = [translate("All Hotkeys")].concat(names); | dropdown.list = [translate("All Hotkeys")].concat(names); | ||||
dropdown.list_data = [-1].concat(Object.keys(this.categories)); | dropdown.list_data = [-1].concat(Object.keys(this.categories)); | ||||
dropdown.selected = 0; | dropdown.selected = 0; | ||||
} | } | ||||
setupHotkeyList() | setupHotkeyList() | ||||
{ | { | ||||
let hotkeyList = Engine.GetGUIObjectByName("hotkeyList"); | let hotkeyList = Engine.GetGUIObjectByName("hotkeyList"); | ||||
hotkeyList.selected = -1; | hotkeyList.selected = -1; | ||||
let textFilter = Engine.GetGUIObjectByName("hotkeyTextFilter").caption; | let textFilter = Engine.GetGUIObjectByName("hotkeyTextFilter").caption; | ||||
let hotkeys; | |||||
let dropdown = Engine.GetGUIObjectByName("hotkeyFilter"); | let dropdown = Engine.GetGUIObjectByName("hotkeyFilter"); | ||||
if (dropdown.selected && dropdown.selected !== 0) | if (dropdown.selected && dropdown.selected !== 0) | ||||
{ | hotkeys = this.categories[dropdown.list_data[dropdown.selected]].hotkeys; | ||||
let category = this.categories[dropdown.list_data[dropdown.selected]]; | else | ||||
// This is inefficient but it seems fast enough. | hotkeys = Object.values(this.categories).map(x => x.hotkeys).flat(); | ||||
let hotkeys = category.hotkeys.filter(x => translate(x[0]).indexOf(textFilter) !== -1); | hotkeys = hotkeys.filter(x => { | ||||
hotkeyList.list_name = hotkeys.map(x => translate(x[0])); | return x.indexOf(textFilter) !== -1 || | ||||
hotkeyList.list_mapping = hotkeys.map(x => formatHotkeyCombinations(x[1])); | translate(this.metadata.hotkeys[x]?.name || x).indexOf(textFilter) !== -1; | ||||
}); | |||||
hotkeyList.list_name = hotkeys.map(x => translate(this.metadata.hotkeys[x]?.name || x)); | |||||
hotkeyList.list_mapping = hotkeys.map(x => formatHotkeyCombinations(this.hotkeys[x])); | |||||
hotkeyList.list = hotkeys.map(() => 0); | hotkeyList.list = hotkeys.map(() => 0); | ||||
hotkeyList.list_data = hotkeys.map(x => x[0]); | hotkeyList.list_data = hotkeys.map(x => x); | ||||
} | } | ||||
onHoverChange() | |||||
{ | |||||
let hotkeyList = Engine.GetGUIObjectByName("hotkeyList"); | |||||
if (hotkeyList.hovered === -1) | |||||
hotkeyList.tooltip = ""; | |||||
else | else | ||||
{ | { | ||||
// TODO SM62+ : refactor using flat() | let hotkey = hotkeyList.list_data[hotkeyList.hovered]; | ||||
let flattened = []; | let tooltip = this.metadata.hotkeys[hotkey]?.desc || markForTranslation("No tooltip available"); | ||||
for (let cat in this.categories) | hotkeyList.tooltip = translate(tooltip); | ||||
flattened = flattened.concat(this.categories[cat].hotkeys); | |||||
flattened = flattened.filter(x => translate(x[0]).indexOf(textFilter) !== -1); | |||||
hotkeyList.list_name = flattened.map(x => translate(x[0])); | |||||
hotkeyList.list_mapping = flattened.map(x => formatHotkeyCombinations(x[1])); | |||||
hotkeyList.list = flattened.map(() => 0); | |||||
hotkeyList.list_data = flattened.map(x => x[0]); | |||||
} | } | ||||
} | } | ||||
onHotkeyPicked(picker, success) | onHotkeyPicked(picker, success) | ||||
{ | { | ||||
picker.close(); | picker.close(); | ||||
if (!success) | if (!success) | ||||
return; | return; | ||||
Show All 11 Lines | for (let cat in this.categories) | ||||
continue; | continue; | ||||
this.categories[cat].hotkeys[idx][1] = picker.combinations; | this.categories[cat].hotkeys[idx][1] = picker.combinations; | ||||
} | } | ||||
this.saveButton.enabled = true; | this.saveButton.enabled = true; | ||||
this.setupHotkeyList(); | this.setupHotkeyList(); | ||||
} | } | ||||
setupHotkeyData() | |||||
{ | |||||
let hotkeydata = Engine.GetHotkeyMap(); | |||||
this.hotkeys = hotkeydata; | |||||
let categories = { | |||||
"other": { | |||||
"label": translate("Other hotkeys"), | |||||
"hotkeys": [] | |||||
} | |||||
}; | |||||
let n_categories = 1; | |||||
for (let hotkeyName in this.hotkeys) | |||||
{ | |||||
let category = "other"; | |||||
let firstdot = hotkeyName.indexOf('.'); | |||||
if (firstdot !== -1) | |||||
category = hotkeyName.substr(0, firstdot); | |||||
if (!(category in categories)) | |||||
{ | |||||
if (n_categories > 18) | |||||
category = "other"; | |||||
categories[category] = { | |||||
"label": category, | |||||
"hotkeys": [] | |||||
}; | |||||
} | |||||
categories[category].hotkeys.push([hotkeyName, this.hotkeys[hotkeyName]]); | |||||
} | |||||
// Remove categories that are too small to deserve a tab. | |||||
for (let cat of Object.keys(categories)) | |||||
if (categories[cat].hotkeys.length < 3) | |||||
{ | |||||
categories.other.hotkeys = categories.other.hotkeys.concat(categories[cat].hotkeys); | |||||
delete categories[cat]; | |||||
} | |||||
for (let cat in categories) | |||||
categories[cat].hotkeys = categories[cat].hotkeys.sort(); | |||||
this.categories = categories; | |||||
} | |||||
resetUserHotkeys() | resetUserHotkeys() | ||||
{ | { | ||||
messageBox( | messageBox( | ||||
400, 200, | 400, 200, | ||||
translate("Reset all hotkeys to default values?\nWARNING: this cannot be reversed."), | translate("Reset all hotkeys to default values?\nWARNING: this cannot be reversed."), | ||||
translate("Confirmation"), | translate("Confirmation"), | ||||
[translate("No"), translate("Yes")], | [translate("No"), translate("Yes")], | ||||
[ | [ | ||||
Show All 25 Lines | for (let hotkey in this.hotkeys) | ||||
Engine.ConfigDB_CreateValues("user", "hotkey." + hotkey, keymap); | Engine.ConfigDB_CreateValues("user", "hotkey." + hotkey, keymap); | ||||
} | } | ||||
Engine.ConfigDB_WriteFile("user", "config/user.cfg"); | Engine.ConfigDB_WriteFile("user", "config/user.cfg"); | ||||
Engine.ReloadHotkeys(); | Engine.ReloadHotkeys(); | ||||
} | } | ||||
} | } | ||||
function init(data) | function init() | ||||
{ | { | ||||
let hotkeyPage = new HotkeysPage(data); | let hotkeyPage = new HotkeysPage(new HotkeyMetadata()); | ||||
} | } |
Wildfire Games · Phabricator