From 6ba53354009fa0b3be53ce5d0777ddd3b19cb748 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sat, 20 Mar 2004 03:02:12 +0000 Subject: [PATCH] search for fallback in the current theme before searching in the base theme --- stepmania/src/ThemeManager.cpp | 76 ++++++++++++++++++++-------------- stepmania/src/ThemeManager.h | 3 +- 2 files changed, 46 insertions(+), 33 deletions(-) diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 49c194c655..ebf65aee35 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -78,7 +78,8 @@ CString ClassAndElementToFileName( const CString &sClassName, const CString &sEl ThemeManager::ThemeManager() { - m_pIniMetrics = new IniFile; + m_pIniCurMetrics = new IniFile; + m_pIniBaseMetrics = new IniFile; m_sCurThemeName = BASE_THEME_NAME; // Use the base theme for now. It's up to PrefsManager to change this. m_uHashForCurThemeMetrics = 0; @@ -94,7 +95,8 @@ ThemeManager::ThemeManager() ThemeManager::~ThemeManager() { - delete m_pIniMetrics; + delete m_pIniCurMetrics; + delete m_pIniBaseMetrics; } void ThemeManager::GetThemeNames( CStringArray& AddTo ) @@ -174,25 +176,26 @@ void ThemeManager::SwitchThemeAndLanguage( CString sThemeName, CString sLanguage m_uHashForCurThemeCurLanguage = GetHashForFile( GetLanguageIniPath(m_sCurThemeName,m_sCurLanguage) ); // read new metrics. First read base metrics, then read cur theme's metrics, overriding base theme - m_pIniMetrics->Reset(); - m_pIniMetrics->SetPath( GetMetricsIniPath(FALLBACK_THEME_NAME) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetMetricsIniPath(BASE_THEME_NAME) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetMetricsIniPath(m_sCurThemeName) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetLanguageIniPath(FALLBACK_THEME_NAME,BASE_LANGUAGE) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetLanguageIniPath(BASE_THEME_NAME,BASE_LANGUAGE) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetLanguageIniPath(m_sCurThemeName,BASE_LANGUAGE) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetLanguageIniPath(FALLBACK_THEME_NAME,m_sCurLanguage) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetLanguageIniPath(BASE_THEME_NAME,m_sCurLanguage) ); - m_pIniMetrics->ReadFile(); - m_pIniMetrics->SetPath( GetLanguageIniPath(m_sCurThemeName,m_sCurLanguage) ); - m_pIniMetrics->ReadFile(); + m_pIniCurMetrics->Reset(); + m_pIniBaseMetrics->Reset(); + m_pIniBaseMetrics->SetPath( GetMetricsIniPath(FALLBACK_THEME_NAME) ); + m_pIniBaseMetrics->ReadFile(); + m_pIniBaseMetrics->SetPath( GetMetricsIniPath(BASE_THEME_NAME) ); + m_pIniBaseMetrics->ReadFile(); + m_pIniCurMetrics->SetPath( GetMetricsIniPath(m_sCurThemeName) ); + m_pIniCurMetrics->ReadFile(); + m_pIniBaseMetrics->SetPath( GetLanguageIniPath(FALLBACK_THEME_NAME,BASE_LANGUAGE) ); + m_pIniBaseMetrics->ReadFile(); + m_pIniBaseMetrics->SetPath( GetLanguageIniPath(BASE_THEME_NAME,BASE_LANGUAGE) ); + m_pIniBaseMetrics->ReadFile(); + m_pIniCurMetrics->SetPath( GetLanguageIniPath(m_sCurThemeName,BASE_LANGUAGE) ); + m_pIniCurMetrics->ReadFile(); + m_pIniBaseMetrics->SetPath( GetLanguageIniPath(FALLBACK_THEME_NAME,m_sCurLanguage) ); + m_pIniBaseMetrics->ReadFile(); + m_pIniBaseMetrics->SetPath( GetLanguageIniPath(BASE_THEME_NAME,m_sCurLanguage) ); + m_pIniBaseMetrics->ReadFile(); + m_pIniCurMetrics->SetPath( GetLanguageIniPath(m_sCurThemeName,m_sCurLanguage) ); + m_pIniCurMetrics->ReadFile(); LOG->MapLog("theme", "Theme: %s", sThemeName.c_str()); LOG->MapLog("language", "Language: %s", sLanguage.c_str()); @@ -215,7 +218,8 @@ CString ThemeManager::GetPathToAndFallback( CString sThemeName, ElementCategory // search fallback name (if any) CString sFallback; - if( !m_pIniMetrics->GetValue(sClassName,"Fallback",sFallback) ) + GetMetricRaw( sClassName, "Fallback", sFallback ); + if( sFallback.empty() ) return ""; sClassName = sFallback; } @@ -491,19 +495,27 @@ void ThemeManager::ReloadMetrics() bool ThemeManager::GetMetricRaw( CString sClassName, CString sValueName, CString &ret ) { - int n = 100; - while( n-- ) - { - if( m_pIniMetrics->GetValue(sClassName,sValueName,ret) ) - return true; + CString sFallback; - CString sFallback; - if( !m_pIniMetrics->GetValue(sClassName,"Fallback",sFallback) ) - return false; - sClassName = sFallback; + // TODO: Add recursion checking + + if( m_pIniCurMetrics->GetValue(sClassName,sValueName,ret) ) + return true; + if( m_pIniCurMetrics->GetValue(sClassName,"Fallback",sFallback) ) + { + if( GetMetricRaw(sFallback,sValueName,ret) ) + return true; } - RageException::Throw("Infinite recursion looking up theme metric from class \"%s\"", sClassName.c_str() ); + if( m_pIniBaseMetrics->GetValue(sClassName,sValueName,ret) ) + return true; + if( m_pIniBaseMetrics->GetValue(sClassName,"Fallback",sFallback) ) + { + if( GetMetricRaw(sFallback,sValueName,ret) ) + return true; + } + + return false; } CString ThemeManager::GetMetricRaw( CString sClassName, CString sValueName ) diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index cc2e8f4e05..f2c6f96884 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -78,7 +78,8 @@ protected: CString m_sCurThemeName; CString m_sCurLanguage; - IniFile* m_pIniMetrics; // make this a pointer so we don't have to include IniFile here + 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 unsigned m_uHashForCurThemeMetrics; unsigned m_uHashForBaseThemeMetrics; unsigned m_uHashForCurThemeCurLanguage;