diff --git a/stepmania/src/ScreenOptionsMaster.cpp b/stepmania/src/ScreenOptionsMaster.cpp index 92c6f64892..b5ce7b9950 100644 --- a/stepmania/src/ScreenOptionsMaster.cpp +++ b/stepmania/src/ScreenOptionsMaster.cpp @@ -17,6 +17,7 @@ #include "PrefsManager.h" #include "ScreenOptionsMasterPrefs.h" #include "RageSounds.h" +#include "StepMania.h" #define OPTION_MENU_FLAGS THEME->GetMetric (m_sName,"OptionMenuFlags") #define ROW_LINE(i) THEME->GetMetric (m_sName,ssprintf("Line%i",(i+1))) @@ -329,7 +330,7 @@ int ScreenOptionsMaster::ImportOption( const OptionRow &row, const OptionRowHand } case ROW_CONFIG: - return hand.opt->Get(); + return hand.opt->Get( row.choices ); default: ASSERT(0); @@ -372,7 +373,7 @@ void ScreenOptionsMaster::ExportOption( const OptionRow &row, const OptionRowHan break; case ROW_CONFIG: - hand.opt->Put( sel ); + hand.opt->Put( sel, row.choices ); break; case ROW_CHARACTER: @@ -421,6 +422,8 @@ void ScreenOptionsMaster::ExportOption( const OptionRow &row, const OptionRowHan void ScreenOptionsMaster::ExportOptions() { + const CString OldTheme = THEME->GetCurThemeName(); + unsigned i; for( i = 0; i < OptionRowHandlers.size(); ++i ) { @@ -461,12 +464,22 @@ void ScreenOptionsMaster::ExportOptions() m_NextScreen = NEXT_SCREEN; /* If any ROW_CONFIG options were used, save preferences. */ - bool ConfUsed = false; + bool ConfChanged = false; for( i = 0; i < OptionRowHandlers.size(); ++i ) if( OptionRowHandlers[i].type == ROW_CONFIG ) - ConfUsed = true; + ConfChanged = true; - if( ConfUsed ) + /* Did the theme change? */ + if( OldTheme != THEME->GetCurThemeName() ) + { + // THEME->SwitchThemeAndLanguage( sNewTheme, THEME->GetCurLanguage() ); + ApplyGraphicOptions(); // reset graphics to apply new window title and icon + + SONGMAN->UpdateRankingCourses(); // update ranking courses + ConfChanged = true; // save it + } + + if( ConfChanged ) { LOG->Trace("ROW_CONFIG used; saving ..."); PREFSMAN->SaveGlobalPrefsToDisk(); diff --git a/stepmania/src/ScreenOptionsMasterPrefs.cpp b/stepmania/src/ScreenOptionsMasterPrefs.cpp index bfe878dedd..ac19930bf7 100644 --- a/stepmania/src/ScreenOptionsMasterPrefs.cpp +++ b/stepmania/src/ScreenOptionsMasterPrefs.cpp @@ -2,14 +2,21 @@ #include "ScreenOptionsMasterPrefs.h" #include "PrefsManager.h" +#include "ThemeManager.h" +#include "AnnouncerManager.h" +#include "NoteSkinManager.h" +#include "PlayerOptions.h" +#include "SongOptions.h" /* "sel" is the selection in the menu. */ -static void MoveData( int &sel, int &opt, bool ToSel ) +template +static void MoveData( int &sel, T &opt, bool ToSel ) { - if( ToSel ) sel = opt; - else opt = sel; + if( ToSel ) (int&) sel = opt; + else opt = (T) sel; } +template<> static void MoveData( int &sel, bool &opt, bool ToSel ) { if( ToSel ) sel = opt; @@ -17,18 +24,146 @@ static void MoveData( int &sel, bool &opt, bool ToSel ) } #define MOVE( name, opt ) \ - static void name( int &sel, bool ToSel ) \ + static void name( int &sel, bool ToSel, const CStringArray &choices ) \ { \ MoveData( sel, opt, ToSel ); \ } -MOVE( PreloadSounds, PREFSMAN->m_bSoundPreloadAll ); -MOVE( ResamplingQuality, PREFSMAN->m_iSoundResampleQuality ); + +static void LanguageChoices( CStringArray &out ) +{ + THEME->GetLanguages( out ); +} + +static void Language( int &sel, bool ToSel, const CStringArray &choices ) +{ + if( ToSel ) + { + sel = 0; + for( unsigned i=1; iGetCurLanguage()) ) + sel = i; + } else { + const CString sNewLanguage = choices[sel]; + + if( THEME->GetCurLanguage() != sNewLanguage ) + THEME->SwitchThemeAndLanguage( THEME->GetCurThemeName(), sNewLanguage ); + } +} + +static void ThemeChoices( CStringArray &out ) +{ + THEME->GetThemeNames( out ); +} + +static void Theme( int &sel, bool ToSel, const CStringArray &choices ) +{ + if( ToSel ) + { + sel = 0; + for( unsigned i=1; iGetCurThemeName()) ) + sel = i; + } else { + const CString sNewTheme = choices[sel]; + if( THEME->GetCurThemeName() != sNewTheme ) + THEME->SwitchThemeAndLanguage( sNewTheme, THEME->GetCurLanguage() ); + } +} + +static void AnnouncerChoices( CStringArray &out ) +{ + ANNOUNCER->GetAnnouncerNames( out ); + out.insert( out.begin(), "OFF" ); +} + +static void Announcer( int &sel, bool ToSel, const CStringArray &choices ) +{ + if( ToSel ) + { + sel = 0; + for( unsigned i=1; iGetCurAnnouncerName()) ) + sel = i; + } else { + const CString sNewAnnouncer = sel? choices[sel]:""; + ANNOUNCER->SwitchAnnouncer( sNewAnnouncer ); + } +} + +static void DefaultNoteSkinChoices( CStringArray &out ) +{ + NOTESKIN->GetNoteSkinNames( out ); + for( unsigned i = 0; i < out.size(); ++i ) + out[i].MakeUpper(); +} + +static void DefaultNoteSkin( int &sel, bool ToSel, const CStringArray &choices ) +{ + if( ToSel ) + { + PlayerOptions po; + po.FromString( PREFSMAN->m_sDefaultModifiers ); + sel = 0; + for( unsigned i=0; i < choices.size(); i++ ) + if( !stricmp(choices[i], po.m_sNoteSkin) ) + sel = i; + } else { + CString sModifiers = PREFSMAN->m_sDefaultModifiers; + PlayerOptions po; + po.FromString( sModifiers ); + SongOptions so; + so.FromString( sModifiers ); + + po.m_sNoteSkin = choices[sel]; + + CStringArray as; + if( po.GetString() != "" ) + as.push_back( po.GetString() ); + if( so.GetString() != "" ) + as.push_back( so.GetString() ); + + PREFSMAN->m_sDefaultModifiers = join(", ",as); + } +} + +MOVE( Instructions, PREFSMAN->m_bInstructions ); +MOVE( Caution, PREFSMAN->m_bShowDontDie ); +MOVE( OniScoreDisplay, PREFSMAN->m_bDancePointsForOni ); +MOVE( SongGroup, PREFSMAN->m_bShowSelectGroup ); +MOVE( WheelSections, PREFSMAN->m_MusicWheelUsesSections ); +MOVE( TenFootInRed, PREFSMAN->m_bTenFooterInRed ); +MOVE( CourseSort, PREFSMAN->m_iCourseSortOrder ); +MOVE( RandomAtEnd, PREFSMAN->m_bMoveRandomToEnd ); +MOVE( Translations, PREFSMAN->m_bShowNative ); +MOVE( Lyrics, PREFSMAN->m_bShowLyrics ); + +MOVE( PreloadSounds, PREFSMAN->m_bSoundPreloadAll ); +MOVE( ResamplingQuality,PREFSMAN->m_iSoundResampleQuality ); + static const ConfOption g_ConfOptions[] = { - ConfOption( "Preload\nSounds", PreloadSounds, "NO","YES" ), - ConfOption( "Resampling\nQuality", ResamplingQuality, "FAST","NORMAL","HIGH QUALITY" ), + /* Appearance options */ + ConfOption( "Language", Language, LanguageChoices ), + ConfOption( "Theme", Theme, ThemeChoices ), + ConfOption( "Announcer", Announcer, AnnouncerChoices ), + ConfOption( "Default\nNoteSkin", DefaultNoteSkin, DefaultNoteSkinChoices ), + + ConfOption( "Instructions", Instructions, "SKIP","SHOW"), + ConfOption( "Caution", Caution, "SKIP","SHOW"), + ConfOption( "Oni Score\nDisplay", OniScoreDisplay, "PERCENT","DANCE POINTS"), + ConfOption( "Song\nGroup", SongGroup, "ALL MUSIC","CHOOSE"), + ConfOption( "Wheel\nSections", WheelSections, "NEVER","ALWAYS", "ABC ONLY"), + ConfOption( "10+ foot\nIn Red", TenFootInRed, "NO", "YES"), + ConfOption( "Course\nSort", CourseSort, "# SONGS","AVG FEET","TOTAL FEET","RANKING"), + ConfOption( "Random\nAt End", RandomAtEnd, "NO","YES"), + ConfOption( "Translations", Translations, "ROMANIZATION","NATIVE LANGUAGE"), + ConfOption( "Lyrics", Lyrics, "HIDE","SHOW"), + + /* Sound options */ + ConfOption( "Preload\nSounds", PreloadSounds, "NO","YES" ), + ConfOption( "Resampling\nQuality", ResamplingQuality, "FAST","NORMAL","HIGH QUALITY" ), ConfOption( "", NULL ) }; @@ -41,8 +176,9 @@ const ConfOption *FindConfOption( CString name ) CString match(opt->name); match.Replace("\n", ""); match.Replace("-", ""); + match.Replace(" ", ""); - if( match != name ) + if( match.CompareNoCase(name) ) continue; return opt; diff --git a/stepmania/src/ScreenOptionsMasterPrefs.h b/stepmania/src/ScreenOptionsMasterPrefs.h index be97d4ee3a..c65bdb8a81 100644 --- a/stepmania/src/ScreenOptionsMasterPrefs.h +++ b/stepmania/src/ScreenOptionsMasterPrefs.h @@ -7,16 +7,16 @@ struct ConfOption /* Name of this option. It's helpful to delimit this with newlines, as it'll * be the default display title. */ CString name; - void (*MoveData)( int &sel, bool ToSel ); + void (*MoveData)( int &sel, bool ToSel, const CStringArray &choices ); /* If MakeOptionsListCB is set, it'll be called by MakeOptionsList; otherwise * the contents of names is returned. */ void MakeOptionsList( CStringArray &out ) const; - inline int Get() const { int sel; MoveData( sel, true ); return sel; } - inline void Put( int sel ) const { MoveData( sel, false ); } + inline int Get( const CStringArray &choices ) const { int sel; MoveData( sel, true, choices ); return sel; } + inline void Put( int sel, const CStringArray &choices ) const { MoveData( sel, false, choices ); } - ConfOption( const char *n, void (*m)( int &sel, bool in ), + ConfOption( const char *n, void (*m)( int &sel, bool in, const CStringArray &choices ), const char *c0=NULL, const char *c1=NULL, const char *c2=NULL, const char *c3=NULL, const char *c4=NULL, const char *c5=NULL, const char *c6=NULL, const char *c7=NULL, const char *c8=NULL, const char *c9=NULL, const char *c10=NULL, const char *c11=NULL, const char *c12=NULL, const char *c13=NULL, const char *c14=NULL, const char *c15=NULL, const char *c16=NULL, const char *c17=NULL, const char *c18=NULL, const char *c19=NULL ) { name = n; @@ -26,6 +26,16 @@ struct ConfOption PUSH(c0);PUSH(c1);PUSH(c2);PUSH(c3);PUSH(c4);PUSH(c5);PUSH(c6);PUSH(c7);PUSH(c8);PUSH(c9);PUSH(c10);PUSH(c11);PUSH(c12);PUSH(c13);PUSH(c14);PUSH(c15);PUSH(c16);PUSH(c17);PUSH(c18);PUSH(c19); #undef PUSH } + + ConfOption( const char *n, void (*m)( int &sel, bool in, const CStringArray &choices ), + void (*lst)( CStringArray &out ) ) + { + name = n; + MoveData = m; + MakeOptionsListCB = lst; + } + + private: vector names; void (*MakeOptionsListCB)( CStringArray &out );