From d6ed4164028e1caec48625001d52a8045d1be930 Mon Sep 17 00:00:00 2001 From: Andrew Lanzone Date: Sun, 25 May 2025 16:12:19 -0700 Subject: [PATCH] Allow pinning map window in controller mode --- apps/openmw/mwgui/inventorywindow.cpp | 2 +- apps/openmw/mwgui/mapwindow.cpp | 36 +++++++++++++++------ apps/openmw/mwgui/spellwindow.cpp | 22 +++++++------ apps/openmw/mwgui/statswindow.cpp | 26 +++++++++------- apps/openmw/mwgui/windowmanagerimp.cpp | 43 +++++++++++++++++--------- 5 files changed, 83 insertions(+), 46 deletions(-) diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index 5258c12db5..7f314fed14 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -216,7 +216,7 @@ namespace MWGui { mGuiMode = mode; const WindowSettingValues settings = getModeSettings(mGuiMode); - setPinButtonVisible(mode == GM_Inventory); + setPinButtonVisible(mode == GM_Inventory && !Settings::gui().mControllerMenus); const WindowRectSettingValues& rect = settings.mIsMaximized ? settings.mMaximized : settings.mRegular; diff --git a/apps/openmw/mwgui/mapwindow.cpp b/apps/openmw/mwgui/mapwindow.cpp index f8063657b8..f90180fb44 100644 --- a/apps/openmw/mwgui/mapwindow.cpp +++ b/apps/openmw/mwgui/mapwindow.cpp @@ -1029,7 +1029,20 @@ namespace MWGui void MapWindow::setVisible(bool visible) { WindowBase::setVisible(visible); - mButton->setVisible(visible && MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_None); + MWGui::GuiMode mode = MWBase::Environment::get().getWindowManager()->getMode(); + mButton->setVisible(visible && mode != MWGui::GM_None); + + if (Settings::gui().mControllerMenus && mode == MWGui::GM_None && pinned() && visible) + { + // Restore the window to pinned size. + MyGUI::Window* window = mMainWidget->castType(); + MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize(); + const float x = Settings::windows().mMapX * viewSize.width; + const float y = Settings::windows().mMapY * viewSize.height; + const float w = Settings::windows().mMapW * viewSize.width; + const float h = Settings::windows().mMapH * viewSize.height; + window->setCoord(x, y, w, h); + } } void MapWindow::renderGlobalMap() @@ -1436,16 +1449,19 @@ namespace MWGui void MapWindow::setActiveControllerWindow(bool active) { - // 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 x = (viewSize.width - width) / 2; - int y = (viewSize.height - height) / 2; + if (MWBase::Environment::get().getWindowManager()->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 x = (viewSize.width - width) / 2; + int y = (viewSize.height - height) / 2; - MyGUI::Window* window = mMainWidget->castType(); - window->setCoord(x, active ? y : viewSize.height + 1, width, height); + MyGUI::Window* window = mMainWidget->castType(); + window->setCoord(x, active ? y : viewSize.height + 1, width, height); + } WindowBase::setActiveControllerWindow(active); } diff --git a/apps/openmw/mwgui/spellwindow.cpp b/apps/openmw/mwgui/spellwindow.cpp index e218b9beed..3eb041f6ab 100644 --- a/apps/openmw/mwgui/spellwindow.cpp +++ b/apps/openmw/mwgui/spellwindow.cpp @@ -60,6 +60,7 @@ namespace MWGui if (Settings::gui().mControllerMenus) { + setPinButtonVisible(false); mControllerButtons.a = "#{sSelect}"; mControllerButtons.b = "#{sBack}"; mControllerButtons.r3 = "#{sInfo}"; @@ -281,16 +282,19 @@ namespace MWGui void SpellWindow::setActiveControllerWindow(bool active) { - // 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 x = (viewSize.width - width) / 2; - int y = (viewSize.height - height) / 2; + if (MWBase::Environment::get().getWindowManager()->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 x = (viewSize.width - width) / 2; + int y = (viewSize.height - height) / 2; - MyGUI::Window* window = mMainWidget->castType(); - window->setCoord(x, active ? y : viewSize.height + 1, width, height); + MyGUI::Window* window = mMainWidget->castType(); + window->setCoord(x, active ? y : viewSize.height + 1, width, height); + } if (active) mSpellView->update(); diff --git a/apps/openmw/mwgui/statswindow.cpp b/apps/openmw/mwgui/statswindow.cpp index 1d0af185d4..e71b35e364 100644 --- a/apps/openmw/mwgui/statswindow.cpp +++ b/apps/openmw/mwgui/statswindow.cpp @@ -83,6 +83,7 @@ namespace MWGui if (Settings::gui().mControllerMenus) { + setPinButtonVisible(false); mControllerButtons.lStick = "#{sInfo}"; mControllerButtons.rStick = "#{sScrolldown}"; mControllerButtons.b = "#{sBack}"; @@ -742,19 +743,22 @@ namespace MWGui void StatsWindow::setActiveControllerWindow(bool active) { - // 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 x = (viewSize.width - width) / 2; - int y = (viewSize.height - height) / 2; + if (MWBase::Environment::get().getWindowManager()->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 x = (viewSize.width - width) / 2; + int y = (viewSize.height - height) / 2; - MyGUI::Window* window = mMainWidget->castType(); - window->setCoord(x, active ? y : viewSize.height + 1, width, height); + MyGUI::Window* window = mMainWidget->castType(); + window->setCoord(x, active ? y : viewSize.height + 1, width, height); - if (active) - onWindowResize(window); + if (active) + onWindowResize(window); + } WindowBase::setActiveControllerWindow(active); } diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 96b4303bbb..77224790dd 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -1901,6 +1901,11 @@ namespace MWGui void WindowManager::onWindowChangeCoord(MyGUI::Window* window) { + // If using controller menus, don't persist changes to size of the stats or magic + // windows. + if (Settings::gui().mControllerMenus && (window == (MyGUI::Window*)mStatsWindow || window == (MyGUI::Window*)mSpellWindow)) + return; + const auto it = mTrackedWindows.find(window); if (it == mTrackedWindows.end()) return; @@ -2147,23 +2152,31 @@ namespace MWGui void WindowManager::updatePinnedWindows() { - mInventoryWindow->setPinned(Settings::windows().mInventoryPin); - mMap->setPinned(Settings::windows().mMapPin); - mSpellWindow->setPinned(Settings::windows().mSpellsPin); - mStatsWindow->setPinned(Settings::windows().mStatsPin); - - // Hide hidden inventory windows, but not in controller mode. - if (!Settings::gui().mControllerMenus) + if (Settings::gui().mControllerMenus) { - if (Settings::windows().mInventoryHidden) - mShown = (GuiWindow)(mShown ^ GW_Inventory); - if (Settings::windows().mMapHidden) - mShown = (GuiWindow)(mShown ^ GW_Map); - if (Settings::windows().mSpellsHidden) - mShown = (GuiWindow)(mShown ^ GW_Magic); - if (Settings::windows().mStatsHidden) - mShown = (GuiWindow)(mShown ^ GW_Stats); + // In controller mode, don't hide any menus and only allow pinning the map. + mInventoryWindow->setPinned(false); + mMap->setPinned(Settings::windows().mMapPin); + mSpellWindow->setPinned(false); + mStatsWindow->setPinned(false); + return; } + + mInventoryWindow->setPinned(Settings::windows().mInventoryPin); + if (Settings::windows().mInventoryHidden) + mShown = (GuiWindow)(mShown ^ GW_Inventory); + + mMap->setPinned(Settings::windows().mMapPin); + if (Settings::windows().mMapHidden) + mShown = (GuiWindow)(mShown ^ GW_Map); + + mSpellWindow->setPinned(Settings::windows().mSpellsPin); + if (Settings::windows().mSpellsHidden) + mShown = (GuiWindow)(mShown ^ GW_Magic); + + mStatsWindow->setPinned(Settings::windows().mStatsPin); + if (Settings::windows().mStatsHidden) + mShown = (GuiWindow)(mShown ^ GW_Stats); } void WindowManager::pinWindow(GuiWindow window)