mirror of
https://github.com/stenzek/duckstation.git
synced 2025-07-02 00:00:09 +00:00
FullscreenUI: Fix crash when loading/saving state
Also fix fade transition.
This commit is contained in:
parent
33b1e82e34
commit
376a2e8d4d
@ -238,6 +238,8 @@ static bool AreAnyDialogsOpen();
|
|||||||
static void ClosePauseMenu();
|
static void ClosePauseMenu();
|
||||||
static void ClosePauseMenuImmediately();
|
static void ClosePauseMenuImmediately();
|
||||||
static void SwitchToMainWindow(MainWindowType type);
|
static void SwitchToMainWindow(MainWindowType type);
|
||||||
|
static void ReturnToMainWindow(float transition_time = GPUThread::HasGPUBackend() ? SHORT_TRANSITION_TIME :
|
||||||
|
DEFAULT_TRANSITION_TIME);
|
||||||
static void DrawLandingTemplate(ImVec2* menu_pos, ImVec2* menu_size);
|
static void DrawLandingTemplate(ImVec2* menu_pos, ImVec2* menu_size);
|
||||||
static void DrawLandingWindow();
|
static void DrawLandingWindow();
|
||||||
static void DrawStartGameWindow();
|
static void DrawStartGameWindow();
|
||||||
@ -1191,12 +1193,12 @@ void FullscreenUI::ReturnToPreviousWindow()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FullscreenUI::ReturnToMainWindow()
|
void FullscreenUI::ReturnToMainWindow(
|
||||||
|
float transition_time /* = GPUThread::HasGPUBackend() ? SHORT_TRANSITION_TIME : DEFAULT_TRANSITION_TIME */)
|
||||||
{
|
{
|
||||||
if (GPUThread::IsSystemPaused() && !s_state.was_paused_on_quick_menu_open)
|
if (GPUThread::IsSystemPaused() && !s_state.was_paused_on_quick_menu_open)
|
||||||
Host::RunOnCPUThread([]() { System::PauseSystem(false); });
|
Host::RunOnCPUThread([]() { System::PauseSystem(false); });
|
||||||
|
|
||||||
const float transition_time = GPUThread::HasGPUBackend() ? SHORT_TRANSITION_TIME : DEFAULT_TRANSITION_TIME;
|
|
||||||
BeginTransition(transition_time, []() {
|
BeginTransition(transition_time, []() {
|
||||||
s_state.previous_main_window = MainWindowType::None;
|
s_state.previous_main_window = MainWindowType::None;
|
||||||
s_state.current_pause_submenu = PauseSubMenu::None;
|
s_state.current_pause_submenu = PauseSubMenu::None;
|
||||||
@ -7366,7 +7368,7 @@ void FullscreenUI::DrawSaveStateSelector()
|
|||||||
|
|
||||||
if (GPUThread::HasGPUBackend())
|
if (GPUThread::HasGPUBackend())
|
||||||
{
|
{
|
||||||
ReturnToMainWindow();
|
ReturnToMainWindow(LONG_TRANSITION_TIME);
|
||||||
|
|
||||||
Host::RunOnCPUThread([game_path = std::move(game_path), state_path = std::move(state_path)]() mutable {
|
Host::RunOnCPUThread([game_path = std::move(game_path), state_path = std::move(state_path)]() mutable {
|
||||||
if (System::IsValid())
|
if (System::IsValid())
|
||||||
@ -7401,7 +7403,7 @@ void FullscreenUI::DrawSaveStateSelector()
|
|||||||
|
|
||||||
static constexpr auto do_save_state = [](s32 slot, bool global) {
|
static constexpr auto do_save_state = [](s32 slot, bool global) {
|
||||||
ClearSaveStateEntryList();
|
ClearSaveStateEntryList();
|
||||||
ReturnToMainWindow();
|
ReturnToMainWindow(LONG_TRANSITION_TIME);
|
||||||
|
|
||||||
Host::RunOnCPUThread([slot, global]() {
|
Host::RunOnCPUThread([slot, global]() {
|
||||||
if (!System::IsValid())
|
if (!System::IsValid())
|
||||||
@ -7422,7 +7424,7 @@ void FullscreenUI::DrawSaveStateSelector()
|
|||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
const ImVec2 heading_size = ImVec2(
|
const ImVec2 heading_size = ImVec2(
|
||||||
io.DisplaySize.x, UIStyle.LargeFontSize + (LayoutScale(LAYOUT_MENU_BUTTON_Y_PADDING) * 2.0f) + LayoutScale(2.0f));
|
io.DisplaySize.x, UIStyle.LargeFontSize + (LayoutScale(LAYOUT_MENU_BUTTON_Y_PADDING) * 2.0f) + LayoutScale(2.0f));
|
||||||
|
SaveStateListEntry* pressed_entry = nullptr;
|
||||||
bool closed = false;
|
bool closed = false;
|
||||||
|
|
||||||
// last state deleted?
|
// last state deleted?
|
||||||
@ -7535,12 +7537,8 @@ void FullscreenUI::DrawSaveStateSelector()
|
|||||||
|
|
||||||
if (pressed)
|
if (pressed)
|
||||||
{
|
{
|
||||||
if (s_state.save_state_selector_loading)
|
// avoid closing while drawing
|
||||||
do_load_state(std::move(entry.game_path), std::move(entry.state_path));
|
pressed_entry = &entry;
|
||||||
else
|
|
||||||
do_save_state(entry.slot, entry.global);
|
|
||||||
|
|
||||||
closed = true;
|
|
||||||
}
|
}
|
||||||
else if (hovered &&
|
else if (hovered &&
|
||||||
(ImGui::IsItemClicked(ImGuiMouseButton_Right) ||
|
(ImGui::IsItemClicked(ImGuiMouseButton_Right) ||
|
||||||
@ -7652,7 +7650,14 @@ void FullscreenUI::DrawSaveStateSelector()
|
|||||||
GetBackgroundAlpha());
|
GetBackgroundAlpha());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!AreAnyDialogsOpen() && WantsToCloseMenu()) || closed)
|
if (pressed_entry)
|
||||||
|
{
|
||||||
|
if (s_state.save_state_selector_loading)
|
||||||
|
do_load_state(std::move(pressed_entry->game_path), std::move(pressed_entry->state_path));
|
||||||
|
else
|
||||||
|
do_save_state(pressed_entry->slot, pressed_entry->global);
|
||||||
|
}
|
||||||
|
else if ((!AreAnyDialogsOpen() && WantsToCloseMenu()) || closed)
|
||||||
{
|
{
|
||||||
ClearSaveStateEntryList();
|
ClearSaveStateEntryList();
|
||||||
ReturnToPreviousWindow();
|
ReturnToPreviousWindow();
|
||||||
|
@ -79,7 +79,6 @@ void OpenCheatsMenu();
|
|||||||
void OpenDiscChangeMenu();
|
void OpenDiscChangeMenu();
|
||||||
void OpenAchievementsWindow();
|
void OpenAchievementsWindow();
|
||||||
void OpenLeaderboardsWindow();
|
void OpenLeaderboardsWindow();
|
||||||
void ReturnToMainWindow();
|
|
||||||
void ReturnToPreviousWindow();
|
void ReturnToPreviousWindow();
|
||||||
void SetStandardSelectionFooterText(bool back_instead_of_cancel);
|
void SetStandardSelectionFooterText(bool back_instead_of_cancel);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user