Allow pinning map window in controller mode

This commit is contained in:
Andrew Lanzone 2025-05-25 16:12:19 -07:00
parent 45de167b6b
commit d6ed416402
5 changed files with 83 additions and 46 deletions

View File

@ -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;

View File

@ -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::Window>();
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<MyGUI::Window>();
window->setCoord(x, active ? y : viewSize.height + 1, width, height);
MyGUI::Window* window = mMainWidget->castType<MyGUI::Window>();
window->setCoord(x, active ? y : viewSize.height + 1, width, height);
}
WindowBase::setActiveControllerWindow(active);
}

View File

@ -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<MyGUI::Window>();
window->setCoord(x, active ? y : viewSize.height + 1, width, height);
MyGUI::Window* window = mMainWidget->castType<MyGUI::Window>();
window->setCoord(x, active ? y : viewSize.height + 1, width, height);
}
if (active)
mSpellView->update();

View File

@ -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<MyGUI::Window>();
window->setCoord(x, active ? y : viewSize.height + 1, width, height);
MyGUI::Window* window = mMainWidget->castType<MyGUI::Window>();
window->setCoord(x, active ? y : viewSize.height + 1, width, height);
if (active)
onWindowResize(window);
if (active)
onWindowResize(window);
}
WindowBase::setActiveControllerWindow(active);
}

View File

@ -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)