From 7411b718bcf56dafc8cf8d8704e79e70dc580b04 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 11 Mar 2025 21:14:04 +0100 Subject: [PATCH] Prevent closing object selection window when selection is invalid (#23968) * EditorObjectSelectionWindowCheck: move window close out to caller side * WindowManager: apply CanClose check again * Amend changelog --- distribution/changelog.txt | 1 + src/openrct2-ui/WindowManager.cpp | 6 ++++++ src/openrct2-ui/windows/EditorBottomToolbar.cpp | 3 +++ src/openrct2-ui/windows/EditorObjectSelection.cpp | 11 +++++++---- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 4bf0be7cb1..9e149688be 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -7,6 +7,7 @@ - Fix: [#4225] Ride Construction window offers non-existent banked sloped to level curve (original bug). - Fix: [#10379] Banners outside the park can be renamed and modified (original bug). - Fix: [#10582] Low clearance tunnels below water are drawn incorrectly (original bug). +- Fix: [#23486] Object selection minimum requirements can be bypassed with close window hotkey. - Fix: [#23743] Parks with guest goals over 32767 do not appear in the scenario list. - Fix: [#23844] Sound effects keep playing when loading another save. - Fix: [#23891] Inverted Hairpin Coaster track can draw over things above it (original bug). diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index 0515971bdc..ab7807573d 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -931,6 +931,12 @@ public: */ void Close(WindowBase& w) override { + if (!w.CanClose()) + { + // Something's preventing this window from closing -- bail out early + return; + } + w.OnClose(); // Remove viewport diff --git a/src/openrct2-ui/windows/EditorBottomToolbar.cpp b/src/openrct2-ui/windows/EditorBottomToolbar.cpp index 1c21ae8c21..7271bb8715 100644 --- a/src/openrct2-ui/windows/EditorBottomToolbar.cpp +++ b/src/openrct2-ui/windows/EditorBottomToolbar.cpp @@ -199,6 +199,9 @@ namespace OpenRCT2::Ui::Windows if (!EditorObjectSelectionWindowCheck()) return; + auto* windowMgr = Ui::GetWindowManager(); + windowMgr->CloseByClass(WindowClass::EditorObjectSelection); + FinishObjectSelection(); if (gLegacyScene == LegacyScene::trackDesigner) { diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index a4fb3431b7..285fe17608 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -366,9 +366,13 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_CLOSE: - if (!(gLegacyScene == LegacyScene::trackDesignsManager) && !EditorObjectSelectionWindowCheck()) + { + if (gLegacyScene != LegacyScene::trackDesignsManager && !EditorObjectSelectionWindowCheck()) return; + auto* windowMgr = Ui::GetWindowManager(); + windowMgr->CloseByClass(WindowClass::EditorObjectSelection); + if (isInEditorMode()) { FinishObjectSelection(); @@ -382,6 +386,7 @@ namespace OpenRCT2::Ui::Windows context->SetActiveScene(context->GetTitleScene()); } break; + } case WIDX_SUB_TAB_0: case WIDX_SUB_TAB_1: @@ -1708,17 +1713,15 @@ namespace OpenRCT2::Ui::Windows bool EditorObjectSelectionWindowCheck() { - auto* windowMgr = Ui::GetWindowManager(); - auto [missingObjectType, errorString] = Editor::CheckObjectSelection(); if (missingObjectType == ObjectType::none) { - windowMgr->CloseByClass(WindowClass::EditorObjectSelection); return true; } ContextShowError(STR_INVALID_SELECTION_OF_OBJECTS, errorString, {}); + auto* windowMgr = Ui::GetWindowManager(); WindowBase* w = windowMgr->FindByClass(WindowClass::EditorObjectSelection); if (w != nullptr) {