From 2926179d02792f19b57b21e3d7c77d5431739f8e Mon Sep 17 00:00:00 2001 From: frosch Date: Fri, 16 May 2025 12:22:00 +0200 Subject: [PATCH] Fix: Restore the behaviour when entering numbers in query windows: clamp integers out of range to the maximum valid value. --- src/cheat_gui.cpp | 4 ++-- src/company_gui.cpp | 4 ++-- src/game/game_gui.cpp | 2 +- src/genworld_gui.cpp | 4 ++-- src/industry_gui.cpp | 2 +- src/network/network_gui.cpp | 2 +- src/newgrf_debug_gui.cpp | 4 ++-- src/newgrf_gui.cpp | 2 +- src/order_gui.cpp | 2 +- src/script/script_gui.cpp | 2 +- src/settings_gui.cpp | 6 +++--- src/timetable_gui.cpp | 2 +- src/toolbar_gui.cpp | 2 +- src/town_gui.cpp | 2 +- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 9c9745d882..5cbdb1f78f 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -608,7 +608,7 @@ struct CheatWindow : Window { int32_t value; if (!str->empty()) { - auto llvalue = ParseInteger(*str); + auto llvalue = ParseInteger(*str, 10, true); if (!llvalue.has_value()) return; /* Save the correct currency-translated value */ @@ -623,7 +623,7 @@ struct CheatWindow : Window { } else { const CheatEntry *ce = &_cheats_ui[clicked_cheat]; int oldvalue = static_cast(ReadValue(ce->variable, ce->type)); - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; *ce->been_used = true; value = ce->proc(*value, *value - oldvalue); diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 301f80019c..80f3a72c8b 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -1693,7 +1693,7 @@ public: if (!str.has_value()) return; /* Set a new company manager face number */ if (!str->empty()) { - auto val = ParseInteger(*str); + auto val = ParseInteger(*str, 10, true); if (!val.has_value()) return; this->face = *val; ScaleAllCompanyManagerFaceBits(this->face); @@ -2458,7 +2458,7 @@ struct CompanyWindow : Window default: NOT_REACHED(); case WID_C_GIVE_MONEY: { - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; Money money = *value / GetCurrency().rate; Command::Post(STR_ERROR_CAN_T_GIVE_MONEY, money, this->window_number); diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index 498b3b2689..17b45fc6cc 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -348,7 +348,7 @@ struct GSConfigWindow : public Window { void OnQueryTextFinished(std::optional str) override { if (!str.has_value()) return; - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; SetValue(*value); } diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index a3079d471d..dd92f937b6 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -914,7 +914,7 @@ struct GenerateLandscapeWindow : public Window { int32_t value; if (!str->empty()) { - auto val = ParseInteger(*str); + auto val = ParseInteger(*str, 10, true); if (!val.has_value()) return; value = *val; } else { @@ -1203,7 +1203,7 @@ struct CreateScenarioWindow : public Window { if (!str.has_value()) return; - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; switch (this->widget_id) { diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index dad6ad9177..44c5d54b54 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -1165,7 +1165,7 @@ public: if (!str.has_value() || str->empty()) return; Industry *i = Industry::Get(this->window_number); - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; switch (this->editbox_line) { case IL_NONE: NOT_REACHED(); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 4ea7e01fb7..cb6d47f5b0 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1116,7 +1116,7 @@ struct NetworkStartServerWindow : public Window { if (this->widget_id == WID_NSS_SETPWD) { _settings_client.network.server_password = std::move(*str); } else { - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; this->SetWidgetDirty(this->widget_id); switch (this->widget_id) { diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index fe8ec226ff..a829e7c448 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -594,7 +594,7 @@ struct NewGRFInspectWindow : Window { { if (!str.has_value()) return; - auto val = ParseInteger(*str); + auto val = ParseInteger(*str, 10, true); if (!val.has_value()) return; NewGRFInspectWindow::var60params[GetFeatureNum(this->window_number)][this->current_edit_param - 0x60] = *val; this->SetDirty(); @@ -1066,7 +1066,7 @@ struct SpriteAlignerWindow : Window { { if (!str.has_value()) return; - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; this->current_sprite = *value; if (this->current_sprite >= GetMaxSpriteID()) this->current_sprite = 0; diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 40192df904..fe8b2f2f0b 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -435,7 +435,7 @@ struct NewGRFParametersWindow : public Window { void OnQueryTextFinished(std::optional str) override { if (!str.has_value() || str->empty()) return; - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; GRFParameterInfo &par_info = this->GetParameterInfo(this->clicked_row); this->grf_config.SetValue(par_info, *value); diff --git a/src/order_gui.cpp b/src/order_gui.cpp index f4e3f25b26..9a44e263c8 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -1363,7 +1363,7 @@ public: if (!str.has_value() || str->empty()) return; VehicleOrderID sel = this->OrderGetSel(); - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; switch (this->vehicle->GetOrder(sel)->GetConditionVariable()) { diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 72bf6f02bb..ea0e980de5 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -486,7 +486,7 @@ struct ScriptSettingsWindow : public Window { void OnQueryTextFinished(std::optional str) override { if (!str.has_value()) return; - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; SetValue(*value); } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 94a073d904..0ea49bea67 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1371,7 +1371,7 @@ struct GameOptionsWindow : Window { int32_t value; if (!str->empty()) { - auto llvalue = ParseInteger(*str); + auto llvalue = ParseInteger(*str, 10, true); if (!llvalue.has_value()) return; /* Save the correct currency-translated value */ @@ -2067,7 +2067,7 @@ struct CustomCurrencyWindow : Window { switch (this->query_widget) { case WID_CC_RATE: { - auto val = ParseInteger(*str); + auto val = ParseInteger(*str, 10, true); if (!val.has_value()) return; GetCustomCurrency().rate = Clamp(*val, 1, UINT16_MAX); break; @@ -2088,7 +2088,7 @@ struct CustomCurrencyWindow : Window { case WID_CC_YEAR: { // Year to switch to euro TimerGameCalendar::Year year = CF_NOEURO; if (!str->empty()) { - auto val = ParseInteger(*str); + auto val = ParseInteger(*str, 10, true); if (!val.has_value()) return; year = Clamp(static_cast(*val), MIN_EURO_YEAR, CalendarTime::MAX_YEAR); } diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 17ccea5c4e..b22369bc5d 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -748,7 +748,7 @@ struct TimetableWindow : Window { if (!str.has_value()) return; const Vehicle *v = this->vehicle; - uint64_t val = ParseInteger(*str).value_or(0); + uint64_t val = ParseInteger(*str, 10, true).value_or(0); auto [order_id, mtf] = PackTimetableArgs(v, this->sel_index, query_widget == WID_VT_CHANGE_SPEED); switch (query_widget) { diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index d8e684cd4b..98e58d5c32 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2501,7 +2501,7 @@ struct ScenarioEditorToolbarWindow : Window { TimerGameCalendar::Year value; if (!str->empty()) { - auto val = ParseInteger(*str); + auto val = ParseInteger(*str, 10, true); if (!val.has_value()) return; value = static_cast(*val); } else { diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 8b74df5f5f..148204f4ca 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -1275,7 +1275,7 @@ public: /* Was 'cancel' pressed? */ if (!str.has_value()) return; - auto value = ParseInteger(*str); + auto value = ParseInteger(*str, 10, true); if (!value.has_value()) return; Backup old_generating_world(_generating_world, true);