diff --git a/src/lang/english.txt b/src/lang/english.txt index 636516900b088..047653e0bfe5d 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1017,6 +1017,10 @@ STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Double size STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad size +STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}Display refresh rate +STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :{BLACK}Select the screen refresh rate to use +STR_GAME_OPTIONS_REFRESH_RATE_OTHER :other + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Base graphics set STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Select the base graphics set to use STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} missing/corrupted file{P "" s} diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index f89b3f7187500..0fd3eeacde037 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -139,6 +139,31 @@ void ShowBaseSetTextfileWindow(TextfileType file_type, const TBaseSet* baseset, new BaseSetTextfileWindow(file_type, baseset, content_type); } +std::vector refresh_rates = { 30, 60, 75, 90, 100, 120, 144, 240 }; + +// We want 60Hz as the default for this pointer, though it gets overriden with whatever is in the config. +int *current_refresh_rate = &refresh_rates[1]; + +std::string current_refresh_rate_str = std::to_string(*current_refresh_rate) + "Hz"; + +void addRefreshRatesAndSelect() { + // Add the refresh rate as selected in the config. + int wantedRate = _settings_client.gui.refresh_rate; + if (std::find(refresh_rates.begin(), refresh_rates.end(), wantedRate) == refresh_rates.end()) { + // Custom refresh rate. Add it to the list of refresh rates. + refresh_rates.push_back(_settings_client.gui.refresh_rate); + std::sort(refresh_rates.begin(), refresh_rates.end()); + } + + // Select the set refresh rate. + for (int i = 0; i < refresh_rates.size(); i++) { + if (refresh_rates[i] == wantedRate) { + current_refresh_rate = &refresh_rates[i]; + } + } + current_refresh_rate_str = std::to_string(*current_refresh_rate) + "Hz"; +} + struct GameOptionsWindow : Window { GameSettings *opt; bool reload; @@ -148,6 +173,8 @@ struct GameOptionsWindow : Window { this->opt = &GetGameSettings(); this->reload = false; + addRefreshRatesAndSelect(); + this->InitNested(WN_GAME_OPTIONS_GAME_OPTIONS); this->OnInvalidateData(0); } @@ -214,6 +241,14 @@ struct GameOptionsWindow : Window { } break; + case WID_GO_REFRESH_RATE_DROPDOWN: // Setup refresh rate dropdown + // TODO: Check for actual available + for (uint i = 0; i < refresh_rates.size(); i++) { + std::string string = std::to_string(refresh_rates[i]) + " Hz"; + list.emplace_back(new DropDownListCharStringItem(string, i, false)); + } + break; + case WID_GO_GUI_ZOOM_DROPDOWN: { *selected_index = _gui_zoom_cfg != ZOOM_LVL_CFG_AUTO ? ZOOM_LVL_OUT_4X - _gui_zoom + 1 : 0; const StringID *items = _gui_zoom_dropdown; @@ -251,17 +286,18 @@ struct GameOptionsWindow : Window { void SetStringParameters(int widget) const override { switch (widget) { - 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; - case WID_GO_BASE_GRF_STATUS: SetDParam(0, BaseGraphics::GetUsedSet()->GetNumInvalid()); break; - case WID_GO_BASE_SFX_DROPDOWN: SetDParamStr(0, BaseSounds::GetUsedSet()->name.c_str()); break; - 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_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_REFRESH_RATE_DROPDOWN: SetDParamStr(0, current_refresh_rate_str.c_str()); 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; + case WID_GO_BASE_GRF_STATUS: SetDParam(0, BaseGraphics::GetUsedSet()->GetNumInvalid()); break; + case WID_GO_BASE_SFX_DROPDOWN: SetDParamStr(0, BaseSounds::GetUsedSet()->name.c_str()); break; + 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; } } @@ -443,6 +479,13 @@ struct GameOptionsWindow : Window { } break; + case WID_GO_REFRESH_RATE_DROPDOWN: { + _settings_client.gui.refresh_rate = refresh_rates[index]; + current_refresh_rate = &refresh_rates[index]; + current_refresh_rate_str = std::to_string(*current_refresh_rate) + "Hz"; + break; + } + case WID_GO_GUI_ZOOM_DROPDOWN: { int8 new_zoom = index > 0 ? ZOOM_LVL_OUT_4X - index + 1 : ZOOM_LVL_CFG_AUTO; if (new_zoom != _gui_zoom_cfg) { @@ -526,6 +569,9 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_GO_FULLSCREEN_BUTTON), SetMinimalSize(21, 9), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP), EndContainer(), EndContainer(), + NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME, STR_NULL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_CURRENCY_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP), SetFill(1, 0), + EndContainer(), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_GUI_ZOOM_FRAME, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_GUI_ZOOM_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP), SetFill(1, 0), EndContainer(), @@ -535,8 +581,8 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_LANGUAGE, STR_NULL), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_LANG_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_RAW_STRING, STR_GAME_OPTIONS_LANGUAGE_TOOLTIP), SetFill(1, 0), EndContainer(), - NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME, STR_NULL), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_CURRENCY_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP), SetFill(1, 0), + NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_REFRESH_RATE, STR_NULL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_REFRESH_RATE_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_RAW_STRING, STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 0), SetFill(0, 1), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_FONT_ZOOM, STR_NULL), diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index 2eb6180f5c7cc..1fbfcdd435ca6 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -32,6 +32,7 @@ enum GameOptionsWidgets { WID_GO_BASE_MUSIC_TEXTFILE, ///< Open base music readme, changelog (+1) or license (+2). WID_GO_BASE_MUSIC_DESCRIPTION = WID_GO_BASE_MUSIC_TEXTFILE + TFT_END, ///< Description of selected base music set. WID_GO_FONT_ZOOM_DROPDOWN, ///< Dropdown for the font zoom level. + WID_GO_REFRESH_RATE_DROPDOWN, ///< Dropdown for all available refresh rates. }; /** Widgets of the #GameSettingsWindow class. */