From 728f643ea76278dcf89f9ac066062e7b895e46c8 Mon Sep 17 00:00:00 2001 From: grorp Date: Fri, 24 May 2024 12:10:46 +0200 Subject: [PATCH] Scale C++ menus down to fit the window (#14690) --- src/gui/guiKeyChangeMenu.cpp | 10 +++------- src/gui/guiOpenURL.cpp | 10 +++------- src/gui/guiPasswordChange.cpp | 11 +++-------- src/gui/guiVolumeChange.cpp | 10 +++------- src/gui/modalMenu.cpp | 14 ++++++++++++++ src/gui/modalMenu.h | 6 ++++++ 6 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/gui/guiKeyChangeMenu.cpp b/src/gui/guiKeyChangeMenu.cpp index 3d8c13e5e..b8c1143f2 100644 --- a/src/gui/guiKeyChangeMenu.cpp +++ b/src/gui/guiKeyChangeMenu.cpp @@ -107,13 +107,9 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) removeAllChildren(); key_used_text = nullptr; - const float s = m_gui_scale; - DesiredRect = core::rect( - screensize.X / 2 - 835 * s / 2, - screensize.Y / 2 - 430 * s / 2, - screensize.X / 2 + 835 * s / 2, - screensize.Y / 2 + 430 * s / 2 - ); + ScalingInfo info = getScalingInfo(screensize, v2u32(835, 430)); + const float s = info.scale; + DesiredRect = info.rect; recalculateAbsolutePosition(false); v2s32 size = DesiredRect.getSize(); diff --git a/src/gui/guiOpenURL.cpp b/src/gui/guiOpenURL.cpp index 33be88162..f20d8ba7b 100644 --- a/src/gui/guiOpenURL.cpp +++ b/src/gui/guiOpenURL.cpp @@ -66,13 +66,9 @@ void GUIOpenURLMenu::regenerateGui(v2u32 screensize) /* Calculate new sizes and positions */ - const float s = m_gui_scale; - DesiredRect = core::rect( - screensize.X / 2 - 580 * s / 2, - screensize.Y / 2 - 250 * s / 2, - screensize.X / 2 + 580 * s / 2, - screensize.Y / 2 + 250 * s / 2 - ); + ScalingInfo info = getScalingInfo(screensize, v2u32(580, 250)); + const float s = info.scale; + DesiredRect = info.rect; recalculateAbsolutePosition(false); v2s32 size = DesiredRect.getSize(); diff --git a/src/gui/guiPasswordChange.cpp b/src/gui/guiPasswordChange.cpp index 6b0c0063d..d3c1867a8 100644 --- a/src/gui/guiPasswordChange.cpp +++ b/src/gui/guiPasswordChange.cpp @@ -62,14 +62,9 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) /* Calculate new sizes and positions */ - const float s = m_gui_scale; - - DesiredRect = core::rect( - screensize.X / 2 - 580 * s / 2, - screensize.Y / 2 - 300 * s / 2, - screensize.X / 2 + 580 * s / 2, - screensize.Y / 2 + 300 * s / 2 - ); + ScalingInfo info = getScalingInfo(screensize, v2u32(580, 300)); + const float s = info.scale; + DesiredRect = info.rect; recalculateAbsolutePosition(false); v2s32 size = DesiredRect.getSize(); diff --git a/src/gui/guiVolumeChange.cpp b/src/gui/guiVolumeChange.cpp index 3043a27a8..a6608dd18 100644 --- a/src/gui/guiVolumeChange.cpp +++ b/src/gui/guiVolumeChange.cpp @@ -54,13 +54,9 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize) /* Calculate new sizes and positions */ - const float s = m_gui_scale; - DesiredRect = core::rect( - screensize.X / 2 - 380 * s / 2, - screensize.Y / 2 - 200 * s / 2, - screensize.X / 2 + 380 * s / 2, - screensize.Y / 2 + 200 * s / 2 - ); + ScalingInfo info = getScalingInfo(screensize, v2u32(380, 200)); + const float s = info.scale; + DesiredRect = info.rect; recalculateAbsolutePosition(false); v2s32 size = DesiredRect.getSize(); diff --git a/src/gui/modalMenu.cpp b/src/gui/modalMenu.cpp index d95311035..00bc143bb 100644 --- a/src/gui/modalMenu.cpp +++ b/src/gui/modalMenu.cpp @@ -398,3 +398,17 @@ porting::AndroidDialogState GUIModalMenu::getAndroidUIInputState() return porting::getInputDialogState(); } #endif + +GUIModalMenu::ScalingInfo GUIModalMenu::getScalingInfo(v2u32 screensize, v2u32 base_size) +{ + f32 scale = m_gui_scale; + scale = std::min(scale, (f32)screensize.X / (f32)base_size.X); + scale = std::min(scale, (f32)screensize.Y / (f32)base_size.Y); + s32 w = base_size.X * scale, h = base_size.Y * scale; + return {scale, core::rect( + screensize.X / 2 - w / 2, + screensize.Y / 2 - h / 2, + screensize.X / 2 + w / 2, + screensize.Y / 2 + h / 2 + )}; +} diff --git a/src/gui/modalMenu.h b/src/gui/modalMenu.h index 7ee8531d0..071024120 100644 --- a/src/gui/modalMenu.h +++ b/src/gui/modalMenu.h @@ -94,6 +94,12 @@ class GUIModalMenu : public gui::IGUIElement std::string m_jni_field_name; #endif + struct ScalingInfo { + f32 scale; + core::rect rect; + }; + ScalingInfo getScalingInfo(v2u32 screensize, v2u32 base_size); + // This is set to true if the menu is currently processing a second-touch event. bool m_second_touch = false; // This is set to true if the menu is currently processing a mouse event