summaryrefslogtreecommitdiff
path: root/src/settings_gui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings_gui.cpp')
-rw-r--r--src/settings_gui.cpp45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp
index 1d38c4e43..ffa08e798 100644
--- a/src/settings_gui.cpp
+++ b/src/settings_gui.cpp
@@ -77,14 +77,10 @@ static const void *ResolveVariableAddress(const GameSettings *settings_ptr, cons
* Get index of the current screen resolution.
* @return Index of the current screen resolution if it is a known resolution, _resolutions.size() otherwise.
*/
-static uint GetCurRes()
+static uint GetCurrentResolutionIndex()
{
- uint i;
-
- for (i = 0; i != _resolutions.size(); i++) {
- if (_resolutions[i] == Dimension(_screen.width, _screen.height)) break;
- }
- return i;
+ auto it = std::find(_resolutions.begin(), _resolutions.end(), Dimension(_screen.width, _screen.height));
+ return std::distance(_resolutions.begin(), it);
}
static void ShowCustCurrency();
@@ -219,8 +215,19 @@ struct GameOptionsWindow : Window {
case WID_GO_LANG_DROPDOWN: { // Setup interface language dropdown
for (uint i = 0; i < _languages.size(); i++) {
- if (&_languages[i] == _current_language) *selected_index = i;
- list.emplace_back(new DropDownListStringItem(SPECSTR_LANGUAGE_START + i, i, false));
+ auto item = new DropDownListParamStringItem(STR_JUST_RAW_STRING, i, false);
+ if (&_languages[i] == _current_language) {
+ *selected_index = i;
+ item->SetParamStr(0, _languages[i].own_name);
+ } else {
+ /* Especially with sprite-fonts, not all localized
+ * names can be rendered. So instead, we use the
+ * international names for anything but the current
+ * selected language. This avoids showing a few ????
+ * entries in the dropdown list. */
+ item->SetParamStr(0, _languages[i].name);
+ }
+ list.emplace_back(item);
}
std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc);
break;
@@ -229,9 +236,12 @@ struct GameOptionsWindow : Window {
case WID_GO_RESOLUTION_DROPDOWN: // Setup resolution dropdown
if (_resolutions.empty()) break;
- *selected_index = GetCurRes();
+ *selected_index = GetCurrentResolutionIndex();
for (uint i = 0; i < _resolutions.size(); i++) {
- list.emplace_back(new DropDownListStringItem(SPECSTR_RESOLUTION_START + i, i, false));
+ auto item = new DropDownListParamStringItem(STR_GAME_OPTIONS_RESOLUTION_ITEM, i, false);
+ item->SetParam(0, _resolutions[i].width);
+ item->SetParam(1, _resolutions[i].height);
+ list.emplace_back(item);
}
break;
@@ -285,7 +295,6 @@ struct GameOptionsWindow : Window {
case WID_GO_CURRENCY_DROPDOWN: SetDParam(0, _currency_specs[this->opt->locale.currency].name); break;
case WID_GO_AUTOSAVE_DROPDOWN: SetDParam(0, _autosave_dropdown[_settings_client.gui.autosave]); break;
case WID_GO_LANG_DROPDOWN: SetDParamStr(0, _current_language->own_name); break;
- case WID_GO_RESOLUTION_DROPDOWN: SetDParam(0, GetCurRes() == _resolutions.size() ? STR_GAME_OPTIONS_RESOLUTION_OTHER : SPECSTR_RESOLUTION_START + GetCurRes()); break;
case WID_GO_GUI_ZOOM_DROPDOWN: SetDParam(0, _gui_zoom_dropdown[_gui_zoom_cfg != ZOOM_LVL_CFG_AUTO ? ZOOM_LVL_OUT_4X - _gui_zoom_cfg + 1 : 0]); break;
case WID_GO_FONT_ZOOM_DROPDOWN: SetDParam(0, _font_zoom_dropdown[_font_zoom_cfg != ZOOM_LVL_CFG_AUTO ? ZOOM_LVL_OUT_4X - _font_zoom_cfg + 1 : 0]); break;
case WID_GO_BASE_GRF_DROPDOWN: SetDParamStr(0, BaseGraphics::GetUsedSet()->name.c_str()); break;
@@ -294,6 +303,18 @@ struct GameOptionsWindow : Window {
case WID_GO_BASE_MUSIC_DROPDOWN: SetDParamStr(0, BaseMusic::GetUsedSet()->name.c_str()); break;
case WID_GO_BASE_MUSIC_STATUS: SetDParam(0, BaseMusic::GetUsedSet()->GetNumInvalid()); break;
case WID_GO_REFRESH_RATE_DROPDOWN: SetDParam(0, _settings_client.gui.refresh_rate); break;
+ case WID_GO_RESOLUTION_DROPDOWN: {
+ auto current_resolution = GetCurrentResolutionIndex();
+
+ if (current_resolution == _resolutions.size()) {
+ SetDParam(0, STR_GAME_OPTIONS_RESOLUTION_OTHER);
+ } else {
+ SetDParam(0, STR_GAME_OPTIONS_RESOLUTION_ITEM);
+ SetDParam(1, _resolutions[current_resolution].width);
+ SetDParam(2, _resolutions[current_resolution].height);
+ }
+ break;
+ }
}
}