From 512f97a63b1f59daf0c8f060f3f703fddba74250 Mon Sep 17 00:00:00 2001 From: auria Date: Tue, 13 Oct 2009 23:43:19 +0000 Subject: [PATCH] Fixed resolution switch git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@4116 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- src/guiengine/abstract_state_manager.cpp | 6 ++++- src/guiengine/engine.cpp | 9 +++++--- src/guiengine/screen.cpp | 6 +++++ src/guiengine/screen.hpp | 29 +++++++++++++++++++++--- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/guiengine/abstract_state_manager.cpp b/src/guiengine/abstract_state_manager.cpp index acd59a72e..557087079 100644 --- a/src/guiengine/abstract_state_manager.cpp +++ b/src/guiengine/abstract_state_manager.cpp @@ -123,7 +123,11 @@ void AbstractStateManager::reshowTopMostMenu() assert(m_game_mode != GAME); // Send tear-down event to previous menu - if (m_menu_stack.size() > 0) getCurrentScreen()->tearDown(); + if (m_menu_stack.size() > 0) + { + Screen* currScreen = getCurrentScreen(); + if (currScreen != NULL) getCurrentScreen()->tearDown(); + } switchToScreen( m_menu_stack[m_menu_stack.size()-1].c_str() ); diff --git a/src/guiengine/engine.cpp b/src/guiengine/engine.cpp index aa2d5db52..9683f1845 100644 --- a/src/guiengine/engine.cpp +++ b/src/guiengine/engine.cpp @@ -50,7 +50,7 @@ namespace GUIEngine using namespace Private; ptr_vector needsUpdate; - ptr_vector g_loaded_screens; + ptr_vector g_loaded_screens; float dt = 0; @@ -122,9 +122,12 @@ void reshowCurrentScreen() // ----------------------------------------------------------------------------- void cleanUp() { - if(g_skin != NULL) delete g_skin; + if (g_skin != NULL) delete g_skin; g_skin = NULL; - g_loaded_screens.clearAndDeleteAll(); + for (int i=0; i class ScreenSingleton { - public: - - static SCREEN* getInstance() + // Weird code to work around C++ (making it easy to use) + // Used to create, get and delete singleton instance + static SCREEN* singletonOperate(bool deleteInstance=false) { static SCREEN* singleton = NULL; + if (deleteInstance && singleton != NULL) + { + singleton = NULL; + return NULL; + } + if (singleton == NULL) { singleton = new SCREEN(); @@ -49,6 +55,19 @@ namespace GUIEngine return singleton; } + + public: + + ~ScreenSingleton() + { + singletonOperate(true); + } + + static SCREEN* getInstance() + { + return singletonOperate(); + } + }; void parseScreenFileDiv(irr::io::IrrXMLReader* xml, ptr_vector& append_to); @@ -84,6 +103,10 @@ namespace GUIEngine */ bool m_inited; + /** Next time this menu needs to be shown, don't use cached values, re-calculate everything. + (useful e.g. on reschange, when sizes have changed and must be re-calculated) */ + void forgetWhatWasLoaded(); + Screen(); /**< creates a dummy incomplete object; only use to override behaviour in sub-class */ Screen(const char* filename); virtual ~Screen(){}