From 102f39d7c5ab1f3a05537ef398fc902de7b65f65 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Fri, 28 Oct 2005 19:07:19 +0000 Subject: [PATCH] simplify: ThemeManager::LoadThemeRecursive recurses themes, but there's no reason for it to actually be a recursive function --- stepmania/src/ThemeManager.cpp | 67 +++++++++++++++++----------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 5112f4eced..bf68b4f708 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -169,44 +169,43 @@ bool ThemeManager::DoesLanguageExist( const CString &sLanguage ) return false; } -void ThemeManager::LoadThemeRecursive( deque &theme, const CString &sThemeName ) +void ThemeManager::LoadThemeRecursive( deque &theme, const CString &sThemeName_ ) { - static int depth = 0; - static bool loaded_base = false; - depth++; - ASSERT_M( depth < 20, "Circular theme fallback references detected." ); + CString sThemeName(sThemeName_); - Theme t; - t.iniMetrics = new IniFile; - t.sThemeName = sThemeName; - t.iniMetrics->ReadFile( GetMetricsIniPath(sThemeName) ); - t.iniMetrics->ReadFile( GetLanguageIniPath(sThemeName,BASE_LANGUAGE) ); - if( m_sCurLanguage.CompareNoCase(BASE_LANGUAGE) ) - t.iniMetrics->ReadFile( GetLanguageIniPath(sThemeName,m_sCurLanguage) ); - - bool bIsBaseTheme = !sThemeName.CompareNoCase(BASE_THEME_NAME); - t.iniMetrics->GetValue( "Global", "IsBaseTheme", bIsBaseTheme ); - if( bIsBaseTheme ) - loaded_base = true; - - /* Read the fallback theme. If no fallback theme is specified, and we havn't - * already loaded it, fall back on BASE_THEME_NAME. That way, default theme - * fallbacks can be disabled with "FallbackTheme=". */ - CString sFallback; - if( !t.iniMetrics->GetValue("Global","FallbackTheme",sFallback) ) + bool bLoadedBase = false; + while(1) { - if( sThemeName.CompareNoCase( BASE_THEME_NAME ) && !loaded_base ) - sFallback = BASE_THEME_NAME; + ASSERT_M( theme.size() < 20, "Circular theme fallback references detected." ); + + g_vThemes.push_back( Theme() ); + Theme &t = g_vThemes.back(); + t.iniMetrics = new IniFile; + t.sThemeName = sThemeName; + t.iniMetrics->ReadFile( GetMetricsIniPath(sThemeName) ); + t.iniMetrics->ReadFile( GetLanguageIniPath(sThemeName,BASE_LANGUAGE) ); + if( m_sCurLanguage.CompareNoCase(BASE_LANGUAGE) ) + t.iniMetrics->ReadFile( GetLanguageIniPath(sThemeName,m_sCurLanguage) ); + + bool bIsBaseTheme = !sThemeName.CompareNoCase(BASE_THEME_NAME); + t.iniMetrics->GetValue( "Global", "IsBaseTheme", bIsBaseTheme ); + if( bIsBaseTheme ) + bLoadedBase = true; + + /* Read the fallback theme. If no fallback theme is specified, and we havn't + * already loaded it, fall back on BASE_THEME_NAME. That way, default theme + * fallbacks can be disabled with "FallbackTheme=". */ + CString sFallback; + if( !t.iniMetrics->GetValue("Global","FallbackTheme",sFallback) ) + { + if( sThemeName.CompareNoCase( BASE_THEME_NAME ) && !bLoadedBase ) + sFallback = BASE_THEME_NAME; + } + + if( sFallback.empty() ) + return; + sThemeName = sFallback; } - if( !sFallback.empty() ) - LoadThemeRecursive( theme, sFallback ); - - g_vThemes.push_front( t ); - - if( bIsBaseTheme ) - loaded_base = false; - - depth--; } CString ThemeManager::GetDefaultLanguage()