diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 91699789d4..86fc25e47c 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -70,6 +70,7 @@ ThemeManager::ThemeManager() { m_pIniCurMetrics = new IniFile; m_pIniBaseMetrics = new IniFile; + m_pIniFallbackMetrics = new IniFile; m_sCurThemeName = BASE_THEME_NAME; // Use the base theme for now. It's up to PrefsManager to change this. @@ -154,13 +155,15 @@ void ThemeManager::SwitchThemeAndLanguage( CString sThemeName, CString sLanguage // read new metrics. First read base metrics, then read cur theme's metrics, overriding base theme m_pIniBaseMetrics->Reset(); - m_pIniBaseMetrics->ReadFile( GetMetricsIniPath(FALLBACK_THEME_NAME) ); m_pIniBaseMetrics->ReadFile( GetMetricsIniPath(BASE_THEME_NAME) ); - m_pIniBaseMetrics->ReadFile( GetLanguageIniPath(FALLBACK_THEME_NAME,BASE_LANGUAGE) ); m_pIniBaseMetrics->ReadFile( GetLanguageIniPath(BASE_THEME_NAME,BASE_LANGUAGE) ); - m_pIniBaseMetrics->ReadFile( GetLanguageIniPath(FALLBACK_THEME_NAME,m_sCurLanguage) ); m_pIniBaseMetrics->ReadFile( GetLanguageIniPath(BASE_THEME_NAME,m_sCurLanguage) ); + m_pIniFallbackMetrics->Reset(); + m_pIniFallbackMetrics->ReadFile( GetMetricsIniPath(FALLBACK_THEME_NAME) ); + m_pIniFallbackMetrics->ReadFile( GetLanguageIniPath(FALLBACK_THEME_NAME,BASE_LANGUAGE) ); + m_pIniFallbackMetrics->ReadFile( GetLanguageIniPath(FALLBACK_THEME_NAME,m_sCurLanguage) ); + /* Don't bother loading m_pIniCurMetrics if it'll be the same data as BASE_THEME_NAME. */ m_pIniCurMetrics->Reset(); if( m_sCurThemeName.CompareNoCase(BASE_THEME_NAME) ) @@ -492,6 +495,14 @@ bool ThemeManager::GetMetricRaw( CString sClassName, CString sValueName, CString return true; } + if( m_pIniFallbackMetrics->GetValue(sClassName,sValueName,ret) ) + return true; + if( m_pIniFallbackMetrics->GetValue(sClassName,"Fallback",sFallback) ) + { + if( GetMetricRaw(sFallback,sValueName,ret,level+1) ) + return true; + } + return false; } @@ -622,6 +633,7 @@ void ThemeManager::GetModifierNames( set& AddTo ) { const IniFile::key *cur = m_pIniCurMetrics->GetKey( "OptionNames" ); const IniFile::key *base = m_pIniBaseMetrics->GetKey( "OptionNames" ); + const IniFile::key *fallback = m_pIniFallbackMetrics->GetKey( "OptionNames" ); if( cur ) for( IniFile::key::const_iterator iter = cur->begin(); iter != cur->end(); ++iter ) @@ -630,6 +642,10 @@ void ThemeManager::GetModifierNames( set& AddTo ) if( base ) for( IniFile::key::const_iterator iter = base->begin(); iter != base->end(); ++iter ) AddTo.insert( iter->first ); + + if( fallback ) + for( IniFile::key::const_iterator iter = fallback->begin(); iter != fallback->end(); ++iter ) + AddTo.insert( iter->first ); } /* diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index 405f92b9d6..8262f3b88d 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -72,6 +72,7 @@ protected: IniFile* m_pIniCurMetrics; // make this a pointer so we don't have to include IniFile here IniFile* m_pIniBaseMetrics; // make this a pointer so we don't have to include IniFile here + IniFile* m_pIniFallbackMetrics; // make this a pointer so we don't have to include IniFile here }; extern ThemeManager* THEME; // global and accessable from anywhere in our program