From 338ab88e4f5a953aa383ce820c760cae056e43bf Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Thu, 16 Sep 2004 22:45:55 +0000 Subject: [PATCH] fix ScreenManager stuff not being reloaded on theme change and F2 --- stepmania/src/ScreenManager.cpp | 18 ++++++++++++++++- stepmania/src/ThemeManager.cpp | 34 ++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index 1958b8b696..860359a3ba 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -341,7 +341,14 @@ void ScreenSystemLayer::Update( float fDeltaTime ) ScreenManager::ScreenManager() { - m_SystemLayer = new ScreenSystemLayer; + m_SystemLayer = NULL; + + /* By the time this is constructed, THEME has already been set up and set to + * the current theme. Call ThemeChanged(), to handle the starting theme + * and set up m_SystemLayer. */ + ASSERT( THEME ); + ASSERT( !THEME->GetCurThemeName().empty() ); + this->ThemeChanged(); m_ScreenBuffered = NULL; @@ -362,14 +369,23 @@ ScreenManager::~ScreenManager() delete m_SystemLayer; } +/* This is called when we start up, and when the theme changes or is reloaded. */ void ScreenManager::ThemeChanged() { + LOG->Trace( "ScreenManager::ThemeChanged" ); + // reload common sounds m_soundStart.Load( THEME->GetPathS("Common","start") ); m_soundCoin.Load( THEME->GetPathS("Common","coin") ); m_soundInvalid.Load( THEME->GetPathS("Common","invalid") ); m_soundScreenshot.Load( THEME->GetPathS("Common","screenshot") ); m_soundBack.Load( THEME->GetPathS("Common","back") ); + + // reload system layer + delete m_SystemLayer; + m_SystemLayer = NULL; // new ScreenSystemLayer may throw + m_SystemLayer = new ScreenSystemLayer; + m_SystemLayer->RefreshCreditsMessages(); } void ScreenManager::EmptyDeleteQueue() diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index eef392d3b2..16a548fc24 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -75,7 +75,7 @@ CString ClassAndElementToFileName( const CString &sClassName, const CString &sEl ThemeManager::ThemeManager() { - m_sCurThemeName = BASE_THEME_NAME; // Use the base theme for now. It's up to PrefsManager to change this. + m_sCurThemeName = ""; // Use the base theme for now. It's up to PrefsManager to change this. CStringArray arrayThemeNames; GetThemeNames( arrayThemeNames ); @@ -178,14 +178,17 @@ void ThemeManager::LoadThemeRecursive( deque &theme, CString sThemeName ) void ThemeManager::SwitchThemeAndLanguage( CString sThemeName, CString sLanguage ) { if( !DoesThemeExist(sThemeName) ) - m_sCurThemeName = BASE_THEME_NAME; - else - m_sCurThemeName = sThemeName; - + sThemeName = BASE_THEME_NAME; if( !DoesLanguageExist(sLanguage) ) - m_sCurLanguage = BASE_LANGUAGE; - else - m_sCurLanguage = sLanguage; + sLanguage = BASE_LANGUAGE; + LOG->Trace("ThemeManager::SwitchThemeAndLanguage: \"%s\", \"%s\"", + sThemeName.c_str(), m_sCurThemeName.c_str() ); + + if( sThemeName == m_sCurThemeName && sLanguage == m_sCurLanguage ) + return; + + m_sCurThemeName = sThemeName; + m_sCurLanguage = sLanguage; // clear theme path cache int i; @@ -197,10 +200,6 @@ void ThemeManager::SwitchThemeAndLanguage( CString sThemeName, CString sLanguage // load current theme LoadThemeRecursive( g_vThemes, m_sCurThemeName ); - // reload common sounds - if ( SCREENMAN != NULL ) - SCREENMAN->ThemeChanged(); - CString sMetric; for( i = 0; GetCommandlineArgument( "metric", &sMetric, i ); ++i ) { @@ -217,6 +216,10 @@ void ThemeManager::SwitchThemeAndLanguage( CString sThemeName, CString sLanguage LOG->MapLog("theme", "Theme: %s", sThemeName.c_str()); LOG->MapLog("language", "Language: %s", sLanguage.c_str()); + + // reload common sounds + if ( SCREENMAN != NULL ) + SCREENMAN->ThemeChanged(); } CString ThemeManager::GetThemeDirFromName( const CString &sThemeName ) @@ -484,7 +487,12 @@ bool ThemeManager::HasMetric( CString sClassName, CString sValueName ) void ThemeManager::ReloadMetrics() { - SwitchThemeAndLanguage(m_sCurThemeName, m_sCurLanguage); // force a reload of the metrics cache + // force a reload of the metrics cache + const CString sThemeName = m_sCurThemeName, sCurLanguage = m_sCurLanguage; + m_sCurThemeName = ""; + m_sCurLanguage = ""; + + SwitchThemeAndLanguage( sThemeName, sCurLanguage ); if( SCREENMAN ) SCREENMAN->SystemMessage( "Reloaded metrics" );