From b15102d45a5af36a603fe343372ccf9e38299320 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 26 Aug 2023 23:14:29 +1000 Subject: [PATCH] FullscreenUI: Make back button go back to pause menu --- pcsx2/ImGui/FullscreenUI.cpp | 152 ++++++++++++++++++++++------------- 1 file changed, 96 insertions(+), 56 deletions(-) diff --git a/pcsx2/ImGui/FullscreenUI.cpp b/pcsx2/ImGui/FullscreenUI.cpp index 2ca1468491..fbb1e59622 100644 --- a/pcsx2/ImGui/FullscreenUI.cpp +++ b/pcsx2/ImGui/FullscreenUI.cpp @@ -211,6 +211,7 @@ namespace FullscreenUI static void PauseForMenuOpen(); static void ClosePauseMenu(); static void OpenPauseSubMenu(PauseSubMenu submenu); + static void ReturnToPreviousWindow(); static void ReturnToMainWindow(); static void DrawLandingWindow(); static void DrawPauseMenu(MainWindowType type); @@ -629,7 +630,7 @@ void FullscreenUI::CheckForConfigChanges(const Pcsx2Config& old_config) MTGS::RunOnGSThread([]() { if (s_current_main_window == MainWindowType::Achievements || s_current_main_window == MainWindowType::Leaderboards) { - ReturnToMainWindow(); + ReturnToPreviousWindow(); } }); MTGS::WaitGS(false, false, false); @@ -661,6 +662,8 @@ void FullscreenUI::OnVMDestroyed() return; s_pause_menu_was_open = false; + s_was_paused_on_quick_menu_open = false; + s_current_pause_submenu = PauseSubMenu::None; SwitchToLanding(); }); } @@ -872,6 +875,24 @@ void FullscreenUI::InvalidateCoverCache() MTGS::RunOnGSThread([]() { s_cover_image_map.clear(); }); } +void FullscreenUI::ReturnToPreviousWindow() +{ + if (!VMManager::HasValidVM()) + { + SwitchToLanding(); + return; + } + else if (s_pause_menu_was_open) + { + s_current_main_window = MainWindowType::PauseMenu; + QueueResetFocus(); + } + else + { + s_current_main_window = MainWindowType::None; + } +} + void FullscreenUI::ReturnToMainWindow() { if (s_pause_menu_was_open) @@ -1069,7 +1090,7 @@ void FullscreenUI::DoChangeDiscFromFile() QueueResetFocus(); CloseFileSelector(); - ReturnToMainWindow(); + ReturnToPreviousWindow(); }; OpenFileSelector(ICON_FA_COMPACT_DISC " Select Disc Image", false, std::move(callback), GetDiscImageFilters(), @@ -2546,7 +2567,7 @@ void FullscreenUI::DrawSettingsWindow() if (WantsToCloseMenu()) { if (ImGui::IsWindowFocused()) - ReturnToMainWindow(); + ReturnToPreviousWindow(); } auto lock = Host::GetSettingsLock(); @@ -4386,8 +4407,10 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) { ImDrawList* dl = ImGui::GetBackgroundDrawList(); const ImVec2 display_size(ImGui::GetIO().DisplaySize); - const ImU32 text_color = IM_COL32(UIBackgroundTextColor.x * 255, UIBackgroundTextColor.y * 255, UIBackgroundTextColor.z * 255, 255); - dl->AddRectFilled(ImVec2(0.0f, 0.0f), display_size, IM_COL32(UIBackgroundColor.x * 255, UIBackgroundColor.y * 255, UIBackgroundColor.z * 255, 200)); + const ImU32 text_color = + IM_COL32(UIBackgroundTextColor.x * 255, UIBackgroundTextColor.y * 255, UIBackgroundTextColor.z * 255, 255); + dl->AddRectFilled(ImVec2(0.0f, 0.0f), display_size, + IM_COL32(UIBackgroundColor.x * 255, UIBackgroundColor.y * 255, UIBackgroundColor.z * 255, 200)); // title info { @@ -4400,17 +4423,17 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) const float image_width = has_rich_presence ? 60.0f : 50.0f; const float image_height = has_rich_presence ? 90.0f : 75.0f; const std::string_view path_string(Path::GetFileName(s_current_disc_path)); - const ImVec2 title_size( - g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), -1.0f, s_current_game_title.c_str())); - const ImVec2 path_size(path_string.empty() ? - ImVec2(0.0f, 0.0f) : - g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, - path_string.data(), path_string.data() + path_string.length())); + const ImVec2 title_size(g_large_font->CalcTextSizeA( + g_large_font->FontSize, std::numeric_limits::max(), -1.0f, s_current_game_title.c_str())); + const ImVec2 path_size(path_string.empty() ? ImVec2(0.0f, 0.0f) : + g_medium_font->CalcTextSizeA(g_medium_font->FontSize, + std::numeric_limits::max(), -1.0f, path_string.data(), + path_string.data() + path_string.length())); const ImVec2 subtitle_size(g_medium_font->CalcTextSizeA( g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, s_current_game_subtitle.c_str())); - ImVec2 title_pos( - display_size.x - LayoutScale(10.0f + image_width + 20.0f) - title_size.x, display_size.y - LayoutScale(10.0f + image_height)); + ImVec2 title_pos(display_size.x - LayoutScale(10.0f + image_width + 20.0f) - title_size.x, + display_size.y - LayoutScale(10.0f + image_height)); ImVec2 path_pos(display_size.x - LayoutScale(10.0f + image_width + 20.0f) - path_size.x, title_pos.y + g_large_font->FontSize + LayoutScale(4.0f)); ImVec2 subtitle_pos(display_size.x - LayoutScale(10.0f + image_width + 20.0f) - subtitle_size.x, @@ -4434,8 +4457,8 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) if (!rp.empty()) { const float wrap_width = LayoutScale(350.0f); - const ImVec2 rp_size = g_medium_font->CalcTextSizeA( - g_medium_font->FontSize, std::numeric_limits::max(), wrap_width, rp.data(), rp.data() + rp.size()); + const ImVec2 rp_size = g_medium_font->CalcTextSizeA(g_medium_font->FontSize, + std::numeric_limits::max(), wrap_width, rp.data(), rp.data() + rp.size()); // we make the image one line higher, so we only need to compensate when it's multiline RP rp_height = rp_size.y - g_medium_font->FontSize; @@ -4454,11 +4477,12 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) GSTexture* const cover = GetCoverForCurrentGame(); - const ImVec2 image_min( - display_size.x - LayoutScale(10.0f + image_width) - rp_height, display_size.y - LayoutScale(10.0f + image_height) - rp_height); - const ImVec2 image_max(image_min.x + LayoutScale(image_width) + rp_height, image_min.y + LayoutScale(image_height) + rp_height); - const ImRect image_rect(CenterImage( - ImRect(image_min, image_max), ImVec2(static_cast(cover->GetWidth()), static_cast(cover->GetHeight())))); + const ImVec2 image_min(display_size.x - LayoutScale(10.0f + image_width) - rp_height, + display_size.y - LayoutScale(10.0f + image_height) - rp_height); + const ImVec2 image_max( + image_min.x + LayoutScale(image_width) + rp_height, image_min.y + LayoutScale(image_height) + rp_height); + const ImRect image_rect(CenterImage(ImRect(image_min, image_max), + ImVec2(static_cast(cover->GetWidth()), static_cast(cover->GetHeight())))); dl->AddImage(cover->GetNativeHandle(), image_rect.Min, image_rect.Max); } @@ -4474,7 +4498,8 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) #endif std::strftime(buf, sizeof(buf), "%X", <ime); - const ImVec2 time_size(g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); + const ImVec2 time_size( + g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); const ImVec2 time_pos(display_size.x - LayoutScale(10.0f) - time_size.x, LayoutScale(10.0f)); DrawShadowedText(dl, g_large_font, time_pos, text_color, buf); @@ -4486,15 +4511,17 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) const std::string session_time_str(GameList::FormatTimespan(session_time, true)); std::snprintf(buf, std::size(buf), "This Session: %s", session_time_str.c_str()); - const ImVec2 session_size(g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); - const ImVec2 session_pos( - display_size.x - LayoutScale(10.0f) - session_size.x, time_pos.y + g_large_font->FontSize + LayoutScale(4.0f)); + const ImVec2 session_size( + g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); + const ImVec2 session_pos(display_size.x - LayoutScale(10.0f) - session_size.x, + time_pos.y + g_large_font->FontSize + LayoutScale(4.0f)); DrawShadowedText(dl, g_medium_font, session_pos, text_color, buf); std::snprintf(buf, std::size(buf), "All Time: %s", played_time_str.c_str()); - const ImVec2 total_size(g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); - const ImVec2 total_pos( - display_size.x - LayoutScale(10.0f) - total_size.x, session_pos.y + g_medium_font->FontSize + LayoutScale(4.0f)); + const ImVec2 total_size( + g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); + const ImVec2 total_pos(display_size.x - LayoutScale(10.0f) - total_size.x, + session_pos.y + g_medium_font->FontSize + LayoutScale(4.0f)); DrawShadowedText(dl, g_medium_font, total_pos, text_color, buf); } } @@ -4502,8 +4529,8 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) const ImVec2 window_size(LayoutScale(500.0f, LAYOUT_SCREEN_HEIGHT)); const ImVec2 window_pos(0.0f, display_size.y - window_size.y); - if (BeginFullscreenWindow( - window_pos, window_size, "pause_menu", ImVec4(0.0f, 0.0f, 0.0f, 0.0f), 0.0f, 10.0f, ImGuiWindowFlags_NoBackground)) + if (BeginFullscreenWindow(window_pos, window_size, "pause_menu", ImVec4(0.0f, 0.0f, 0.0f, 0.0f), 0.0f, 10.0f, + ImGuiWindowFlags_NoBackground)) { static constexpr u32 submenu_item_count[] = { 11, // None @@ -4514,8 +4541,9 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) }; const bool just_focused = ResetFocusHere(); - BeginMenuButtons(submenu_item_count[static_cast(s_current_pause_submenu)], 1.0f, ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, - ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + BeginMenuButtons(submenu_item_count[static_cast(s_current_pause_submenu)], 1.0f, + ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING, + ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); switch (s_current_pause_submenu) { @@ -4524,6 +4552,9 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) // NOTE: Menu close must come first, because otherwise VM destruction options will race. const bool can_load_or_save_state = s_current_disc_crc != 0; + if (just_focused) + ImGui::SetFocusID(ImGui::GetID(ICON_FA_PLAY " Resume Game"), ImGui::GetCurrentWindow()); + if (ActiveButton(ICON_FA_PLAY " Resume Game", false) || WantsToCloseMenu()) ClosePauseMenu(); @@ -4603,13 +4634,14 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) case PauseSubMenu::Exit: { if (just_focused) - ImGui::SetFocusID(ImGui::GetID(ICON_FA_POWER_OFF " Exit Without Saving"), ImGui::GetCurrentWindow()); - - if (ActiveButton(ICON_FA_BACKWARD " Back To Pause Menu", false)) { - OpenPauseSubMenu(PauseSubMenu::None); + ImGui::SetFocusID( + ImGui::GetID(ICON_FA_POWER_OFF " Exit Without Saving"), ImGui::GetCurrentWindow()); } + if (ActiveButton(ICON_FA_BACKWARD " Back To Pause Menu", false) || WantsToCloseMenu()) + OpenPauseSubMenu(PauseSubMenu::None); + if (ActiveButton(ICON_FA_SYNC " Reset System", false)) { ClosePauseMenu(); @@ -4627,7 +4659,10 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) #ifdef ENABLE_ACHIEVEMENTS case PauseSubMenu::Achievements: { - if (ActiveButton(ICON_FA_BACKWARD " Back To Pause Menu", false)) + if (just_focused) + ImGui::SetFocusID(ImGui::GetID(ICON_FA_BACKWARD " Back To Pause Menu"), ImGui::GetCurrentWindow()); + + if (ActiveButton(ICON_FA_BACKWARD " Back To Pause Menu", false) || WantsToCloseMenu()) OpenPauseSubMenu(PauseSubMenu::None); if (ActiveButton(ICON_FA_TROPHY " Achievements", false)) @@ -4765,8 +4800,6 @@ void FullscreenUI::CloseSaveStateSelector() s_save_state_selector_loading = false; s_save_state_selector_resuming = false; s_save_state_selector_game_path = {}; - if (s_current_main_window != MainWindowType::GameList) - ReturnToMainWindow(); } void FullscreenUI::DrawSaveStateSelector(bool is_loading) @@ -4796,7 +4829,10 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading) ImGui::PopStyleVar(5); if (!is_open) + { CloseSaveStateSelector(); + ReturnToPreviousWindow(); + } return; } @@ -4809,7 +4845,10 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading) { BeginNavBar(); if (NavButton(ICON_FA_BACKWARD, true, true)) + { CloseSaveStateSelector(); + ReturnToPreviousWindow(); + } NavTitle(is_loading ? "Load State" : "Save State"); EndNavBar(); @@ -4895,6 +4934,7 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading) Host::RunOnCPUThread([slot = entry.slot]() { VMManager::SaveStateToSlot(slot); }); CloseSaveStateSelector(); + ReturnToMainWindow(); closed = true; } @@ -4917,6 +4957,7 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading) if (s_save_state_selector_slots.empty()) { CloseSaveStateSelector(); + ReturnToMainWindow(); closed = true; } else @@ -5015,17 +5056,13 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading) if (pressed) { if (is_loading) - { DoLoadState(entry.path); - CloseSaveStateSelector(); - break; - } else - { Host::RunOnCPUThread([slot = entry.slot]() { VMManager::SaveStateToSlot(slot); }); - CloseSaveStateSelector(); - break; - } + + CloseSaveStateSelector(); + ReturnToMainWindow(); + break; } if (hovered && @@ -5060,7 +5097,10 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading) ImGui::PopStyleVar(5); if (!close_handled && WantsToCloseMenu()) + { CloseSaveStateSelector(); + ReturnToPreviousWindow(); + } } bool FullscreenUI::OpenLoadStateSelectorForGameResume(const GameList::Entry* entry) @@ -5295,7 +5335,7 @@ void FullscreenUI::DrawGameListWindow() } if (NavButton(ICON_FA_BACKWARD, true, true)) - ReturnToMainWindow(); + ReturnToPreviousWindow(); NavTitle(titles[static_cast(s_game_list_page)]); RightAlignNavButtons(count, ITEM_WIDTH, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); @@ -5341,7 +5381,7 @@ void FullscreenUI::DrawGameList(const ImVec2& heading_size) if (WantsToCloseMenu()) { if (ImGui::IsWindowFocused()) - ReturnToMainWindow(); + ReturnToPreviousWindow(); } const GameList::Entry* selected_entry = nullptr; @@ -5534,7 +5574,7 @@ void FullscreenUI::DrawGameGrid(const ImVec2& heading_size) if (WantsToCloseMenu()) { if (ImGui::IsWindowFocused()) - ReturnToMainWindow(); + ReturnToPreviousWindow(); } ResetFocusHere(); @@ -5701,7 +5741,7 @@ void FullscreenUI::DrawGameListSettingsPage(const ImVec2& heading_size) if (WantsToCloseMenu()) { if (ImGui::IsWindowFocused()) - ReturnToMainWindow(); + ReturnToPreviousWindow(); } auto lock = Host::GetSettingsLock(); @@ -6342,10 +6382,10 @@ void FullscreenUI::DrawAchievementsWindow() const u32 current_points = Achievements::GetCurrentPointsForGame(); const u32 total_points = Achievements::GetMaximumPointsForGame(); - if (FloatingButton(ICON_FA_WINDOW_CLOSE, 10.0f, 10.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font) || WantsToCloseMenu()) - { + if (FloatingButton(ICON_FA_WINDOW_CLOSE, 10.0f, 10.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font)) ReturnToMainWindow(); - } + if (WantsToCloseMenu()) + ReturnToPreviousWindow(); const ImRect title_bb(ImVec2(left, top), ImVec2(right, top + g_large_font->FontSize)); text = Achievements::GetGameTitle(); @@ -6735,10 +6775,10 @@ void FullscreenUI::DrawLeaderboardsWindow() if (!is_leaderboard_open) { - if (FloatingButton(ICON_FA_WINDOW_CLOSE, 10.0f, 10.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font) || WantsToCloseMenu()) - { + if (FloatingButton(ICON_FA_WINDOW_CLOSE, 10.0f, 10.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font)) ReturnToMainWindow(); - } + if (WantsToCloseMenu()) + ReturnToPreviousWindow(); } else {