1
0
Fork 0

Fix: Closing the Game Options window closes all textfile windows.

Record the parent window that opens a textfile window so only child windows are closed instead of all.
pull/14213/head
Peter Nelson 2025-05-04 17:50:31 +01:00 committed by Peter Nelson
parent dabf2ede67
commit ac76212b80
12 changed files with 44 additions and 45 deletions

View File

@ -218,7 +218,7 @@ struct AIConfigWindow : public Window {
if (widget >= WID_AIC_TEXTFILE && widget < WID_AIC_TEXTFILE + TFT_CONTENT_END) {
if (this->selected_slot == CompanyID::Invalid() || AIConfig::GetConfig(this->selected_slot) == nullptr) return;
ShowScriptTextfileWindow((TextfileType)(widget - WID_AIC_TEXTFILE), this->selected_slot);
ShowScriptTextfileWindow(this, (TextfileType)(widget - WID_AIC_TEXTFILE), this->selected_slot);
return;
}

View File

@ -228,7 +228,7 @@ struct GSConfigWindow : public Window {
if (widget >= WID_GSC_TEXTFILE && widget < WID_GSC_TEXTFILE + TFT_CONTENT_END) {
if (GameConfig::GetConfig() == nullptr) return;
ShowScriptTextfileWindow((TextfileType)(widget - WID_GSC_TEXTFILE), (CompanyID)OWNER_DEITY);
ShowScriptTextfileWindow(this, (TextfileType)(widget - WID_GSC_TEXTFILE), (CompanyID)OWNER_DEITY);
return;
}

View File

@ -61,7 +61,7 @@ static std::optional<std::string> FindGameManualFilePath(std::string_view filena
/** Window class displaying the game manual textfile viewer. */
struct GameManualTextfileWindow : public TextfileWindow {
GameManualTextfileWindow(std::string_view filename, Subdirectory subdir) : TextfileWindow(TFT_GAME_MANUAL)
GameManualTextfileWindow(std::string_view filename, Subdirectory subdir) : TextfileWindow(nullptr, TFT_GAME_MANUAL)
{
this->ConstructWindow();

View File

@ -44,7 +44,7 @@ static bool _accepted_external_search = false;
struct ContentTextfileWindow : public TextfileWindow {
const ContentInfo *ci = nullptr; ///< View the textfile of this ContentInfo.
ContentTextfileWindow(TextfileType file_type, const ContentInfo *ci) : TextfileWindow(file_type), ci(ci)
ContentTextfileWindow(Window *parent, TextfileType file_type, const ContentInfo *ci) : TextfileWindow(parent, file_type), ci(ci)
{
this->ConstructWindow();
@ -79,10 +79,10 @@ struct ContentTextfileWindow : public TextfileWindow {
}
};
void ShowContentTextfileWindow(TextfileType file_type, const ContentInfo *ci)
static void ShowContentTextfileWindow(Window *parent, TextfileType file_type, const ContentInfo *ci)
{
CloseWindowById(WC_TEXTFILE, file_type);
new ContentTextfileWindow(file_type, ci);
parent->CloseChildWindowById(WC_TEXTFILE, file_type);
new ContentTextfileWindow(parent, file_type, ci);
}
/** Nested widgets for the download window. */
@ -776,7 +776,7 @@ public:
if (widget >= WID_NCL_TEXTFILE && widget < WID_NCL_TEXTFILE + TFT_CONTENT_END) {
if (this->selected == nullptr || this->selected->state != ContentInfo::ALREADY_HERE) return;
ShowContentTextfileWindow((TextfileType)(widget - WID_NCL_TEXTFILE), this->selected);
ShowContentTextfileWindow(this, (TextfileType)(widget - WID_NCL_TEXTFILE), this->selected);
return;
}

View File

@ -2323,7 +2323,7 @@ struct NetworkAskSurveyWindow : public Window {
{
switch (widget) {
case WID_NAS_PREVIEW:
ShowSurveyResultTextfileWindow();
ShowSurveyResultTextfileWindow(this);
break;
case WID_NAS_LINK:
@ -2388,7 +2388,7 @@ void ShowNetworkAskSurvey()
struct SurveyResultTextfileWindow : public TextfileWindow {
const GRFConfig *grf_config; ///< View the textfile of this GRFConfig.
SurveyResultTextfileWindow(TextfileType file_type) : TextfileWindow(file_type)
SurveyResultTextfileWindow(Window *parent, TextfileType file_type) : TextfileWindow(parent, file_type)
{
this->ConstructWindow();
@ -2398,8 +2398,8 @@ struct SurveyResultTextfileWindow : public TextfileWindow {
}
};
void ShowSurveyResultTextfileWindow()
void ShowSurveyResultTextfileWindow(Window *parent)
{
CloseWindowById(WC_TEXTFILE, TFT_SURVEY_RESULT);
new SurveyResultTextfileWindow(TFT_SURVEY_RESULT);
parent->CloseChildWindowById(WC_TEXTFILE, TFT_SURVEY_RESULT);
new SurveyResultTextfileWindow(parent, TFT_SURVEY_RESULT);
}

View File

@ -24,7 +24,7 @@ void ShowNetworkGameWindow();
void ShowClientList();
void ShowNetworkAskRelay(std::string_view server_connection_string, std::string &&relay_connection_string, std::string &&token);
void ShowNetworkAskSurvey();
void ShowSurveyResultTextfileWindow();
void ShowSurveyResultTextfileWindow(Window *parent);
/** Company information stored at the client side */
struct NetworkCompanyInfo : NetworkCompanyStats {

View File

@ -551,7 +551,7 @@ void OpenGRFParameterWindow(bool is_baseset, GRFConfig &c, bool editable)
struct NewGRFTextfileWindow : public TextfileWindow {
const GRFConfig *grf_config = nullptr; ///< View the textfile of this GRFConfig.
NewGRFTextfileWindow(TextfileType file_type, const GRFConfig *c) : TextfileWindow(file_type), grf_config(c)
NewGRFTextfileWindow(Window *parent, TextfileType file_type, const GRFConfig *c) : TextfileWindow(parent, file_type), grf_config(c)
{
this->ConstructWindow();
@ -569,10 +569,10 @@ struct NewGRFTextfileWindow : public TextfileWindow {
}
};
void ShowNewGRFTextfileWindow(TextfileType file_type, const GRFConfig *c)
void ShowNewGRFTextfileWindow(Window *parent, TextfileType file_type, const GRFConfig *c)
{
CloseWindowById(WC_TEXTFILE, file_type);
new NewGRFTextfileWindow(file_type, c);
parent->CloseChildWindowById(WC_TEXTFILE, file_type);
new NewGRFTextfileWindow(parent, file_type, c);
}
typedef std::map<uint32_t, const GRFConfig *> GrfIdMap; ///< Map of grfid to the grf config.
@ -664,7 +664,6 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowByClass(WC_GRF_PARAMETERS);
CloseWindowByClass(WC_TEXTFILE);
CloseWindowByClass(WC_SAVE_PRESET);
if (this->editable && this->modified && !this->execute && !_exit_game) {
@ -721,7 +720,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
}
if (this->active_sel == c->get()) {
CloseWindowByClass(WC_GRF_PARAMETERS);
CloseWindowByClass(WC_TEXTFILE);
this->CloseChildWindows(WC_TEXTFILE);
this->active_sel = nullptr;
}
*c = std::move(d);
@ -930,7 +929,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
if (widget >= WID_NS_NEWGRF_TEXTFILE && widget < WID_NS_NEWGRF_TEXTFILE + TFT_CONTENT_END) {
if (this->active_sel == nullptr && this->avail_sel == nullptr) return;
ShowNewGRFTextfileWindow((TextfileType)(widget - WID_NS_NEWGRF_TEXTFILE), this->active_sel != nullptr ? this->active_sel : this->avail_sel);
ShowNewGRFTextfileWindow(this, (TextfileType)(widget - WID_NS_NEWGRF_TEXTFILE), this->active_sel != nullptr ? this->active_sel : this->avail_sel);
return;
}
@ -1011,7 +1010,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
}
if (this->active_sel != old_sel) {
CloseWindowByClass(WC_GRF_PARAMETERS);
CloseWindowByClass(WC_TEXTFILE);
this->CloseChildWindows(WC_TEXTFILE);
}
this->avail_sel = nullptr;
this->avail_pos = -1;
@ -1028,7 +1027,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
case WID_NS_REMOVE: { // Remove GRF
if (this->active_sel == nullptr || !this->editable) break;
CloseWindowByClass(WC_GRF_PARAMETERS);
CloseWindowByClass(WC_TEXTFILE);
this->CloseChildWindows(WC_TEXTFILE);
/* Choose the next GRF file to be the selected file. */
int pos = this->GetCurrentActivePosition();
@ -1065,7 +1064,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
this->active_sel = nullptr;
CloseWindowByClass(WC_GRF_PARAMETERS);
if (it != std::end(this->avails)) {
if (this->avail_sel != *it) CloseWindowByClass(WC_TEXTFILE);
if (this->avail_sel != *it) this->CloseChildWindows(WC_TEXTFILE);
this->avail_sel = *it;
this->avail_pos = static_cast<int>(std::distance(std::begin(this->avails), it));
}
@ -1139,7 +1138,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
void OnNewGRFsScanned() override
{
if (this->active_sel == nullptr) CloseWindowByClass(WC_TEXTFILE);
if (this->active_sel == nullptr) this->CloseChildWindows(WC_TEXTFILE);
this->avail_sel = nullptr;
this->avail_pos = -1;
this->avails.ForceRebuild();
@ -1161,7 +1160,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
ResetObjectToPlace();
CloseWindowByClass(WC_GRF_PARAMETERS);
CloseWindowByClass(WC_TEXTFILE);
this->CloseChildWindows(WC_TEXTFILE);
this->active_sel = nullptr;
this->InvalidateData(GOID_NEWGRF_CHANGES_MADE);
}
@ -1312,7 +1311,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
if (this->avail_pos >= 0) {
this->active_sel = nullptr;
CloseWindowByClass(WC_GRF_PARAMETERS);
if (this->avail_sel != this->avails[this->avail_pos]) CloseWindowByClass(WC_TEXTFILE);
if (this->avail_sel != this->avails[this->avail_pos]) this->CloseChildWindows(WC_TEXTFILE);
this->avail_sel = this->avails[this->avail_pos];
this->vscroll2->ScrollTowards(this->avail_pos);
this->InvalidateData(0);
@ -1473,7 +1472,7 @@ private:
{
if (this->avail_sel == nullptr || !this->editable || this->avail_sel->flags.Test(GRFConfigFlag::Invalid)) return false;
CloseWindowByClass(WC_TEXTFILE);
this->CloseChildWindows(WC_TEXTFILE);
/* Get number of non-static NewGRFs. */
size_t count = std::ranges::count_if(this->actives, [](const auto &gc) { return !gc->flags.Test(GRFConfigFlag::Static); });
@ -1928,7 +1927,7 @@ static void NewGRFConfirmationCallback(Window *w, bool confirmed)
{
if (confirmed) {
CloseWindowByClass(WC_GRF_PARAMETERS);
CloseWindowByClass(WC_TEXTFILE);
w->CloseChildWindows(WC_TEXTFILE);
NewGRFWindow *nw = dynamic_cast<NewGRFWindow*>(w);
assert(nw != nullptr);

View File

@ -609,7 +609,7 @@ void ShowScriptSettingsWindow(CompanyID slot)
struct ScriptTextfileWindow : public TextfileWindow {
CompanyID slot{}; ///< View the textfile of this CompanyID slot.
ScriptTextfileWindow(TextfileType file_type, CompanyID slot) : TextfileWindow(file_type), slot(slot)
ScriptTextfileWindow(Window *parent, TextfileType file_type, CompanyID slot) : TextfileWindow(parent, file_type), slot(slot)
{
this->ConstructWindow();
this->OnInvalidateData();
@ -640,10 +640,10 @@ struct ScriptTextfileWindow : public TextfileWindow {
* @param file_type The type of textfile to display.
* @param slot The slot the Script is using.
*/
void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot)
void ShowScriptTextfileWindow(Window *parent, TextfileType file_type, CompanyID slot)
{
CloseWindowById(WC_TEXTFILE, file_type);
new ScriptTextfileWindow(file_type, slot);
parent->CloseChildWindowById(WC_TEXTFILE, file_type);
new ScriptTextfileWindow(parent, file_type, slot);
}

View File

@ -18,7 +18,7 @@ struct Window;
void ShowScriptListWindow(CompanyID slot, bool show_all);
Window *ShowScriptDebugWindow(CompanyID show_company = CompanyID::Invalid(), bool new_window = false);
void ShowScriptSettingsWindow(CompanyID slot);
void ShowScriptTextfileWindow(TextfileType file_type, CompanyID slot);
void ShowScriptTextfileWindow(Window *parent, TextfileType file_type, CompanyID slot);
void ShowScriptDebugWindowIfScriptError();
void InitializeScriptGui();

View File

@ -103,7 +103,7 @@ struct BaseSetTextfileWindow : public TextfileWindow {
const std::string name; ///< Name of the content.
const StringID content_type; ///< STR_CONTENT_TYPE_xxx for title.
BaseSetTextfileWindow(TextfileType file_type, const std::string &name, const std::string &textfile, StringID content_type) : TextfileWindow(file_type), name(name), content_type(content_type)
BaseSetTextfileWindow(Window *parent, TextfileType file_type, const std::string &name, const std::string &textfile, StringID content_type) : TextfileWindow(parent, file_type), name(name), content_type(content_type)
{
this->ConstructWindow();
this->LoadTextfile(textfile, BASESET_DIR);
@ -126,10 +126,10 @@ struct BaseSetTextfileWindow : public TextfileWindow {
* @param content_type STR_CONTENT_TYPE_xxx for title.
*/
template <class TBaseSet>
void ShowBaseSetTextfileWindow(TextfileType file_type, const TBaseSet *baseset, StringID content_type)
void ShowBaseSetTextfileWindow(Window *parent, TextfileType file_type, const TBaseSet *baseset, StringID content_type)
{
CloseWindowById(WC_TEXTFILE, file_type);
new BaseSetTextfileWindow(file_type, baseset->name, *baseset->GetTextfile(file_type), content_type);
parent->CloseChildWindowById(WC_TEXTFILE, file_type);
new BaseSetTextfileWindow(parent, file_type, baseset->name, *baseset->GetTextfile(file_type), content_type);
}
/**
@ -464,7 +464,6 @@ struct GameOptionsWindow : Window {
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowById(WC_CUSTOM_CURRENCY, 0);
CloseWindowByClass(WC_TEXTFILE);
if (this->reload) _switch_mode = SM_MENU;
this->Window::Close();
}
@ -939,19 +938,19 @@ struct GameOptionsWindow : Window {
if (widget >= WID_GO_BASE_GRF_TEXTFILE && widget < WID_GO_BASE_GRF_TEXTFILE + TFT_CONTENT_END) {
if (BaseGraphics::GetUsedSet() == nullptr) return;
ShowBaseSetTextfileWindow((TextfileType)(widget - WID_GO_BASE_GRF_TEXTFILE), BaseGraphics::GetUsedSet(), STR_CONTENT_TYPE_BASE_GRAPHICS);
ShowBaseSetTextfileWindow(this, (TextfileType)(widget - WID_GO_BASE_GRF_TEXTFILE), BaseGraphics::GetUsedSet(), STR_CONTENT_TYPE_BASE_GRAPHICS);
return;
}
if (widget >= WID_GO_BASE_SFX_TEXTFILE && widget < WID_GO_BASE_SFX_TEXTFILE + TFT_CONTENT_END) {
if (BaseSounds::GetUsedSet() == nullptr) return;
ShowBaseSetTextfileWindow((TextfileType)(widget - WID_GO_BASE_SFX_TEXTFILE), BaseSounds::GetUsedSet(), STR_CONTENT_TYPE_BASE_SOUNDS);
ShowBaseSetTextfileWindow(this, (TextfileType)(widget - WID_GO_BASE_SFX_TEXTFILE), BaseSounds::GetUsedSet(), STR_CONTENT_TYPE_BASE_SOUNDS);
return;
}
if (widget >= WID_GO_BASE_MUSIC_TEXTFILE && widget < WID_GO_BASE_MUSIC_TEXTFILE + TFT_CONTENT_END) {
if (BaseMusic::GetUsedSet() == nullptr) return;
ShowBaseSetTextfileWindow((TextfileType)(widget - WID_GO_BASE_MUSIC_TEXTFILE), BaseMusic::GetUsedSet(), STR_CONTENT_TYPE_BASE_MUSIC);
ShowBaseSetTextfileWindow(this, (TextfileType)(widget - WID_GO_BASE_MUSIC_TEXTFILE), BaseMusic::GetUsedSet(), STR_CONTENT_TYPE_BASE_MUSIC);
return;
}
switch (widget) {
@ -984,7 +983,7 @@ struct GameOptionsWindow : Window {
break;
case WID_GO_SURVEY_PREVIEW_BUTTON:
ShowSurveyResultTextfileWindow();
ShowSurveyResultTextfileWindow(this);
break;
case WID_GO_FULLSCREEN_BUTTON: // Click fullscreen on/off

View File

@ -83,10 +83,11 @@ static WindowDesc _textfile_desc(
_nested_textfile_widgets
);
TextfileWindow::TextfileWindow(TextfileType file_type) : Window(_textfile_desc), file_type(file_type)
TextfileWindow::TextfileWindow(Window *parent, TextfileType file_type) : Window(_textfile_desc), file_type(file_type)
{
/* Init of nested tree is deferred.
* TextfileWindow::ConstructWindow must be called by the inheriting window. */
this->parent = parent;
}
void TextfileWindow::ConstructWindow()

View File

@ -41,7 +41,7 @@ struct TextfileWindow : public Window, MissingGlyphSearcher {
virtual void LoadTextfile(const std::string &textfile, Subdirectory dir);
protected:
TextfileWindow(TextfileType file_type);
TextfileWindow(Window *parent, TextfileType file_type);
void ConstructWindow();
struct Line {