2003-02-16 03:59:37 +00:00
#include "global.h"
2002-01-16 10:01:32 +00:00
/*
-----------------------------------------------------------------------------
2002-05-19 01:59:48 +00:00
Class: ThemeManager
2002-01-16 10:01:32 +00:00
2002-02-28 19:40:40 +00:00
Desc: See header.
2002-01-16 10:01:32 +00:00
2002-05-19 01:59:48 +00:00
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
2002-02-28 19:40:40 +00:00
Chris Danford
2002-01-16 10:01:32 +00:00
-----------------------------------------------------------------------------
*/
#include "ThemeManager.h"
2002-05-01 19:14:55 +00:00
#include "RageLog.h"
2002-07-23 01:41:40 +00:00
#include "PrefsManager.h"
2002-07-27 19:29:51 +00:00
#include "RageException.h"
2002-08-31 10:33:13 +00:00
#include "RageTimer.h"
2002-07-31 19:40:40 +00:00
#include "GameState.h"
#include "GameDef.h"
2002-08-13 23:26:46 +00:00
#include "IniFile.h"
2002-10-28 19:05:05 +00:00
#include "RageTimer.h"
2003-01-10 02:02:51 +00:00
#include "Font.h"
2003-01-18 09:18:30 +00:00
#include "FontCharAliases.h"
2003-03-02 01:43:33 +00:00
#include "RageDisplay.h"
2003-07-11 03:15:28 +00:00
#include "arch/ArchHooks/ArchHooks.h"
2003-07-22 07:47:27 +00:00
#include "arch/arch.h"
#include "RageFile.h"
2003-11-05 04:56:41 +00:00
#include "ScreenManager.h"
2002-01-16 10:01:32 +00:00
ThemeManager * THEME = NULL ; // global object accessable from anywhere in the program
2002-07-23 01:41:40 +00:00
const CString BASE_THEME_NAME = "default" ;
2003-08-19 08:01:15 +00:00
const CString LANGUAGES_SUBDIR = "Languages" SLASH ;
const CString BASE_LANGUAGE = "english" ;
2003-07-22 07:47:27 +00:00
const CString THEMES_DIR = BASE_PATH "Themes" SLASH ;
2003-08-19 08:01:15 +00:00
const CString METRICS_FILE = "metrics.ini" ;
2003-11-06 22:00:23 +00:00
const CString FALLBACK_METRICS_FILE = "fallback.ini" ;
2003-04-12 17:39:27 +00:00
const CString ELEMENT_CATEGORY_STRING [ NUM_ELEMENT_CATEGORIES ] =
{
"BGAnimations" ,
"Fonts" ,
"Graphics" ,
"Numbers" ,
2003-09-11 23:21:33 +00:00
"Sounds" ,
"Other"
2003-04-12 17:39:27 +00:00
};
2002-05-19 01:59:48 +00:00
2003-10-22 07:56:08 +00:00
/* We spend a lot of time doing redundant theme path lookups. Cache results. */
static map < CString , CString > g_ThemePathCache [ NUM_ELEMENT_CATEGORIES ];
2002-03-19 07:09:49 +00:00
ThemeManager :: ThemeManager ()
{
2002-08-13 23:26:46 +00:00
m_pIniMetrics = new IniFile ;
2002-10-28 19:05:05 +00:00
m_sCurThemeName = BASE_THEME_NAME ; // Use the base theme for now. It's up to PrefsManager to change this.
2003-08-19 08:01:15 +00:00
m_uHashForCurThemeMetrics = 0 ;
m_uHashForBaseThemeMetrics = 0 ;
m_uHashForCurThemeCurLanguage = 0 ;
m_uHashForBaseThemeCurLanguage = 0 ;
m_uHashForCurThemeBaseLanguage = 0 ;
m_uHashForBaseThemeBaseLanguage = 0 ;
2003-03-11 19:02:09 +00:00
2002-03-19 07:09:49 +00:00
CStringArray arrayThemeNames ;
2003-04-13 04:50:08 +00:00
GetThemeNames ( arrayThemeNames );
2002-03-19 07:09:49 +00:00
}
2002-08-13 23:26:46 +00:00
ThemeManager ::~ ThemeManager ()
{
delete m_pIniMetrics ;
}
2003-04-13 04:50:08 +00:00
void ThemeManager :: GetThemeNames ( CStringArray & AddTo )
2002-03-19 07:09:49 +00:00
{
2003-07-22 07:47:27 +00:00
GetDirListing ( THEMES_DIR + "*" , AddTo , true );
2002-03-19 07:09:49 +00:00
// strip out the folder called "CVS"
2002-10-31 04:11:08 +00:00
for ( CStringArray :: iterator i = AddTo . begin (); i != AddTo . end (); ++ i )
{
2003-02-06 07:32:57 +00:00
if ( * i == "CVS" ) {
2002-10-31 04:11:08 +00:00
AddTo . erase ( i , i + 1 );
break ;
}
}
2002-07-23 01:41:40 +00:00
}
bool ThemeManager :: DoesThemeExist ( CString sThemeName )
{
CStringArray asThemeNames ;
2003-04-13 04:50:08 +00:00
GetThemeNames ( asThemeNames );
2002-10-31 02:12:14 +00:00
for ( unsigned i = 0 ; i < asThemeNames . size (); i ++ )
2002-07-27 19:29:51 +00:00
{
2003-01-03 05:29:45 +00:00
if ( ! sThemeName . CompareNoCase ( asThemeNames [ i ]) )
2002-07-23 01:41:40 +00:00
return true ;
2002-07-27 19:29:51 +00:00
}
2002-07-23 01:41:40 +00:00
return false ;
}
2003-08-19 08:01:15 +00:00
void ThemeManager :: GetLanguages ( CStringArray & AddTo )
{
AddTo . clear ();
CStringArray asTemp ;
GetLanguagesForTheme ( m_sCurThemeName , AddTo );
GetLanguagesForTheme ( BASE_THEME_NAME , asTemp );
AddTo . insert ( AddTo . begin (), asTemp . begin (), asTemp . end () );
// remove dupes
sort ( AddTo . begin (), AddTo . end () );
CStringArray :: iterator it = unique ( AddTo . begin (), AddTo . end () );
AddTo . erase ( it , AddTo . end ());
}
bool ThemeManager :: DoesLanguageExist ( CString sLanguage )
{
CStringArray asLanguages ;
GetLanguages ( asLanguages );
for ( unsigned i = 0 ; i < asLanguages . size (); i ++ )
if ( sLanguage . CompareNoCase ( asLanguages [ i ]) == 0 )
return true ;
return false ;
}
void ThemeManager :: SwitchThemeAndLanguage ( CString sThemeName , CString sLanguage )
2002-03-19 07:09:49 +00:00
{
2002-09-29 17:38:07 +00:00
if ( ! DoesThemeExist ( sThemeName ) )
2002-07-23 01:41:40 +00:00
m_sCurThemeName = BASE_THEME_NAME ;
else
m_sCurThemeName = sThemeName ;
2002-08-13 23:26:46 +00:00
2003-08-19 08:01:15 +00:00
if ( ! DoesLanguageExist ( sLanguage ) )
m_sCurLanguage = BASE_LANGUAGE ;
else
m_sCurLanguage = sLanguage ;
2002-08-13 23:26:46 +00:00
// update hashes for metrics files
2003-08-19 08:01:15 +00:00
m_uHashForCurThemeMetrics = GetHashForFile ( GetMetricsIniPath ( m_sCurThemeName ) );
m_uHashForBaseThemeMetrics = GetHashForFile ( GetMetricsIniPath ( BASE_THEME_NAME ) );
m_uHashForBaseThemeBaseLanguage = GetHashForFile ( GetLanguageIniPath ( BASE_THEME_NAME , BASE_LANGUAGE ) );
m_uHashForCurThemeBaseLanguage = GetHashForFile ( GetLanguageIniPath ( m_sCurThemeName , BASE_LANGUAGE ) );
m_uHashForBaseThemeCurLanguage = GetHashForFile ( GetLanguageIniPath ( BASE_THEME_NAME , m_sCurLanguage ) );
m_uHashForCurThemeCurLanguage = GetHashForFile ( GetLanguageIniPath ( m_sCurThemeName , m_sCurLanguage ) );
2002-08-13 23:26:46 +00:00
// read new metrics. First read base metrics, then read cur theme's metrics, overriding base theme
m_pIniMetrics -> Reset ();
2003-11-06 22:00:23 +00:00
m_pIniMetrics -> SetPath ( GetThemeDirFromName ( BASE_THEME_NAME ) + FALLBACK_METRICS_FILE );
m_pIniMetrics -> ReadFile ();
2003-08-19 08:01:15 +00:00
m_pIniMetrics -> SetPath ( GetMetricsIniPath ( BASE_THEME_NAME ) );
2002-08-13 23:26:46 +00:00
m_pIniMetrics -> ReadFile ();
2003-08-19 08:01:15 +00:00
m_pIniMetrics -> SetPath ( GetMetricsIniPath ( m_sCurThemeName ) );
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 ( BASE_THEME_NAME , m_sCurLanguage ) );
m_pIniMetrics -> ReadFile ();
m_pIniMetrics -> SetPath ( GetLanguageIniPath ( m_sCurThemeName , m_sCurLanguage ) );
2002-08-13 23:26:46 +00:00
m_pIniMetrics -> ReadFile ();
2003-04-22 04:11:04 +00:00
2003-04-22 05:21:45 +00:00
LOG -> MapLog ( "theme" , "Theme: %s" , sThemeName . c_str ());
2003-08-19 08:01:15 +00:00
LOG -> MapLog ( "language" , "Language: %s" , sLanguage . c_str ());
2002-03-19 07:09:49 +00:00
}
2003-01-23 04:41:57 +00:00
CString ThemeManager :: GetThemeDirFromName ( const CString & sThemeName )
2002-03-19 07:09:49 +00:00
{
2003-07-22 07:47:27 +00:00
return THEMES_DIR + sThemeName + SLASH ;
2002-02-09 04:30:27 +00:00
}
2003-04-12 17:39:27 +00:00
CString ThemeManager :: GetPathTo ( CString sThemeName , ElementCategory category , CString sFileName )
2002-08-13 23:26:46 +00:00
{
2003-02-22 21:47:42 +00:00
try_element_again :
2002-08-13 23:26:46 +00:00
sFileName . MakeLower ();
2003-01-26 21:45:13 +00:00
const CString sThemeDir = GetThemeDirFromName ( sThemeName );
2003-04-12 17:39:27 +00:00
const CString sCategory = ELEMENT_CATEGORY_STRING [ category ];
2002-08-13 23:26:46 +00:00
2003-03-15 00:16:45 +00:00
CStringArray asElementPaths ;
2002-08-13 23:26:46 +00:00
2003-04-12 17:39:27 +00:00
// If sFileName already has an extension, we're looking for a specific file
bool bLookingForSpecificFile = sFileName . find_last_of ( '.' ) != sFileName . npos ;
bool bDirsOnly = category == BGAnimations ;
2002-05-19 06:13:16 +00:00
2003-04-12 17:39:27 +00:00
if ( bLookingForSpecificFile )
{
2003-07-22 07:47:27 +00:00
GetDirListing ( sThemeDir + sCategory + SLASH + sFileName , asElementPaths , bDirsOnly , true );
2003-04-12 17:39:27 +00:00
}
else // look for all files starting with sFileName that have types we can use
{
/* First, look for redirs. */
2003-07-22 07:47:27 +00:00
GetDirListing ( sThemeDir + sCategory + SLASH + sFileName + ".redir" ,
2003-04-12 17:39:27 +00:00
asElementPaths , false , true );
2003-01-23 04:41:57 +00:00
2003-10-19 23:00:11 +00:00
const CString wildcard = ( category == BGAnimations ? "" : "*" );
CStringArray asPaths ;
GetDirListing ( sThemeDir + sCategory + SLASH + sFileName + wildcard ,
asPaths , bDirsOnly , true );
2003-01-23 04:41:57 +00:00
2003-10-19 23:00:11 +00:00
for ( unsigned p = 0 ; p < asPaths . size (); ++ p )
{
static const char * masks [ NUM_ELEMENT_CATEGORIES ][ 12 ] = {
{ "" , NULL },
{ "ini" , NULL },
2003-10-31 02:06:48 +00:00
{ "actor" , "sprite" , "png" , "jpg" , "bmp" , "gif" , "avi" , "mpg" , "mpeg" , "txt" , "" , NULL },
2003-10-19 23:00:11 +00:00
{ "png" , NULL },
{ "mp3" , "ogg" , "wav" , NULL },
{ "sm" , NULL },
};
const char ** asset_masks = masks [ category ];
const CString ext = GetExtension ( asPaths [ p ] );
if ( ext == "redir" )
continue ; // got it already
for ( int i = 0 ; asset_masks [ i ]; ++ i )
{
2003-10-31 02:06:48 +00:00
/* No extension means directories. */
if ( asset_masks [ i ][ 0 ] == 0 && ! IsADirectory ( asPaths [ p ]) )
continue ;
2003-10-19 23:00:11 +00:00
if ( ext == asset_masks [ i ] )
{
asElementPaths . push_back ( asPaths [ p ] );
break ;
}
}
}
2003-04-12 17:39:27 +00:00
if ( category == Fonts )
Font :: WeedFontNames ( asElementPaths , sFileName );
}
2003-03-15 00:16:45 +00:00
2003-11-17 03:37:51 +00:00
if ( asElementPaths . size () == 0 )
{
return "" ; // This isn't fatal.
}
2003-03-15 00:16:45 +00:00
if ( asElementPaths . size () > 1 )
{
2003-07-03 02:41:27 +00:00
FlushDirCache ();
2003-10-22 07:56:08 +00:00
g_ThemePathCache [ category ]. clear ();
2003-03-15 03:09:06 +00:00
2003-03-15 00:16:45 +00:00
CString message = ssprintf (
2003-07-11 03:15:28 +00:00
"ThemeManager: There is more than one theme element element that matches "
2003-03-15 00:16:45 +00:00
"'%s/%s/%s'. Please remove all but one of these matches." ,
2003-04-25 00:01:35 +00:00
sThemeName . c_str (), sCategory . c_str (), sFileName . c_str () );
2003-07-11 03:39:02 +00:00
2003-11-17 03:37:51 +00:00
switch ( HOOKS -> MessageBoxAbortRetryIgnore ( message ) )
{
case ArchHooks :: abort :
RageException :: Throw ( message );
break ;
case ArchHooks :: retry :
2003-11-15 06:08:13 +00:00
goto try_element_again ;
2003-11-17 03:37:51 +00:00
case ArchHooks :: ignore :
break ;
2003-03-15 00:16:45 +00:00
}
2003-11-17 03:37:51 +00:00
}
CString sPath = asElementPaths [ 0 ];
bool bIsARedirect = GetExtension ( sPath ). CompareNoCase ( "redir" ) == 0 ;
if ( ! bIsARedirect )
{
return sPath ;
}
else // bIsARedirect
{
CString sNewFileName = GetRedirContents ( sPath );
/* backwards-compatibility hack */
if ( category == Fonts )
sNewFileName . Replace ( " 16x16.png" , "" );
/* Search again. For example, themes/default/Fonts/foo might redir
* to "Hello"; but "Hello" might be overridden in themes/hot pink/Fonts/Hello. */
/* Important: We need to do a full search. For example, BG redirs in
* the default theme point to "_shared background", and themes override
* just "_shared background"; the redirs in the default theme should end
* up resolving to the overridden background. */
/* Use GetPathToOptional because we don't want report that there's an element
* missing. Instead we want to report that the redirect is invalid. */
CString sNewPath = GetPathTo ( category , sNewFileName , true );
if ( ! sNewPath . empty () )
return sNewPath ;
else
2003-03-15 00:16:45 +00:00
{
2003-11-17 03:37:51 +00:00
CString message = ssprintf (
"ThemeManager: The redirect '%s' points to the file '%s', which does not exist. "
"Verify that this redirect is correct." ,
sPath . c_str (), sNewFileName . c_str ());
2003-03-15 00:16:45 +00:00
2003-11-17 03:37:51 +00:00
if ( ArchHooks :: retry == HOOKS -> MessageBoxAbortRetryIgnore ( message ) )
goto try_element_again ;
2003-03-15 00:16:45 +00:00
2003-11-17 03:37:51 +00:00
RageException :: Throw ( "%s" , message . c_str () );
2003-03-15 00:16:45 +00:00
}
}
2003-01-26 21:45:13 +00:00
}
2003-01-23 04:41:57 +00:00
2003-04-12 17:39:27 +00:00
CString ThemeManager :: GetPathTo ( ElementCategory category , CString sFileName , bool bOptional )
2003-01-19 03:26:05 +00:00
{
2003-10-22 07:56:08 +00:00
map < CString , CString > & Cache = g_ThemePathCache [ category ];
{
map < CString , CString >:: const_iterator i ;
i = Cache . find ( sFileName );
if ( i != Cache . end () )
return i -> second ;
}
2003-07-22 07:47:27 +00:00
// TODO: Use HOOKS->MessageBox()
2003-01-19 03:26:05 +00:00
try_element_again :
2003-04-12 17:39:27 +00:00
CString ret = GetPathTo ( m_sCurThemeName , category , sFileName );
2003-01-26 21:45:13 +00:00
if ( ! ret . empty () ) // we found something
2003-10-22 07:56:08 +00:00
{
Cache [ sFileName ] = ret ;
2003-01-19 03:26:05 +00:00
return ret ;
2003-10-22 07:56:08 +00:00
}
2003-07-22 07:47:27 +00:00
2003-04-12 17:39:27 +00:00
ret = GetPathTo ( BASE_THEME_NAME , category , sFileName );
if ( ! ret . empty () ) // we found something
2003-10-22 07:56:08 +00:00
{
Cache [ sFileName ] = ret ;
2003-04-12 17:39:27 +00:00
return ret ;
2003-10-22 07:56:08 +00:00
}
2003-07-11 03:43:33 +00:00
else if ( bOptional )
2003-10-22 07:56:08 +00:00
{
Cache [ sFileName ] = "" ;
2003-04-12 17:39:27 +00:00
return "" ;
2003-10-22 07:56:08 +00:00
}
2003-01-19 03:26:05 +00:00
2003-04-12 17:39:27 +00:00
CString sCategory = ELEMENT_CATEGORY_STRING [ category ];
2003-04-12 20:22:42 +00:00
2003-07-22 07:47:27 +00:00
CString sMessage = "The theme element '" + sCategory + SLASH + sFileName + "' is missing." ;
2003-11-17 01:44:06 +00:00
switch ( HOOKS -> MessageBoxAbortRetryIgnore ( sMessage , "MissingThemeElement" ) )
2003-01-19 03:26:05 +00:00
{
2003-11-15 06:08:13 +00:00
case ArchHooks :: retry :
2003-07-03 08:12:06 +00:00
FlushDirCache ();
2003-10-22 07:56:08 +00:00
g_ThemePathCache [ category ]. clear ();
2003-01-19 03:26:05 +00:00
goto try_element_again ;
2003-11-17 03:37:51 +00:00
case ArchHooks :: ignore :
LOG -> Warn (
"Theme element '%s" SLASH "%s' could not be found in '%s' or '%s'." ,
sCategory . c_str (),
sFileName . c_str (),
GetThemeDirFromName ( m_sCurThemeName ). c_str (),
GetThemeDirFromName ( BASE_THEME_NAME ). c_str () );
/* Err? */
if ( sFileName == "_missing" )
RageException :: Throw ( "'_missing' isn't present in '%s%s'" , GetThemeDirFromName ( BASE_THEME_NAME ). c_str (), sCategory . c_str () );
Cache [ sFileName ] = GetPathTo ( category , "_missing" );
return Cache [ sFileName ];
case ArchHooks :: abort :
2003-07-22 07:47:27 +00:00
RageException :: Throw ( "Theme element '%s" SLASH "%s' could not be found in '%s' or '%s'." ,
2003-04-25 00:01:35 +00:00
sCategory . c_str (),
sFileName . c_str (),
GetThemeDirFromName ( m_sCurThemeName ). c_str (),
GetThemeDirFromName ( BASE_THEME_NAME ). c_str () );
2003-11-15 06:08:13 +00:00
default :
ASSERT ( 0 );
2003-11-17 03:37:51 +00:00
return "" ;
2003-01-19 03:26:05 +00:00
}
}
2002-08-13 23:26:46 +00:00
2003-08-19 08:01:15 +00:00
CString ThemeManager :: GetMetricsIniPath ( CString sThemeName )
2002-08-13 23:26:46 +00:00
{
2003-08-19 08:01:15 +00:00
return GetThemeDirFromName ( sThemeName ) + METRICS_FILE ;
2002-08-13 23:26:46 +00:00
}
2003-03-24 21:37:13 +00:00
bool ThemeManager :: HasMetric ( CString sClassName , CString sValueName )
{
CString sThrowAway ;
return m_pIniMetrics -> GetValue ( sClassName , sValueName , sThrowAway );
}
2003-11-05 04:56:41 +00:00
void ThemeManager :: ReloadMetricsIfNecessary ()
{
//
// reload metrics if file has changed
//
CString sCurMetricPath = GetMetricsIniPath ( m_sCurThemeName );
CString sDefaultMetricPath = GetMetricsIniPath ( BASE_THEME_NAME );
if ( m_uHashForCurThemeMetrics != GetHashForFile ( sCurMetricPath ) ||
m_uHashForBaseThemeMetrics != GetHashForFile ( sDefaultMetricPath ) )
{
2003-11-07 20:43:17 +00:00
ReloadMetrics ();
2003-11-05 04:56:41 +00:00
}
2003-11-07 20:43:17 +00:00
}
void ThemeManager :: ReloadMetrics ()
{
SwitchThemeAndLanguage ( m_sCurThemeName , m_sCurLanguage ); // force a reload of the metrics cache
SCREENMAN -> SystemMessage ( "Reloaded metrics" );
2003-11-05 04:56:41 +00:00
//
// clear theme path cache
//
for ( int i = 0 ; i < NUM_ELEMENT_CATEGORIES ; ++ i )
g_ThemePathCache [ i ]. clear ();
}
2003-03-18 21:41:17 +00:00
CString ThemeManager :: GetMetricRaw ( CString sClassName , CString sValueName )
2002-08-13 23:26:46 +00:00
{
2002-08-22 09:31:32 +00:00
try_metric_again :
2003-11-05 05:17:56 +00:00
2003-08-19 08:01:15 +00:00
CString sCurMetricPath = GetMetricsIniPath ( m_sCurThemeName );
CString sDefaultMetricPath = GetMetricsIniPath ( BASE_THEME_NAME );
2002-08-13 23:26:46 +00:00
CString sValue ;
2002-09-17 23:02:37 +00:00
if ( m_pIniMetrics -> GetValue ( sClassName , sValueName , sValue ) )
2002-08-13 23:26:46 +00:00
return sValue ;
2003-11-15 06:08:13 +00:00
CString sMessage = ssprintf ( "The theme metric '%s-%s' is missing. Correct this and click Retry, or Cancel to break." , sClassName . c_str (), sValueName . c_str () );
switch ( HOOKS -> MessageBoxAbortRetryIgnore ( sMessage ) )
2003-11-05 05:17:56 +00:00
{
2003-11-15 06:08:13 +00:00
case ArchHooks :: abort :
break ; // fall through
case ArchHooks :: retry :
FlushDirCache ();
ReloadMetrics ();
goto try_metric_again ;
case ArchHooks :: ignore :
return "" ;
default :
ASSERT ( 0 );
2003-11-05 05:17:56 +00:00
}
2002-08-22 09:31:32 +00:00
2002-12-21 19:34:02 +00:00
RageException :: Throw ( "Theme metric '%s : %s' could not be found in '%s' or '%s'." ,
2003-04-25 00:01:35 +00:00
sClassName . c_str (),
sValueName . c_str (),
sCurMetricPath . c_str (),
sDefaultMetricPath . c_str ()
2002-08-13 23:26:46 +00:00
);
}
2003-03-18 21:41:17 +00:00
/* Get a string metric. */
CString ThemeManager :: GetMetric ( CString sClassName , CString sValueName )
{
CString sValue = GetMetricRaw ( sClassName , sValueName );
// "::" means newline since you can't use line breaks in an ini file.
sValue . Replace ( "::" , " \n " );
/* XXX: add a parameter to turn this off if there are some metrics where
* we don't want markers */
FontCharAliases :: ReplaceMarkers ( sValue );
return sValue ;
}
2002-09-17 23:02:37 +00:00
int ThemeManager :: GetMetricI ( CString sClassName , CString sValueName )
2002-08-13 23:26:46 +00:00
{
2003-03-18 21:41:17 +00:00
return atoi ( GetMetricRaw ( sClassName , sValueName ) );
2002-08-13 23:26:46 +00:00
}
2002-09-17 23:02:37 +00:00
float ThemeManager :: GetMetricF ( CString sClassName , CString sValueName )
2002-08-13 23:26:46 +00:00
{
2003-03-18 21:41:17 +00:00
return ( float ) atof ( GetMetricRaw ( sClassName , sValueName ) );
2002-08-13 23:26:46 +00:00
}
2002-09-17 23:02:37 +00:00
bool ThemeManager :: GetMetricB ( CString sClassName , CString sValueName )
2002-08-13 23:26:46 +00:00
{
2003-03-18 21:41:17 +00:00
return atoi ( GetMetricRaw ( sClassName , sValueName ) ) != 0 ;
2002-08-13 23:26:46 +00:00
}
2002-10-28 05:30:45 +00:00
RageColor ThemeManager :: GetMetricC ( CString sClassName , CString sValueName )
2002-08-13 23:26:46 +00:00
{
2003-11-18 04:06:39 +00:00
RageColor ret ( 1 , 1 , 1 , 1 );
if ( ! ret . FromString ( GetMetricRaw ( sClassName , sValueName ) ) )
LOG -> Warn ( "The color value '%s' for NoteSkin metric '%s : %s' is invalid." , GetMetricRaw ( sClassName , sValueName ). c_str (), sClassName . c_str (), sValueName . c_str () );
return ret ;
2002-08-13 23:26:46 +00:00
}
2003-04-13 04:50:08 +00:00
void ThemeManager :: NextTheme ()
{
CStringArray as ;
GetThemeNames ( as );
2003-04-14 04:35:19 +00:00
unsigned i ;
for ( i = 0 ; i < as . size (); i ++ )
2003-04-13 04:50:08 +00:00
if ( as [ i ]. CompareNoCase ( m_sCurThemeName ) == 0 )
break ;
int iNewIndex = ( i + 1 ) % as . size ();
2003-08-19 08:01:15 +00:00
SwitchThemeAndLanguage ( as [ iNewIndex ], m_sCurLanguage );
}
void ThemeManager :: GetLanguagesForTheme ( CString sThemeName , CStringArray & asLanguagesOut )
{
CString sLanguageDir = GetThemeDirFromName ( sThemeName ) + LANGUAGES_SUBDIR ;
CStringArray as ;
GetDirListing ( sLanguageDir + "*.ini" , as );
// stip out metrics.ini
for ( int i = as . size () - 1 ; i >= 0 ; i -- )
{
if ( as [ i ]. CompareNoCase ( METRICS_FILE ) == 0 )
as . erase ( as . begin () + i );
// strip ".ini"
as [ i ] = as [ i ]. Left ( as [ i ]. size () - 4 );
}
asLanguagesOut = as ;
}
CString ThemeManager :: GetLanguageIniPath ( CString sThemeName , CString sLanguage )
{
return GetThemeDirFromName ( sThemeName ) + LANGUAGES_SUBDIR + sLanguage + ".ini" ;
2003-04-14 04:35:19 +00:00
}