From 0613dc63370b222ad830c1f1afef7d2cfbf24846 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Fri, 3 Jan 2025 02:46:30 +0000 Subject: [PATCH] options_menu: find nearest window size on lock, intro transition fixes --- UnleashedRecomp/ui/game_window.cpp | 24 +++++++++++++--- UnleashedRecomp/ui/game_window.h | 2 +- UnleashedRecomp/ui/options_menu.cpp | 43 ++++++++++++----------------- UnleashedRecomp/user/config.h | 1 + 4 files changed, 39 insertions(+), 31 deletions(-) diff --git a/UnleashedRecomp/ui/game_window.cpp b/UnleashedRecomp/ui/game_window.cpp index 41e57b1..2edcefa 100644 --- a/UnleashedRecomp/ui/game_window.cpp +++ b/UnleashedRecomp/ui/game_window.cpp @@ -181,6 +181,13 @@ void GameWindow::Init(const char* sdlVideoDriver) SetProcessDPIAware(); #endif + Config::WindowSize.LockCallback = [](ConfigDef* def) + { + // Try matching the current window size with a known configuration. + if (def->Value < 0) + def->Value = GameWindow::FindNearestDisplayMode(); + }; + Config::WindowSize.ApplyCallback = [](ConfigDef* def) { auto displayModes = GetDisplayModes(); @@ -519,19 +526,28 @@ std::vector GameWindow::GetDisplayModes(bool ignoreInvalidModes return result; } -int GameWindow::FindMatchingDisplayMode() +int GameWindow::FindNearestDisplayMode() { + auto result = -1; auto displayModes = GetDisplayModes(); + auto currentDiff = std::numeric_limits::max(); for (int i = 0; i < displayModes.size(); i++) { auto& mode = displayModes[i]; - if (mode.w == s_width && mode.h == s_height) - return i; + auto widthDiff = abs(mode.w - s_width); + auto heightDiff = abs(mode.h - s_height); + auto totalDiff = widthDiff + heightDiff; + + if (totalDiff < currentDiff) + { + currentDiff = totalDiff; + result = i; + } } - return -1; + return result; } bool GameWindow::IsPositionValid() diff --git a/UnleashedRecomp/ui/game_window.h b/UnleashedRecomp/ui/game_window.h index dadd407..95d2ddc 100644 --- a/UnleashedRecomp/ui/game_window.h +++ b/UnleashedRecomp/ui/game_window.h @@ -44,7 +44,7 @@ public: static int GetDisplay(); static void SetDisplay(int displayIndex); static std::vector GetDisplayModes(bool ignoreInvalidModes = true, bool ignoreRefreshRates = true); - static int FindMatchingDisplayMode(); + static int FindNearestDisplayMode(); static bool IsPositionValid(); static void Init(const char* sdlVideoDriver = nullptr); static void Update(); diff --git a/UnleashedRecomp/ui/options_menu.cpp b/UnleashedRecomp/ui/options_menu.cpp index 332d44a..bb67687 100644 --- a/UnleashedRecomp/ui/options_menu.cpp +++ b/UnleashedRecomp/ui/options_menu.cpp @@ -505,6 +505,9 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef* conf // remember value s_oldValue = config->Value; + if (config->LockCallback) + config->LockCallback(config); + Game_PlaySound("sys_worldmap_decide"); } else @@ -781,13 +784,9 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef* conf { auto displayModes = GameWindow::GetDisplayModes(); - // Try matching the current window size with a known configuration. - if (config->Value < 0) - config->Value = GameWindow::FindMatchingDisplayMode(); - if (config->Value >= 0 && config->Value < displayModes.size()) { - auto displayMode = displayModes[config->Value]; + auto& displayMode = displayModes[config->Value]; valueText = fmt::format("{}x{}", displayMode.w, displayMode.h); } @@ -1005,6 +1004,8 @@ static void DrawSettingsPanel() if (DrawCategories()) { DrawConfigOptions(); + + g_isControlsVisible = true; } else { @@ -1147,14 +1148,7 @@ static bool DrawFadeTransition() if (scaleMotion < 0.8) return false; - if (fgAlphaOutMotion >= 1.0) - { - g_isControlsVisible = true; - } - else - { - drawList->AddRectFilled({ 0, 0 }, res, IM_COL32(0, 0, 0, Lerp(255, 0, fgAlphaOutMotion))); - } + drawList->AddRectFilled({ 0, 0 }, res, IM_COL32(0, 0, 0, Lerp(255, 0, fgAlphaOutMotion))); return fgAlphaOutMotion >= 1.0; } @@ -1175,10 +1169,7 @@ void OptionsMenu::Init() void OptionsMenu::Draw() { if (!s_isVisible) - { - g_isControlsVisible = false; return; - } // We've entered the menu now, no need to check this. auto pInputState = SWA::CInputState::GetInstance(); @@ -1190,10 +1181,6 @@ void OptionsMenu::Draw() if (!DrawMilesElectric()) return; } - else - { - g_isControlsVisible = true; - } if (!g_isClosing) { @@ -1249,18 +1236,22 @@ void OptionsMenu::Open(bool isPause, SWA::EMenuType pauseMenuType) void OptionsMenu::Close() { - g_isClosing = true; - g_appearTime = ImGui::GetTime(); + if (!g_isClosing) + { + g_appearTime = ImGui::GetTime(); + g_isControlsVisible = false; + g_isClosing = true; + + ButtonGuide::Close(); + Config::Save(); + } // Skip Miles Electric animation at main menu. if (!g_isStage) SetOptionsMenuVisible(false); - - ButtonGuide::Close(); - Config::Save(); } bool OptionsMenu::CanClose() { - return !g_lockedOnOption; + return !g_lockedOnOption && g_isControlsVisible; } diff --git a/UnleashedRecomp/user/config.h b/UnleashedRecomp/user/config.h index 365e56c..0f335fb 100644 --- a/UnleashedRecomp/user/config.h +++ b/UnleashedRecomp/user/config.h @@ -294,6 +294,7 @@ public: std::map EnumTemplateReverse{}; CONFIG_ENUM_LOCALE(T)* EnumLocale{}; std::function*)> Callback; + std::function*)> LockCallback; std::function*)> ApplyCallback; // CONFIG_DEFINE