diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index aba2d3c312..9b5d906008 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -809,11 +809,10 @@ struct DepotWindow : Window { case WID_D_SELL_ALL: /* Only open the confirmation window if there are anything to sell */ if (!this->vehicle_list.empty() || !this->wagon_list.empty()) { - SetDParam(0, this->type); - SetDParam(1, this->GetDepotIndex()); ShowQuery( STR_DEPOT_CAPTION, STR_DEPOT_SELL_CONFIRMATION_TEXT, + MakeParameters(this->type, this->GetDepotIndex()), this, DepotSellAllConfirmationCallback ); diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index c9a77ab8ee..549d44e89d 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -762,14 +762,14 @@ public: if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { _file_to_saveload.name = FiosMakeSavegameName(this->filename_editbox.text.buf); if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) { - ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, this, SaveLoadWindow::SaveGameConfirmationCallback); + ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, MakeParameters(), this, SaveLoadWindow::SaveGameConfirmationCallback); } else { _switch_mode = SM_SAVE_GAME; } } else { _file_to_saveload.name = FiosMakeHeightmapName(this->filename_editbox.text.buf); if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) { - ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, this, SaveLoadWindow::SaveHeightmapConfirmationCallback); + ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, MakeParameters(), this, SaveLoadWindow::SaveHeightmapConfirmationCallback); } else { _switch_mode = SM_SAVE_HEIGHTMAP; } diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index c895640756..3c5cae812c 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -718,6 +718,7 @@ struct GenerateLandscapeWindow : public Window { ShowQuery( STR_WARNING_HEIGHTMAP_SCALE_CAPTION, STR_WARNING_HEIGHTMAP_SCALE_MESSAGE, + MakeParameters(), this, LandscapeGenerationCallback); } else { @@ -1397,6 +1398,7 @@ struct GenerateProgressWindow : public Window { ShowQuery( STR_GENERATION_ABORT_CAPTION, STR_GENERATION_ABORT_MESSAGE, + MakeParameters(), this, AbortGeneratingWorldCallback ); diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 50e6990fe8..8204ad005e 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -788,7 +788,7 @@ public: case WID_GL_DELETE_GROUP: { // Delete the selected group this->group_confirm = this->vli.index; - ShowQuery(STR_QUERY_GROUP_DELETE_CAPTION, STR_GROUP_DELETE_QUERY_TEXT, this, DeleteGroupCallback); + ShowQuery(STR_QUERY_GROUP_DELETE_CAPTION, STR_GROUP_DELETE_QUERY_TEXT, MakeParameters(), this, DeleteGroupCallback); break; } diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 1de7153292..b8ef844de6 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -631,14 +631,14 @@ public: case WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET: { assert(_game_mode == GM_EDITOR); this->HandleButtonClick(WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET); - ShowQuery(STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY, nullptr, AskManyRandomIndustriesCallback); + ShowQuery(STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY, MakeParameters(), nullptr, AskManyRandomIndustriesCallback); break; } case WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET: { assert(_game_mode == GM_EDITOR); this->HandleButtonClick(WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET); - ShowQuery(STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY, nullptr, AskRemoveAllIndustriesCallback); + ShowQuery(STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY, MakeParameters(), nullptr, AskRemoveAllIndustriesCallback); break; } diff --git a/src/intro_gui.cpp b/src/intro_gui.cpp index 31f8e0d3ce..bc7868bb12 100644 --- a/src/intro_gui.cpp +++ b/src/intro_gui.cpp @@ -481,6 +481,7 @@ void AskExitGame() ShowQuery( STR_QUIT_CAPTION, STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD, + MakeParameters(), nullptr, AskExitGameCallback, true @@ -501,6 +502,7 @@ void AskExitToGameMenu() ShowQuery( STR_ABANDON_GAME_CAPTION, (_game_mode != GM_EDITOR) ? STR_ABANDON_GAME_QUERY : STR_ABANDON_SCENARIO_QUERY, + MakeParameters(), nullptr, AskExitToGameMenuCallback, true diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index d1d79f024b..ccc31d1e0c 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -188,6 +188,7 @@ CommandCost CmdPause(DoCommandFlag flags, PauseMode mode, bool pause) ShowQuery( STR_NEWGRF_UNPAUSE_WARNING_TITLE, STR_NEWGRF_UNPAUSE_WARNING, + MakeParameters(), nullptr, AskUnsafeUnpauseCallback ); diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 5bb0f07169..3be247d4b1 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -1093,18 +1093,18 @@ void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *paren */ struct QueryWindow : public Window { QueryCallbackProc *proc; ///< callback function executed on closing of popup. Window* points to parent, bool is true if 'yes' clicked, false otherwise - std::vector params; ///< local copy of #_global_string_params + std::vector params; ///< Parameters for the message. StringID message; ///< message shown for query window - QueryWindow(WindowDesc *desc, StringID caption, StringID message, Window *parent, QueryCallbackProc *callback) : Window(desc) + QueryWindow(WindowDesc *desc, StringID caption, StringID message, StringParameters &¶ms, Window *parent, QueryCallbackProc *callback) : Window(desc) { - /* Create a backup of the variadic arguments to strings because it will be - * overridden pretty often. We will copy these back for drawing */ - CopyOutDParam(this->params, 10); + CopyOutDParam(this->params, std::move(params)); this->message = message; this->proc = callback; this->parent = parent; + CopyInDParam(this->params); + this->CreateNestedTree(); this->GetWidget(WID_Q_CAPTION)->SetDataTip(caption, STR_NULL); this->FinishInitNested(WN_CONFIRM_POPUP_QUERY); @@ -1219,12 +1219,13 @@ static WindowDesc _query_desc(__FILE__, __LINE__, * The window is aligned to the centre of its parent. * @param caption string shown as window caption * @param message string that will be shown for the window + * @param params Parameters for the message. * @param parent pointer to parent window, if this pointer is nullptr the parent becomes * the main window WC_MAIN_WINDOW * @param callback callback function pointer to set in the window descriptor * @param focus whether the window should be focussed (by default false) */ -void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallbackProc *callback, bool focus) +void ShowQuery(StringID caption, StringID message, StringParameters &¶ms, Window *parent, QueryCallbackProc *callback, bool focus) { if (parent == nullptr) parent = GetMainWindow(); @@ -1238,6 +1239,6 @@ void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallback break; } - QueryWindow *q = new QueryWindow(&_query_desc, caption, message, parent, callback); + QueryWindow *q = new QueryWindow(&_query_desc, caption, message, std::move(params), parent, callback); if (focus) SetFocusedWindow(q); } diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 6285d7aee9..05e0744a33 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -869,7 +869,7 @@ public: if (_accepted_external_search) { this->OpenExternalSearch(); } else { - ShowQuery(STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION, STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER, this, ExternalSearchDisclaimerCallback); + ShowQuery(STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION, STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER, MakeParameters(), this, ExternalSearchDisclaimerCallback); } break; } diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 3fae07af1c..f2ad6e3229 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1842,6 +1842,7 @@ public: case WID_CL_MATRIX: { StringID text = STR_NULL; + auto params = MakeParameters(0); QueryCallbackProc *callback = nullptr; switch (index) { @@ -1849,28 +1850,28 @@ public: _admin_client_id = this->dd_client_id; text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK; callback = AdminClientKickCallback; - SetDParamStr(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name); + params.SetParam(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name); break; case DD_CLIENT_ADMIN_BAN: _admin_client_id = this->dd_client_id; text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN; callback = AdminClientBanCallback; - SetDParamStr(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name); + params.SetParam(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name); break; case DD_COMPANY_ADMIN_RESET: _admin_company_id = this->dd_company_id; text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET; callback = AdminCompanyResetCallback; - SetDParam(0, _admin_company_id); + params.SetParam(0, _admin_company_id); break; case DD_COMPANY_ADMIN_UNLOCK: _admin_company_id = this->dd_company_id; text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK; callback = AdminCompanyUnlockCallback; - SetDParam(0, _admin_company_id); + params.SetParam(0, _admin_company_id); break; default: @@ -1881,7 +1882,7 @@ public: assert(callback != nullptr); /* Always ask confirmation for all admin actions. */ - ShowQuery(STR_NETWORK_CLIENT_LIST_ASK_CAPTION, text, this, callback); + ShowQuery(STR_NETWORK_CLIENT_LIST_ASK_CAPTION, text, std::move(params), this, callback); break; } diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 94d06bbad4..73eaf0a58c 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -1124,6 +1124,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { ShowQuery( STR_NEWGRF_POPUP_CAUTION_CAPTION, STR_NEWGRF_CONFIRMATION_TEXT, + MakeParameters(), this, NewGRFConfirmationCallback ); diff --git a/src/screenshot.cpp b/src/screenshot.cpp index 8bfd8cec87..203bec2b78 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -885,9 +885,7 @@ void MakeScreenshotWithConfirm(ScreenshotType t) if (width * height > 8192 * 8192) { /* Ask for confirmation */ _confirmed_screenshot_type = t; - SetDParam(0, width); - SetDParam(1, height); - ShowQuery(STR_WARNING_SCREENSHOT_SIZE_CAPTION, STR_WARNING_SCREENSHOT_SIZE_MESSAGE, nullptr, ScreenshotConfirmationCallback); + ShowQuery(STR_WARNING_SCREENSHOT_SIZE_CAPTION, STR_WARNING_SCREENSHOT_SIZE_MESSAGE, MakeParameters(width, height), nullptr, ScreenshotConfirmationCallback); } else { /* Less than 64M pixels, just do it */ MakeScreenshot(t, {}); diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index e3ab70b394..88e03f743d 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2536,6 +2536,7 @@ struct GameSettingsWindow : Window { ShowQuery( STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION, STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT, + MakeParameters(), this, ResetAllSettingsConfirmationCallback ); diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index e589c4f20e..8c9f4e2f9c 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -637,7 +637,7 @@ struct ScenarioEditorLandscapeGenerationWindow : Window { break; case WID_ETT_RESET_LANDSCAPE: // Reset landscape - ShowQuery(STR_QUERY_RESET_LANDSCAPE_CAPTION, STR_RESET_LANDSCAPE_CONFIRMATION_TEXT, nullptr, ResetLandscapeConfirmationCallback); + ShowQuery(STR_QUERY_RESET_LANDSCAPE_CAPTION, STR_RESET_LANDSCAPE_CONFIRMATION_TEXT, MakeParameters(), nullptr, ResetLandscapeConfirmationCallback); break; default: NOT_REACHED(); diff --git a/src/textbuf_gui.h b/src/textbuf_gui.h index 0284bbd57e..3b50d013b2 100644 --- a/src/textbuf_gui.h +++ b/src/textbuf_gui.h @@ -29,7 +29,7 @@ DECLARE_ENUM_AS_BIT_SET(QueryStringFlags) typedef void QueryCallbackProc(Window*, bool); void ShowQueryString(StringID str, StringID caption, uint max_len, Window *parent, CharSetFilter afilter, QueryStringFlags flags); -void ShowQuery(StringID caption, StringID message, Window *w, QueryCallbackProc *callback, bool focus = false); +void ShowQuery(StringID caption, StringID message, class StringParameters &¶ms, Window *w, QueryCallbackProc *callback, bool focus = false); /** The number of 'characters' on the on-screen keyboard. */ static const uint OSK_KEYBOARD_ENTRIES = 50;