From f7364fe3dbd0271651af03d554b375ffcdd05007 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Sat, 29 Oct 2022 05:19:59 -0700 Subject: [PATCH] Close #18319: Refactor SavePrompt window to class (#18335) --- src/openrct2-ui/windows/SavePrompt.cpp | 271 ++++++++++++------------- 1 file changed, 132 insertions(+), 139 deletions(-) diff --git a/src/openrct2-ui/windows/SavePrompt.cpp b/src/openrct2-ui/windows/SavePrompt.cpp index bbd944a61d..8ef75b052b 100644 --- a/src/openrct2-ui/windows/SavePrompt.cpp +++ b/src/openrct2-ui/windows/SavePrompt.cpp @@ -65,36 +65,134 @@ static constexpr const StringId window_save_prompt_labels[][2] = { { STR_QUIT_GAME_PROMPT_TITLE, STR_SAVE_BEFORE_QUITTING }, { STR_QUIT_GAME_2_PROMPT_TITLE, STR_SAVE_BEFORE_QUITTING_2 }, }; - - -static void WindowSavePromptClose(rct_window *w); -static void WindowSavePromptMouseup(rct_window *w, WidgetIndex widgetIndex); -static void WindowSavePromptPaint(rct_window *w, rct_drawpixelinfo *dpi); -static void WindowSavePromptCallback(int32_t result, const utf8 * path); - -static WindowEventList window_save_prompt_events([](auto& events) -{ - events.close = &WindowSavePromptClose; - events.mouse_up = &WindowSavePromptMouseup; - events.paint = &WindowSavePromptPaint; -}); // clang-format on -/** - * - * rct2: 0x0066DCBE - */ +static void WindowSavePromptCallback(int32_t result, const utf8* path) +{ + if (result == MODAL_RESULT_OK) + { + game_load_or_quit_no_save_prompt(); + } +} + +class SavePromptWindow final : public Window +{ +private: + PromptMode _promptMode; + +public: + SavePromptWindow(PromptMode promptMode) + : _promptMode(promptMode) + { + } + + void OnOpen() override + { + if (gScreenFlags & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) + { + widgets = window_quit_prompt_widgets; + } + else + { + widgets = window_save_prompt_widgets; + } + InitScrollWidgets(); + + // Pause the game if not network play. + if (network_get_mode() == NETWORK_MODE_NONE) + { + gGamePaused |= GAME_PAUSED_MODAL; + OpenRCT2::Audio::StopAll(); + } + + window_invalidate_by_class(WindowClass::TopToolbar); + + StringId stringId = window_save_prompt_labels[EnumValue(_promptMode)][0]; + if (stringId == STR_LOAD_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) + { + stringId = STR_LOAD_LANDSCAPE_PROMPT_TITLE; + } + else if (stringId == STR_QUIT_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) + { + stringId = STR_QUIT_SCENARIO_EDITOR; + } + window_save_prompt_widgets[WIDX_TITLE].text = stringId; + window_save_prompt_widgets[WIDX_LABEL].text = window_save_prompt_labels[EnumValue(_promptMode)][1]; + } + + void OnClose() override + { + // Unpause the game + if (network_get_mode() == NETWORK_MODE_NONE) + { + gGamePaused &= ~GAME_PAUSED_MODAL; + OpenRCT2::Audio::Resume(); + } + + window_invalidate_by_class(WindowClass::TopToolbar); + } + + void OnMouseUp(WidgetIndex widgetIndex) override + { + if (gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) + { + switch (widgetIndex) + { + case WQIDX_OK: + game_load_or_quit_no_save_prompt(); + break; + case WQIDX_CLOSE: + case WQIDX_CANCEL: + Close(); + break; + } + return; + } + + switch (widgetIndex) + { + case WIDX_SAVE: + { + std::unique_ptr intent; + + if (gScreenFlags & (SCREEN_FLAGS_EDITOR)) + { + intent = std::make_unique(WindowClass::Loadsave); + intent->putExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE); + intent->putExtra(INTENT_EXTRA_PATH, gScenarioName); + } + else + { + intent = create_save_game_as_intent(); + } + Close(); + intent->putExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(WindowSavePromptCallback)); + context_open_intent(intent.get()); + break; + } + case WIDX_DONT_SAVE: + game_load_or_quit_no_save_prompt(); + return; + case WIDX_CLOSE: + case WIDX_CANCEL: + Close(); + return; + } + } + + void OnDraw(rct_drawpixelinfo& dpi) override + { + DrawWidgets(dpi); + } +}; + rct_window* WindowSavePromptOpen() { - int32_t width, height; - StringId stringId; - rct_window* window; - PromptMode prompt_mode; - rct_widget* widgets; - - prompt_mode = gSavePromptMode; + PromptMode prompt_mode = gSavePromptMode; if (prompt_mode == PromptMode::Quit) + { prompt_mode = PromptMode::SaveBeforeQuit; + } // do not show save prompt if we're in the title demo and click on load game if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) @@ -119,133 +217,28 @@ rct_window* WindowSavePromptOpen() } // Check if window is already open - window = window_bring_to_front_by_class(WindowClass::SavePrompt); + rct_window* window = window_bring_to_front_by_class(WindowClass::SavePrompt); if (window != nullptr) { window_close(*window); } - if (gScreenFlags & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) - { - widgets = window_quit_prompt_widgets; - width = WW_QUIT; - height = WH_QUIT; - } - else - { - widgets = window_save_prompt_widgets; - width = WW_SAVE; - height = WH_SAVE; - } - if (EnumValue(prompt_mode) >= std::size(window_save_prompt_labels)) { log_warning("Invalid save prompt mode %u", prompt_mode); return nullptr; } - window = WindowCreateCentred( - width, height, &window_save_prompt_events, WindowClass::SavePrompt, WF_TRANSPARENT | WF_STICK_TO_FRONT); - window->widgets = widgets; - WindowInitScrollWidgets(*window); - - // Pause the game if not network play. - if (network_get_mode() == NETWORK_MODE_NONE) + int32_t width = WW_SAVE; + int32_t height = WH_SAVE; + if (gScreenFlags & (SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { - gGamePaused |= GAME_PAUSED_MODAL; - OpenRCT2::Audio::StopAll(); + width = WW_QUIT; + height = WH_QUIT; } - window_invalidate_by_class(WindowClass::TopToolbar); - - stringId = window_save_prompt_labels[EnumValue(prompt_mode)][0]; - if (stringId == STR_LOAD_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) - stringId = STR_LOAD_LANDSCAPE_PROMPT_TITLE; - if (stringId == STR_QUIT_GAME_PROMPT_TITLE && gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) - stringId = STR_QUIT_SCENARIO_EDITOR; - window_save_prompt_widgets[WIDX_TITLE].text = stringId; - window_save_prompt_widgets[WIDX_LABEL].text = window_save_prompt_labels[EnumValue(prompt_mode)][1]; - - return window; -} - -/** - * - * rct2: 0x0066DF17 - */ -static void WindowSavePromptClose(rct_window* w) -{ - // Unpause the game - if (network_get_mode() == NETWORK_MODE_NONE) - { - gGamePaused &= ~GAME_PAUSED_MODAL; - OpenRCT2::Audio::Resume(); - } - - window_invalidate_by_class(WindowClass::TopToolbar); -} - -/** - * - * rct2: 0x0066DDF2 - */ -static void WindowSavePromptMouseup(rct_window* w, WidgetIndex widgetIndex) -{ - if (gScreenFlags & (SCREEN_FLAGS_TITLE_DEMO | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) - { - switch (widgetIndex) - { - case WQIDX_OK: - game_load_or_quit_no_save_prompt(); - break; - case WQIDX_CLOSE: - case WQIDX_CANCEL: - window_close(*w); - break; - } - return; - } - - switch (widgetIndex) - { - case WIDX_SAVE: - { - std::unique_ptr intent; - - if (gScreenFlags & (SCREEN_FLAGS_EDITOR)) - { - intent = std::make_unique(WindowClass::Loadsave); - intent->putExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE); - intent->putExtra(INTENT_EXTRA_PATH, gScenarioName); - } - else - { - intent = create_save_game_as_intent(); - } - window_close(*w); - intent->putExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(WindowSavePromptCallback)); - context_open_intent(intent.get()); - break; - } - case WIDX_DONT_SAVE: - game_load_or_quit_no_save_prompt(); - return; - case WIDX_CLOSE: - case WIDX_CANCEL: - window_close(*w); - return; - } -} - -static void WindowSavePromptPaint(rct_window* w, rct_drawpixelinfo* dpi) -{ - WindowDrawWidgets(*w, dpi); -} - -static void WindowSavePromptCallback(int32_t result, const utf8* path) -{ - if (result == MODAL_RESULT_OK) - { - game_load_or_quit_no_save_prompt(); - } + auto savePromptWindow = std::make_unique(prompt_mode); + return WindowCreate( + std::move(savePromptWindow), WindowClass::SavePrompt, {}, width, height, + WF_TRANSPARENT | WF_STICK_TO_FRONT | WF_CENTRE_SCREEN | WF_AUTO_POSITION); }