diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index f103ce191..6a159ea7d 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -104,6 +104,7 @@ namespace MWBase * new dialogs. */ virtual void update() = 0; + virtual void updateVisible() = 0; /// @note This method will block until the video finishes playing /// (and will continually update the window while doing so) diff --git a/apps/openmw/mwgui/mapwindow.cpp b/apps/openmw/mwgui/mapwindow.cpp index 3d342db44..4d4efeecb 100644 --- a/apps/openmw/mwgui/mapwindow.cpp +++ b/apps/openmw/mwgui/mapwindow.cpp @@ -780,7 +780,7 @@ namespace MWGui void MapWindow::setVisible(bool visible) { WindowBase::setVisible(visible); - mButton->setVisible(visible && MWBase::Environment::get().getWindowManager()->isGuiMode()); + mButton->setVisible(visible && MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_None); } void MapWindow::renderGlobalMap() diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 38aa142c4..119c9f551 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -368,6 +368,8 @@ namespace MWGui mPlayerSkillValues.insert(std::make_pair(ESM::Skill::sSkillIds[i], MWMechanics::SkillValue())); } + updatePinnedWindows(); + // Set up visibility updateVisible(); @@ -400,11 +402,6 @@ namespace MWGui allow(GW_ALL); mRestAllowed = !newgame; - - mStatsWindow->setPinned(Settings::Manager::getBool("stats pin", "Windows")); - mMap->setPinned(Settings::Manager::getBool("map pin", "Windows")); - mSpellWindow->setPinned(Settings::Manager::getBool("spells pin", "Windows")); - mInventoryWindow->setPinned(Settings::Manager::getBool("inventory pin", "Windows")); } WindowManager::~WindowManager() @@ -492,7 +489,6 @@ namespace MWGui void WindowManager::update() { cleanupGarbage(); - mHud->update(); } @@ -560,6 +556,12 @@ namespace MWGui { mInventoryWindow->setGuiMode(GM_None); + // If game is not running, we can't be sure that widgets are initialized properly + MWBase::StateManager::State state = MWBase::Environment::get().getStateManager()->getState(); + + if (state != MWBase::StateManager::State_Running) + return; + mMap->setVisible(mMap->pinned() && !(mForceHidden & GW_Map) && (mAllowed & GW_Map)); mStatsWindow->setVisible(mStatsWindow->pinned() && !(mForceHidden & GW_Stats) && (mAllowed & GW_Stats)); mInventoryWindow->setVisible(mInventoryWindow->pinned() && !(mForceHidden & GW_Inventory) && (mAllowed & GW_Inventory)); @@ -1709,6 +1711,8 @@ namespace MWGui mCompanionWindow->resetReference(); mConsole->resetReference(); + mInventoryWindow->rebuildAvatar(); + mSelectedSpell.clear(); mCustomMarkers.clear(); @@ -1868,6 +1872,17 @@ namespace MWGui mVideoWidget->stop(); } + void WindowManager::updatePinnedWindows() + { + mInventoryWindow->setPinned(Settings::Manager::getBool("inventory pin", "Windows")); + + mMap->setPinned(Settings::Manager::getBool("map pin", "Windows")); + + mSpellWindow->setPinned(Settings::Manager::getBool("spells pin", "Windows")); + + mStatsWindow->setPinned(Settings::Manager::getBool("stats pin", "Windows")); + } + void WindowManager::pinWindow(GuiWindow window) { switch (window) diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index a8f6263c2..40ebe8bbd 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -362,6 +362,8 @@ namespace MWGui virtual void pinWindow (MWGui::GuiWindow window); + virtual void updatePinnedWindows (); + /// Fade the screen in, over \a time seconds virtual void fadeScreenIn(const float time, bool clearQueue); /// Fade the screen out to black, over \a time seconds diff --git a/apps/openmw/mwstate/statemanagerimp.cpp b/apps/openmw/mwstate/statemanagerimp.cpp index 64c543fb1..067cf481f 100644 --- a/apps/openmw/mwstate/statemanagerimp.cpp +++ b/apps/openmw/mwstate/statemanagerimp.cpp @@ -139,8 +139,7 @@ void MWState::StateManager::newGame (bool bypass) { cleanup(); - if (!bypass) - MWBase::Environment::get().getWindowManager()->setNewGame (true); + MWBase::Environment::get().getWindowManager()->setNewGame (!bypass); try { @@ -149,6 +148,8 @@ void MWState::StateManager::newGame (bool bypass) MWBase::Environment::get().getWorld()->startNewGame (bypass); mState = State_Running; + + MWBase::Environment::get().getWindowManager()->updateVisible(); } catch (std::exception& e) {