From 29f1c7c68f2cfc60df1477ec1f3ade01fdc2426b Mon Sep 17 00:00:00 2001 From: Andrew Lanzone Date: Sat, 19 Jul 2025 17:12:09 -0700 Subject: [PATCH] Remove some hardcoded menu sizes for inventory mode --- apps/openmw/mwbase/windowmanager.hpp | 2 ++ apps/openmw/mwgui/controllerbuttonsoverlay.cpp | 8 ++++++++ apps/openmw/mwgui/controllerbuttonsoverlay.hpp | 1 + apps/openmw/mwgui/inventorytabsoverlay.cpp | 7 +++++++ apps/openmw/mwgui/inventorytabsoverlay.hpp | 1 + apps/openmw/mwgui/inventorywindow.cpp | 6 ++++-- apps/openmw/mwgui/mapwindow.cpp | 5 +++-- apps/openmw/mwgui/spellwindow.cpp | 8 +++++--- apps/openmw/mwgui/statswindow.cpp | 7 ++++--- apps/openmw/mwgui/statswindow.hpp | 4 ++++ apps/openmw/mwgui/windowmanagerimp.cpp | 10 ++++++++++ apps/openmw/mwgui/windowmanagerimp.hpp | 1 + 12 files changed, 50 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index 8a9bd3dab9..b7380e6442 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -387,6 +387,8 @@ namespace MWBase /// Return the window that should receive controller events virtual MWGui::WindowBase* getActiveControllerWindow() = 0; + /// Return the available height for menus accounting for visible controller overlays + virtual int getControllerMenuHeight() = 0; /// Cycle to the next window to receive controller events virtual void cycleActiveControllerWindow(bool next) = 0; virtual void setActiveControllerWindow(MWGui::GuiMode mode, int activeIndex) = 0; diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp index 197b11f698..dc3534e1b9 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp @@ -1,5 +1,7 @@ #include "controllerbuttonsoverlay.hpp" +#include + #include "../mwbase/environment.hpp" #include "../mwbase/inputmanager.hpp" #include "../mwbase/windowmanager.hpp" @@ -37,6 +39,12 @@ namespace MWGui getWidget(mHBox, "ButtonBox"); } + int ControllerButtonsOverlay::getHeight() + { + MyGUI::Window* window = mMainWidget->castType(); + return window->getHeight(); + } + void ControllerButtonsOverlay::setButtons(ControllerButtonStr* buttons) { int buttonCount = 0; diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp index 1e64da6565..44f93580a3 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp @@ -15,6 +15,7 @@ namespace MWGui public: ControllerButtonsOverlay(); + int getHeight(); void setButtons(ControllerButtonStr* buttons); private: diff --git a/apps/openmw/mwgui/inventorytabsoverlay.cpp b/apps/openmw/mwgui/inventorytabsoverlay.cpp index 062e7dbcb4..fb9c7dec3d 100644 --- a/apps/openmw/mwgui/inventorytabsoverlay.cpp +++ b/apps/openmw/mwgui/inventorytabsoverlay.cpp @@ -1,6 +1,7 @@ #include "inventorytabsoverlay.hpp" #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/inputmanager.hpp" @@ -39,6 +40,12 @@ namespace MWGui MWBase::Environment::get().getInputManager()->getControllerAxisIcon(SDL_CONTROLLER_AXIS_TRIGGERRIGHT)); } + int InventoryTabsOverlay::getHeight() + { + MyGUI::Window* window = mMainWidget->castType(); + return window->getHeight(); + } + void InventoryTabsOverlay::onTabClicked(MyGUI::Widget* sender) { if (!MWBase::Environment::get().getWindowManager()->getJournalAllowed()) diff --git a/apps/openmw/mwgui/inventorytabsoverlay.hpp b/apps/openmw/mwgui/inventorytabsoverlay.hpp index 5368d9710f..1f5cf39607 100644 --- a/apps/openmw/mwgui/inventorytabsoverlay.hpp +++ b/apps/openmw/mwgui/inventorytabsoverlay.hpp @@ -12,6 +12,7 @@ namespace MWGui public: InventoryTabsOverlay(); + int getHeight(); void setTab(int index); private: diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index 6b1ea84c68..dcd9d1dc74 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -42,6 +42,7 @@ #include "itemview.hpp" #include "settings.hpp" #include "sortfilteritemmodel.hpp" +#include "statswindow.hpp" #include "tooltips.hpp" #include "tradeitemmodel.hpp" #include "tradewindow.hpp" @@ -1109,13 +1110,14 @@ namespace MWGui if (!Settings::gui().mControllerMenus) return; - if (MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_Inventory) + MWBase::WindowManager* winMgr = MWBase::Environment::get().getWindowManager(); + if (winMgr->getMode() == MWGui::GM_Inventory) { // Fill the screen, or limit to a certain size on large screens. Size chosen to // match the size of the stats window. MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); int width = std::min(viewSize.width, 1600); - int height = std::min(viewSize.height - 48 - 48, 750); + int height = std::min(winMgr->getControllerMenuHeight(), StatsWindow::getIdealHeight()); int x = (viewSize.width - width) / 2; int y = (viewSize.height - height) / 2; diff --git a/apps/openmw/mwgui/mapwindow.cpp b/apps/openmw/mwgui/mapwindow.cpp index 0774e6ccdf..5b0e5dc7cc 100644 --- a/apps/openmw/mwgui/mapwindow.cpp +++ b/apps/openmw/mwgui/mapwindow.cpp @@ -1440,13 +1440,14 @@ namespace MWGui void MapWindow::setActiveControllerWindow(bool active) { - if (MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_Inventory) + MWBase::WindowManager* winMgr = MWBase::Environment::get().getWindowManager(); + if (winMgr->getMode() == MWGui::GM_Inventory) { // Fill the screen, or limit to a certain size on large screens. Size chosen to // show the entire local map without scrolling. MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); int width = std::min(viewSize.width, 1552); - int height = std::min(viewSize.height - 48 - 48, 1572); + int height = std::min(winMgr->getControllerMenuHeight(), 1572); int x = (viewSize.width - width) / 2; int y = (viewSize.height - height) / 2; diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index dee81a5ded..b5533c2f61 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -29,6 +29,7 @@ #include "confirmationdialog.hpp" #include "spellicons.hpp" #include "spellview.hpp" +#include "statswindow.hpp" namespace MWGui { @@ -313,13 +314,14 @@ namespace MWGui void SpellWindow::setActiveControllerWindow(bool active) { - if (MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_Inventory) + MWBase::WindowManager* winMgr = MWBase::Environment::get().getWindowManager(); + if (winMgr->getMode() == MWGui::GM_Inventory) { // Fill the screen, or limit to a certain size on large screens. Size chosen to // match the size of the stats window. MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); - int width = std::min(viewSize.width, 600); - int height = std::min(viewSize.height - 48 - 48, 750); + int width = std::min(viewSize.width, StatsWindow::getIdealWidth()); + int height = std::min(winMgr->getControllerMenuHeight(), StatsWindow::getIdealHeight()); int x = (viewSize.width - width) / 2; int y = (viewSize.height - height) / 2; diff --git a/apps/openmw/mwgui/statswindow.cpp b/apps/openmw/mwgui/statswindow.cpp index 3f60e0e49f..1552a90295 100644 --- a/apps/openmw/mwgui/statswindow.cpp +++ b/apps/openmw/mwgui/statswindow.cpp @@ -745,13 +745,14 @@ namespace MWGui void StatsWindow::setActiveControllerWindow(bool active) { - if (MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_Inventory) + MWBase::WindowManager* winMgr = MWBase::Environment::get().getWindowManager(); + if (winMgr->getMode() == MWGui::GM_Inventory) { // Fill the screen, or limit to a certain size on large screens. Size chosen to // show all stats. MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); - int width = std::min(viewSize.width, 600); - int height = std::min(viewSize.height - 48 - 48, 750); + int width = std::min(viewSize.width, getIdealWidth()); + int height = std::min(winMgr->getControllerMenuHeight(), getIdealHeight()); int x = (viewSize.width - width) / 2; int y = (viewSize.height - height) / 2; diff --git a/apps/openmw/mwgui/statswindow.hpp b/apps/openmw/mwgui/statswindow.hpp index 3021873aa8..c1564498c2 100644 --- a/apps/openmw/mwgui/statswindow.hpp +++ b/apps/openmw/mwgui/statswindow.hpp @@ -13,6 +13,10 @@ namespace MWGui public: typedef std::map FactionList; + /// It would be nice to measure these, but for now they're hardcoded. + static int getIdealHeight() { return 750; } + static int getIdealWidth() { return 600; } + StatsWindow(DragAndDrop* drag); /// automatically updates all the data in the stats window, but only if it has changed. diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 0138811691..f7093e5d44 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -2621,6 +2621,16 @@ namespace MWGui return res; } + int WindowManager::getControllerMenuHeight() + { + int height = MyGUI::RenderManager::getInstance().getViewSize().height; + if (mControllerButtonsOverlay != nullptr && mControllerButtonsOverlay->isVisible()) + height -= mControllerButtonsOverlay->getHeight(); + if (mInventoryTabsOverlay != nullptr && mInventoryTabsOverlay->isVisible()) + height -= mInventoryTabsOverlay->getHeight(); + return height; + } + void WindowManager::setControllerTooltip(bool enabled) { if (!Settings::gui().mControllerMenus) diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 8593a8119e..c45966ceff 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -394,6 +394,7 @@ namespace MWGui void asyncPrepareSaveMap() override; WindowBase* getActiveControllerWindow() override; + int getControllerMenuHeight() override; void cycleActiveControllerWindow(bool next) override; void setActiveControllerWindow(GuiMode mode, int activeIndex) override; bool getControllerTooltip() const override { return mControllerTooltip; }