From f57c2cc56e543e7682037f5b7876e42e0c9c64f1 Mon Sep 17 00:00:00 2001 From: Rito12 Date: Sat, 20 Dec 2025 23:34:04 +0100 Subject: [PATCH] Fix: Company query popups do not update in multiplayer. --- src/company_cmd.cpp | 4 +++- src/company_gui.cpp | 25 ++++++++++++++++++------- src/misc_gui.cpp | 10 ++++++++++ src/textbuf_gui.h | 1 + 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 501cee2a4a..aac1aa7a83 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -1206,6 +1206,8 @@ CommandCost CmdRenameCompany(DoCommandFlags flags, const std::string &text) } else { c->name = text; } + + InvalidateWindowClassesData(WC_COMPANY, WID_C_COMPANY_NAME); MarkWholeScreenDirty(); CompanyAdminUpdate(c); @@ -1259,7 +1261,7 @@ CommandCost CmdRenamePresident(DoCommandFlags flags, const std::string &text) } } - InvalidateWindowClassesData(WC_COMPANY, 1); + InvalidateWindowClassesData(WC_COMPANY, WID_C_PRESIDENT_NAME); MarkWholeScreenDirty(); CompanyAdminUpdate(c); diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 5063110da5..c08b8b7b2c 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -1926,6 +1926,9 @@ static const StringID _company_view_vehicle_count_strings[] = { */ struct CompanyWindow : Window { + /** WID_C_CAPTION does not have a query string, so it can be safely used as invalid value. */ + static constexpr CompanyWidgets INVALID_QUERY_WIDGET = WID_C_CAPTION; + CompanyWidgets query_widget{}; /** Display planes in the company window. */ @@ -2169,13 +2172,13 @@ struct CompanyWindow : Window break; case WID_C_PRESIDENT_NAME: - this->query_widget = WID_C_PRESIDENT_NAME; ShowQueryString(GetString(STR_PRESIDENT_NAME, this->window_number), STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION, MAX_LENGTH_PRESIDENT_NAME_CHARS, this, CS_ALPHANUMERAL, {QueryStringFlag::EnableDefault, QueryStringFlag::LengthIsInChars}); + this->query_widget = WID_C_PRESIDENT_NAME; break; case WID_C_COMPANY_NAME: - this->query_widget = WID_C_COMPANY_NAME; ShowQueryString(GetString(STR_COMPANY_NAME, this->window_number), STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION, MAX_LENGTH_COMPANY_NAME_CHARS, this, CS_ALPHANUMERAL, {QueryStringFlag::EnableDefault, QueryStringFlag::LengthIsInChars}); + this->query_widget = WID_C_COMPANY_NAME; break; case WID_C_VIEW_HQ: { @@ -2218,8 +2221,8 @@ struct CompanyWindow : Window break; case WID_C_GIVE_MONEY: - this->query_widget = WID_C_GIVE_MONEY; ShowQueryString({}, STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION, 30, this, CS_NUMERAL, {}); + this->query_widget = WID_C_GIVE_MONEY; break; case WID_C_HOSTILE_TAKEOVER: @@ -2261,9 +2264,12 @@ struct CompanyWindow : Window void OnQueryTextFinished(std::optional str) override { + CompanyWidgets widget = this->query_widget; + this->query_widget = CompanyWindow::INVALID_QUERY_WIDGET; + if (!str.has_value()) return; - switch (this->query_widget) { + switch (widget) { default: NOT_REACHED(); case WID_C_GIVE_MONEY: { @@ -2286,9 +2292,14 @@ struct CompanyWindow : Window void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override { - if (gui_scope && data == 1) { - /* Manually call OnResize to adjust minimum height of president name widget. */ - OnResize(); + if (!gui_scope) return; + + /* Manually call OnResize to adjust minimum height of president name widget. */ + if (data == WID_C_PRESIDENT_NAME) this->OnResize(); + + /* If a query string is visible, update its default value. */ + if (this->query_widget != CompanyWindow::INVALID_QUERY_WIDGET && data == this->query_widget) { + UpdateQueryStringDefault(GetString(data == WID_C_COMPANY_NAME ? STR_COMPANY_NAME : STR_PRESIDENT_NAME, this->window_number)); } } }; diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 2b3643ee78..18cea888cc 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -1069,6 +1069,16 @@ void ShowQueryString(std::string_view str, StringID caption, uint maxsize, Windo new QueryStringWindow(str, caption, (flags.Test(QueryStringFlag::LengthIsInChars) ? MAX_CHAR_LENGTH : 1) * maxsize, maxsize, _query_string_desc, parent, afilter, flags); } +/** + * Updates default text value of query strign window. + * @param str String for the default text shown in the textbox. + */ +void UpdateQueryStringDefault(std::string_view str) +{ + QueryStringWindow *w = dynamic_cast(FindWindowByClass(WC_QUERY_STRING)); + if (w != nullptr) w->editbox.orig = str; +} + /** * Window used for asking the user a YES/NO question. */ diff --git a/src/textbuf_gui.h b/src/textbuf_gui.h index dff5c3ce0c..daa79e6d38 100644 --- a/src/textbuf_gui.h +++ b/src/textbuf_gui.h @@ -28,6 +28,7 @@ using QueryStringFlags = EnumBitSet; typedef void QueryCallbackProc(Window*, bool); void ShowQueryString(std::string_view str, StringID caption, uint max_len, Window *parent, CharSetFilter afilter, QueryStringFlags flags); +void UpdateQueryStringDefault(std::string_view str); void ShowQuery(EncodedString &&caption, EncodedString &&message, Window *w, QueryCallbackProc *callback, bool focus = false); /** The number of 'characters' on the on-screen keyboard. */