From 2a6dcba6e8b9b8fea2c5117ce002f109c5ac018d Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Thu, 23 Jun 2005 08:05:09 +0000 Subject: [PATCH] cleanup: "GroupName" -> "SongGroup" to make room for CourseGroup replace checks for "cvs" with a call to StripCvs() m_Rows -> m_pRows broadcast on preferred group changes --- stepmania/src/AnnouncerManager.cpp | 6 +- stepmania/src/Banner.cpp | 4 +- stepmania/src/Banner.h | 2 +- stepmania/src/CatalogXml.cpp | 2 +- stepmania/src/Course.cpp | 8 +- stepmania/src/EditCoursesSongMenu.cpp | 2 +- stepmania/src/EditMenu.cpp | 4 +- stepmania/src/FadingBanner.cpp | 4 +- stepmania/src/FadingBanner.h | 2 +- stepmania/src/GameCommand.cpp | 2 +- stepmania/src/GameState.cpp | 14 +-- stepmania/src/GameState.h | 3 +- stepmania/src/MessageManager.cpp | 2 + stepmania/src/MessageManager.h | 6 +- stepmania/src/MusicWheel.cpp | 4 +- stepmania/src/NoteSkinManager.cpp | 11 +-- stepmania/src/OptionRowHandler.cpp | 8 +- stepmania/src/RageUtil.cpp | 9 ++ stepmania/src/RageUtil.h | 2 + stepmania/src/ScreenMiniMenu.cpp | 10 +-- stepmania/src/ScreenNetworkOptions.cpp | 2 +- stepmania/src/ScreenOptions.cpp | 104 +++++++++++----------- stepmania/src/ScreenOptions.h | 2 +- stepmania/src/ScreenOptionsMaster.cpp | 12 +-- stepmania/src/ScreenPlayerOptions.cpp | 6 +- stepmania/src/ScreenProfileOptions.cpp | 10 +-- stepmania/src/ScreenSMOnlineLogin.cpp | 10 +-- stepmania/src/ScreenSelectGroup.cpp | 6 +- stepmania/src/ScreenSelectMusic.cpp | 2 +- stepmania/src/ScreenTitleMenu.cpp | 2 +- stepmania/src/SongManager.cpp | 115 ++++++++++++++----------- stepmania/src/SongManager.h | 16 ++-- stepmania/src/ThemeManager.cpp | 10 +-- 33 files changed, 212 insertions(+), 190 deletions(-) diff --git a/stepmania/src/AnnouncerManager.cpp b/stepmania/src/AnnouncerManager.cpp index 51f39e7eb5..578a11dc67 100644 --- a/stepmania/src/AnnouncerManager.cpp +++ b/stepmania/src/AnnouncerManager.cpp @@ -19,11 +19,9 @@ void AnnouncerManager::GetAnnouncerNames( CStringArray& AddTo ) { GetDirListing( ANNOUNCERS_DIR+"*", AddTo, true ); - // strip out the folder called "CVS" and EMPTY_ANNOUNCER_NAME - for( int i=AddTo.size()-1; i>=0; i-- ) - if( !stricmp( AddTo[i], "cvs" ) ) - AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 ); + StripCvs( AddTo ); + // strip out the empty announcer folder for( int i=AddTo.size()-1; i>=0; i-- ) if( !stricmp( AddTo[i], EMPTY_ANNOUNCER_NAME ) ) AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 ); diff --git a/stepmania/src/Banner.cpp b/stepmania/src/Banner.cpp index c28bc1e139..5c533714b0 100644 --- a/stepmania/src/Banner.cpp +++ b/stepmania/src/Banner.cpp @@ -100,9 +100,9 @@ void Banner::LoadMode() m_bScrolling = false; } -void Banner::LoadFromGroup( CString sGroupName ) +void Banner::LoadFromSongGroup( CString sSongGroup ) { - CString sGroupBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); + CString sGroupBannerPath = SONGMAN->GetSongGroupBannerPath( sSongGroup ); if( sGroupBannerPath != "" ) Load( sGroupBannerPath ); else LoadFallback(); m_bScrolling = false; diff --git a/stepmania/src/Banner.h b/stepmania/src/Banner.h index 1ecf09ff0f..168aeff4b0 100644 --- a/stepmania/src/Banner.h +++ b/stepmania/src/Banner.h @@ -22,7 +22,7 @@ public: void LoadFromSong( Song* pSong ); // NULL means no song void LoadAllMusic(); void LoadMode(); - void LoadFromGroup( CString sGroupName ); + void LoadFromSongGroup( CString sSongGroup ); void LoadFromCourse( Course* pCourse ); void LoadCardFromCharacter( Character* pCharacter ); void LoadIconFromCharacter( Character* pCharacter ); diff --git a/stepmania/src/CatalogXml.cpp b/stepmania/src/CatalogXml.cpp index 6199897c42..4bdfa12fb8 100644 --- a/stepmania/src/CatalogXml.cpp +++ b/stepmania/src/CatalogXml.cpp @@ -60,7 +60,7 @@ void SaveCatalogXml( LoadingWindow *loading_window ) int iTotalSongs = 0; int iTotalSteps = 0; vector vsGroups; - SONGMAN->GetGroupNames( vsGroups ); + SONGMAN->GetSongGroupNames( vsGroups ); FOREACH_CONST( CString, vsGroups, sGroup ) { XNode* p1 = pNumSongsByGroup->AppendChild( "Group" ); diff --git a/stepmania/src/Course.cpp b/stepmania/src/Course.cpp index 9745efa1b8..b423d47556 100644 --- a/stepmania/src/Course.cpp +++ b/stepmania/src/Course.cpp @@ -242,7 +242,7 @@ void Course::LoadFromCRSFile( CString sPath ) LOG->Warn( "Course file '%s' contains a random_within_group entry '%s' that is invalid. " "Song should be in the format '/*'.", sPath.c_str(), sSong.c_str()); - if( !SONGMAN->DoesGroupExist(new_entry.group_name) ) + if( !SONGMAN->DoesSongGroupExist(new_entry.group_name) ) { /* XXX: We need a place to put "user warnings". This is too loud for info.txt-- * it obscures important warnings--and regular users never look there, anyway. */ @@ -545,9 +545,11 @@ void Course::AutogenEndlessFromGroup( CString sGroupName, Difficulty diff ) { m_sMainTitle = "All Songs"; // m_sBannerPath = ""; // XXX - } else { + } + else + { m_sMainTitle = SONGMAN->ShortenGroupName( sGroupName ); - m_sBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); + m_sBannerPath = SONGMAN->GetSongGroupBannerPath( sGroupName ); } // We want multiple songs, so we can try to prevent repeats during diff --git a/stepmania/src/EditCoursesSongMenu.cpp b/stepmania/src/EditCoursesSongMenu.cpp index 7672c8b54d..6823dc9097 100644 --- a/stepmania/src/EditCoursesSongMenu.cpp +++ b/stepmania/src/EditCoursesSongMenu.cpp @@ -57,7 +57,7 @@ EditCoursesSongMenu::EditCoursesSongMenu() m_soundChangeValue.Load( THEME->GetPathS("EditCoursesSongMenu","value") ); // fill in data structures - SONGMAN->GetGroupNames( m_aGroups ); + SONGMAN->GetSongGroupNames( m_aGroups ); m_SelectedRow = (Row)0; } diff --git a/stepmania/src/EditMenu.cpp b/stepmania/src/EditMenu.cpp index 2ca30fc24d..0c7b366062 100644 --- a/stepmania/src/EditMenu.cpp +++ b/stepmania/src/EditMenu.cpp @@ -79,7 +79,7 @@ static void GetSongsToShowForGroup( const CString &sGroup, vector &vpSong static void GetGroupsToShow( vector &vsGroupsOut ) { vsGroupsOut.clear(); - SONGMAN->GetGroupNames( vsGroupsOut ); + SONGMAN->GetSongGroupNames( vsGroupsOut ); for( int i = vsGroupsOut.size()-1; i>=0; i-- ) { const CString &sGroup = vsGroupsOut[i]; @@ -320,7 +320,7 @@ void EditMenu::OnRowValueChanged( EditMenuRow row ) { case ROW_GROUP: m_textValue[ROW_GROUP].SetText( SONGMAN->ShortenGroupName(GetSelectedGroup()) ); - m_GroupBanner.LoadFromGroup( GetSelectedGroup() ); + m_GroupBanner.LoadFromSongGroup( GetSelectedGroup() ); m_GroupBanner.ScaleToClipped( GROUP_BANNER_WIDTH, GROUP_BANNER_HEIGHT ); m_pSongs.clear(); GetSongsToShowForGroup( GetSelectedGroup(), m_pSongs ); diff --git a/stepmania/src/FadingBanner.cpp b/stepmania/src/FadingBanner.cpp index d6c522b3ba..e4e3eba59e 100644 --- a/stepmania/src/FadingBanner.cpp +++ b/stepmania/src/FadingBanner.cpp @@ -178,9 +178,9 @@ void FadingBanner::LoadMode() m_Banner[m_iIndexLatest].LoadMode(); } -void FadingBanner::LoadFromGroup( CString sGroupName ) +void FadingBanner::LoadFromSongGroup( CString sSongGroup ) { - const CString sGroupBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); + const CString sGroupBannerPath = SONGMAN->GetSongGroupBannerPath( sSongGroup ); LoadFromCachedBanner( sGroupBannerPath ); } diff --git a/stepmania/src/FadingBanner.h b/stepmania/src/FadingBanner.h index cdc4bc56b0..0cacec0f66 100644 --- a/stepmania/src/FadingBanner.h +++ b/stepmania/src/FadingBanner.h @@ -20,7 +20,7 @@ public: void LoadFromSong( const Song* pSong ); // NULL means no song void LoadAllMusic(); void LoadMode(); - void LoadFromGroup( CString sGroupName ); + void LoadFromSongGroup( CString sSongGroup ); void LoadFromCourse( const Course* pCourse ); void LoadRoulette(); void LoadRandom(); diff --git a/stepmania/src/GameCommand.cpp b/stepmania/src/GameCommand.cpp index ee8cb3e9b9..f516d8659b 100644 --- a/stepmania/src/GameCommand.cpp +++ b/stepmania/src/GameCommand.cpp @@ -761,7 +761,7 @@ void GameCommand::ApplySelf( const vector &vpns ) const for( map::const_iterator i = m_SetEnv.begin(); i != m_SetEnv.end(); i++ ) GAMESTATE->m_mapEnv[ i->first ] = i->second; if( !m_sSongGroup.empty() ) - GAMESTATE->m_sPreferredSongGroup = m_sSongGroup; + GAMESTATE->m_sPreferredSongGroup.Set( m_sSongGroup ); if( m_SortOrder != SORT_INVALID ) GAMESTATE->m_PreferredSortOrder = m_SortOrder; if( m_iUnlockIndex != -1 ) diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 49717b8ff2..c8ab3a8357 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -64,8 +64,10 @@ Song* GetDefaultSong() GameState::GameState() : m_pCurStyle( MESSAGE_CURRENT_STYLE_CHANGED ), - m_PreferredCourseDifficulty( MESSAGE_EDIT_PREFERRED_COURSE_DIFFICULTY_P1_CHANGED ), - m_PreferredDifficulty( MESSAGE_EDIT_PREFERRED_DIFFICULTY_P1_CHANGED ), + m_sPreferredSongGroup( MESSAGE_PREFERRED_SONG_GROUP_CHANGED ), + m_sPreferredCourseGroup(MESSAGE_PREFERRED_COURSE_GROUP_CHANGED ), + m_PreferredCourseDifficulty( MESSAGE_EDIT_PREFERRED_COURSE_DIFFICULTY_P1_CHANGED ), + m_PreferredDifficulty( MESSAGE_EDIT_PREFERRED_DIFFICULTY_P1_CHANGED ), m_pCurSong( MESSAGE_CURRENT_SONG_CHANGED ), m_pCurSteps( MESSAGE_CURRENT_STEPS_P1_CHANGED ), m_pCurCourse( MESSAGE_CURRENT_COURSE_CHANGED ), @@ -167,7 +169,8 @@ void GameState::Reset() // m_iCoins = 0; // don't reset coin count! m_MasterPlayerNumber = PLAYER_INVALID; m_mapEnv.clear(); - m_sPreferredSongGroup = GROUP_ALL_MUSIC; + m_sPreferredSongGroup.Set( GROUP_ALL_MUSIC ); + m_sPreferredCourseGroup.Set( "" ); m_bChangedFailTypeOnScreenSongOptions = false; FOREACH_PlayerNumber( p ) { @@ -610,6 +613,8 @@ void GameState::ReloadCharacters() CStringArray as; GetDirListing( CHARACTERS_DIR "*", as, true, true ); + StripCvs( as ); + bool FoundDefault = false; for( unsigned i=0; i m_sPreferredSongGroup; // GROUP_ALL_MUSIC denotes no preferred group + BroadcastOnChange m_sPreferredCourseGroup; bool m_bChangedFailTypeOnScreenSongOptions; // true if FailType was changed in the song options screen BroadcastOnChange1D m_PreferredDifficulty; SortOrder m_SortOrder; // set by MusicWheel diff --git a/stepmania/src/MessageManager.cpp b/stepmania/src/MessageManager.cpp index 6864dd39e5..25aa573d54 100644 --- a/stepmania/src/MessageManager.cpp +++ b/stepmania/src/MessageManager.cpp @@ -48,6 +48,8 @@ static const CString MessageNames[] = { "PlayersFinalized", "AssistTickChanged", "AutosyncChanged", + "PreferredSongGroupChanged", + "PreferredCourseGroupChanged", }; XToString( Message, NUM_MESSAGES ); diff --git a/stepmania/src/MessageManager.h b/stepmania/src/MessageManager.h index b7b3e689b7..cd6b7a0f62 100644 --- a/stepmania/src/MessageManager.h +++ b/stepmania/src/MessageManager.h @@ -56,7 +56,9 @@ enum Message MESSAGE_PLAYERS_FINALIZED, MESSAGE_ASSIST_TICK_CHANGED, MESSAGE_AUTOSYNC_CHANGED, - NUM_MESSAGES, + MESSAGE_PREFERRED_SONG_GROUP_CHANGED, + MESSAGE_PREFERRED_COURSE_GROUP_CHANGED, + NUM_MESSAGES, // leave this at the end MESSAGE_INVALID }; const CString& MessageToString( Message m ); @@ -96,6 +98,8 @@ public: const T Get() const { return val; } void Set( T t ) { val = t; MESSAGEMAN->Broadcast( MessageToString(mSendWhenChanged) ); } operator T () const { return val; } + bool operator == ( const T &other ) const { return val == other; } + bool operator != ( const T &other ) const { return val != other; } }; template diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 6556bd27e6..4033ac2d18 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -114,10 +114,10 @@ void MusicWheel::Load( CString sType ) if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) { // make the preferred group the group of the last song played. - if( GAMESTATE->m_sPreferredSongGroup==GROUP_ALL_MUSIC && !PREFSMAN->m_bPickExtraStage ) + if( GAMESTATE->m_sPreferredSongGroup == GROUP_ALL_MUSIC && !PREFSMAN->m_bPickExtraStage ) { ASSERT(GAMESTATE->m_pCurSong); - GAMESTATE->m_sPreferredSongGroup = GAMESTATE->m_pCurSong->m_sGroupName; + GAMESTATE->m_sPreferredSongGroup.Set( GAMESTATE->m_pCurSong->m_sGroupName ); } Song* pSong; diff --git a/stepmania/src/NoteSkinManager.cpp b/stepmania/src/NoteSkinManager.cpp index b2f5c64d11..520dfc8a6e 100644 --- a/stepmania/src/NoteSkinManager.cpp +++ b/stepmania/src/NoteSkinManager.cpp @@ -43,10 +43,7 @@ void NoteSkinManager::RefreshNoteSkinData( const Game* pGame ) CStringArray asNoteSkinNames; GetDirListing( sBaseSkinFolder + "*", asNoteSkinNames, true ); - // strip out "CVS" - for( int i=asNoteSkinNames.size()-1; i>=0; i-- ) - if( 0 == stricmp("cvs", asNoteSkinNames[i]) ) - asNoteSkinNames.erase( asNoteSkinNames.begin()+i, asNoteSkinNames.begin()+i+1 ); + StripCvs( asNoteSkinNames ); m_mapNameToData.clear(); for( unsigned j=0; jm_szName + "/"; GetDirListing( sBaseSkinFolder + "*", AddTo, true ); - - // strip out "CVS" - for( int i=AddTo.size()-1; i>=0; i-- ) - if( 0 == stricmp("cvs", AddTo[i]) ) - AddTo.erase( AddTo.begin()+i, AddTo.begin()+i+1 ); + StripCvs( AddTo ); } /* Move "default" to the front if it exists. */ diff --git a/stepmania/src/OptionRowHandler.cpp b/stepmania/src/OptionRowHandler.cpp index 0327131e46..663a5b501d 100644 --- a/stepmania/src/OptionRowHandler.cpp +++ b/stepmania/src/OptionRowHandler.cpp @@ -412,9 +412,9 @@ public: defOut.name = "Group"; Default.m_sSongGroup = GROUP_ALL_MUSIC; - vector vGroups; - SONGMAN->GetGroupNames( vGroups ); - ASSERT( vGroups.size() ); + vector vSongGroups; + SONGMAN->GetSongGroupNames( vSongGroups ); + ASSERT( vSongGroups.size() ); { defOut.choices.push_back( "AllGroups" ); @@ -423,7 +423,7 @@ public: ListEntries.push_back( mc ); } - FOREACH_CONST( CString, vGroups, g ) + FOREACH_CONST( CString, vSongGroups, g ) { defOut.choices.push_back( *g ); GameCommand mc; diff --git a/stepmania/src/RageUtil.cpp b/stepmania/src/RageUtil.cpp index f91d2ce119..977a98837b 100644 --- a/stepmania/src/RageUtil.cpp +++ b/stepmania/src/RageUtil.cpp @@ -658,6 +658,15 @@ void StripCrnl(CString &s) s.erase(s.size()-1); } +void StripCvs( vector &vs ) +{ + for( unsigned i=0; i &vs ); // remove all items that end in "cvs" + CString DerefRedir( const CString &sPath ); bool GetFileContents( const CString &sPath, CString &sOut, bool bOneLine = false ); diff --git a/stepmania/src/ScreenMiniMenu.cpp b/stepmania/src/ScreenMiniMenu.cpp index 6f113bbffe..5e2b2d373b 100644 --- a/stepmania/src/ScreenMiniMenu.cpp +++ b/stepmania/src/ScreenMiniMenu.cpp @@ -92,13 +92,13 @@ void ScreenMiniMenu::OnChange( PlayerNumber pn ) vector vpns; vpns.push_back( GAMESTATE->m_MasterPlayerNumber ); - for( unsigned i=0; i &vpns ) { - OptionRow &optrow = *m_Rows[r]; + OptionRow &optrow = *m_pRows[r]; MenuRow &mr = m_vMenuRows[r]; if( !mr.choices.empty() ) optrow.SetOneSharedSelection( mr.iDefaultChoice ); @@ -122,7 +122,7 @@ void ScreenMiniMenu::ExportOptions( int r, const vector &vpns ) if( r == GetCurrentRow() ) s_iLastRowCode = m_vMenuRows[r].iRowCode; s_viLastAnswers.resize( m_vMenuRows.size() ); - s_viLastAnswers[r] = m_Rows[r]->GetOneSharedSelection( true ); + s_viLastAnswers[r] = m_pRows[r]->GetOneSharedSelection( true ); } void ScreenMiniMenu::GoToNextScreen() diff --git a/stepmania/src/ScreenNetworkOptions.cpp b/stepmania/src/ScreenNetworkOptions.cpp index 1baeb9ee2c..42bf788aaa 100644 --- a/stepmania/src/ScreenNetworkOptions.cpp +++ b/stepmania/src/ScreenNetworkOptions.cpp @@ -132,7 +132,7 @@ void ScreenNetworkOptions::MenuStart( PlayerNumber pn, const InputEventType type } break; case PO_SERVER: - switch (m_Rows[GetCurrentRow()]->GetOneSharedSelection()) + switch( m_pRows[GetCurrentRow()]->GetOneSharedSelection() ) { case NO_START_SERVER: if (!NSMAN->isLanServer) diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index 37887e5c70..bc2829482a 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -130,7 +130,7 @@ void ScreenOptions::Init() void ScreenOptions::LoadOptionIcon( PlayerNumber pn, int iRow, CString sText ) { - m_Rows[iRow]->LoadOptionIcon( pn, sText ); + m_pRows[iRow]->LoadOptionIcon( pn, sText ); } void ScreenOptions::InitMenu( InputMode im, const vector &vDefs, const vector &vHands ) @@ -143,8 +143,8 @@ void ScreenOptions::InitMenu( InputMode im, const vector &v for( unsigned r=0; r &v m_framePage.AddChild( &m_Cursor[p] ); } - for( unsigned r=0; r &v } // poke once at all the explanation metrics so that we catch missing ones early - for( int r=0; r<(int)m_Rows.size(); r++ ) // foreach row + for( int r=0; r<(int)m_pRows.size(); r++ ) // foreach row { GetExplanationText( r ); } @@ -262,9 +262,9 @@ void ScreenOptions::InitMenu( InputMode im, const vector &v // put focus on the first enabled row FOREACH_PlayerNumber( p ) { - for( unsigned r=0; r &v /* It's tweening into position, but on the initial tween-in we only want to * tween in the whole page at once. Since the tweens are nontrivial, it's * easiest to queue the tweens and then force them to finish. */ - for( int r=0; r<(int) m_Rows.size(); r++ ) // foreach options line + for( int r=0; r<(int) m_pRows.size(); r++ ) // foreach options line { - OptionRow &row = *m_Rows[r]; + OptionRow &row = *m_pRows[r]; row.FinishTweening(); } @@ -310,13 +310,13 @@ void ScreenOptions::InitMenu( InputMode im, const vector &v ScreenOptions::~ScreenOptions() { LOG->Trace( "ScreenOptions::~ScreenOptions()" ); - for( unsigned i=0; iRefreshIcons( r, p ); } @@ -382,8 +382,8 @@ void ScreenOptions::PositionCursors() if( iRow == -1 ) continue; - ASSERT_M( iRow >= 0 && iRow < (int)m_Rows.size(), ssprintf("%i < %i", iRow, (int)m_Rows.size() ) ); - OptionRow &OptionRow = *m_Rows[iRow]; + ASSERT_M( iRow >= 0 && iRow < (int)m_pRows.size(), ssprintf("%i < %i", iRow, (int)m_pRows.size() ) ); + OptionRow &OptionRow = *m_pRows[iRow]; OptionsCursor &cursor = m_Cursor[pn]; const int iChoiceWithFocus = OptionRow.GetChoiceInRowWithFocus(pn); @@ -401,9 +401,9 @@ void ScreenOptions::TweenCursor( PlayerNumber pn ) { // Set the position of the cursor showing the current option the user is changing. const int iRow = m_iCurrentRow[pn]; - ASSERT_M( iRow < (int)m_Rows.size(), ssprintf("%i < %i", iRow, (int)m_Rows.size() ) ); + ASSERT_M( iRow < (int)m_pRows.size(), ssprintf("%i < %i", iRow, (int)m_pRows.size() ) ); - const OptionRow &row = *m_Rows[iRow]; + const OptionRow &row = *m_pRows[iRow]; const int iChoiceWithFocus = row.GetChoiceInRowWithFocus(pn); int iWidth, iX, iY; @@ -436,13 +436,13 @@ void ScreenOptions::TweenCursor( PlayerNumber pn ) * Update the whole row. */ void ScreenOptions::UpdateText( int iRow ) { - OptionRow &row = *m_Rows[iRow]; + OptionRow &row = *m_pRows[iRow]; row.UpdateText(); } void ScreenOptions::UpdateEnabledDisabled( int r ) { - OptionRow &row = *m_Rows[r]; + OptionRow &row = *m_pRows[r]; bool bRowHasFocus[NUM_PLAYERS]; FOREACH_PlayerNumber( pn ) @@ -454,7 +454,7 @@ void ScreenOptions::UpdateEnabledDisabled( int r ) void ScreenOptions::UpdateEnabledDisabled() { - for( unsigned r=0; rGoToPrevScreen(); break; case SM_GoToNextScreen: - for( unsigned r=0; r vpns; FOREACH_HumanPlayer( p ) @@ -551,7 +551,7 @@ void ScreenOptions::PositionItems() int P1Choice = GAMESTATE->IsHumanPlayer(PLAYER_1)? m_iCurrentRow[PLAYER_1]: m_iCurrentRow[PLAYER_2]; int P2Choice = GAMESTATE->IsHumanPlayer(PLAYER_2)? m_iCurrentRow[PLAYER_2]: m_iCurrentRow[PLAYER_1]; - vector Rows( m_Rows ); + vector Rows( m_pRows ); OptionRow *ExitRow = NULL; if( (bool)SEPARATE_EXIT_ROW && Rows.back()->GetRowType() == OptionRow::ROW_EXIT ) @@ -670,14 +670,14 @@ void ScreenOptions::OnChange( PlayerNumber pn ) if( SHOW_SCROLL_BAR ) { float fPercent = 0; - if( m_Rows.size() > 1 ) - fPercent = m_iCurrentRow[pn] / float(m_Rows.size()-1); + if( m_pRows.size() > 1 ) + fPercent = m_iCurrentRow[pn] / float(m_pRows.size()-1); m_ScrollBar.SetPercentage( pn, fPercent ); } /* If the last row is EXIT, and is hidden, then show MORE. */ - const bool ShowMore = m_Rows.back()->GetRowType() == OptionRow::ROW_EXIT && m_Rows.back()->GetRowHidden(); + const bool ShowMore = m_pRows.back()->GetRowType() == OptionRow::ROW_EXIT && m_pRows.back()->GetRowHidden(); if( m_bMoreShown != ShowMore ) { m_bMoreShown = ShowMore; @@ -691,7 +691,7 @@ void ScreenOptions::OnChange( PlayerNumber pn ) TweenCursor( p ); int iCurrentRow = m_iCurrentRow[pn]; - OptionRow &row = *m_Rows[iCurrentRow]; + OptionRow &row = *m_pRows[iCurrentRow]; const bool ExitSelected = row.GetRowType() == OptionRow::ROW_EXIT; if( p == pn || GAMESTATE->GetNumHumanPlayers() == 1 ) { @@ -740,7 +740,7 @@ void ScreenOptions::MenuBack( PlayerNumber pn ) bool ScreenOptions::IsOnLastRow( PlayerNumber pn ) const { int iCurRow = m_iCurrentRow[pn]; - return iCurRow == (int)(m_Rows.size()-1); + return iCurRow == (int)(m_pRows.size()-1); } bool ScreenOptions::AllAreOnLastRow() const @@ -769,7 +769,7 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType type ) } int iCurRow = m_iCurrentRow[pn]; - OptionRow &row = *m_Rows[iCurRow]; + OptionRow &row = *m_pRows[iCurRow]; /* If we are in a three-button mode, check to see if MENU_BUTTON_LEFT and @@ -851,7 +851,7 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType type ) { case NAV_THREE_KEY: // don't wrap - if( iCurRow == (int)m_Rows.size()-1 ) + if( iCurRow == (int)m_pRows.size()-1 ) return; MenuDown( pn, type ); break; @@ -878,7 +878,7 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType type ) case NAV_FIVE_KEY: /* Jump to the exit row. (If everyone's already on the exit row, then * we'll have already gone to the next screen above.) */ - MoveRow( pn, m_Rows.size()-m_iCurrentRow[pn]-1, type != IET_FIRST_PRESS ); + MoveRow( pn, m_pRows.size()-m_iCurrentRow[pn]-1, type != IET_FIRST_PRESS ); break; } } @@ -888,7 +888,7 @@ void ScreenOptions::StoreFocus( PlayerNumber pn ) { /* Long rows always put us in the center, so don't update the focus. */ int iCurrentRow = m_iCurrentRow[pn]; - const OptionRow &row = *m_Rows[iCurrentRow]; + const OptionRow &row = *m_pRows[iCurrentRow]; if( row.GetRowDef().layoutType == LAYOUT_SHOW_ONE_IN_ROW ) return; @@ -905,7 +905,7 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat ) if( iCurRow == -1 ) // no row selected return; // don't allow a move - OptionRow &row = *m_Rows[iCurRow]; + OptionRow &row = *m_pRows[iCurRow]; const int iNumChoices = row.GetRowDef().choices.size(); @@ -1018,7 +1018,7 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat ) void ScreenOptions::MoveRow( PlayerNumber pn, int dir, bool Repeat ) { const int iCurrentRow = m_iCurrentRow[pn]; - OptionRow &row = *m_Rows[iCurrentRow]; + OptionRow &row = *m_pRows[iCurrentRow]; if( row.GetFirstItemGoesDown() ) { @@ -1035,19 +1035,19 @@ void ScreenOptions::MoveRow( PlayerNumber pn, int dir, bool Repeat ) continue; // skip int r = m_iCurrentRow[p] + dir; - if( Repeat && ( r == -1 || r == (int) m_Rows.size() ) ) + if( Repeat && ( r == -1 || r == (int) m_pRows.size() ) ) continue; // don't wrap while repeating - wrap( r, m_Rows.size() ); + wrap( r, m_pRows.size() ); const unsigned iOldSelection = row.GetChoiceInRowWithFocus(p); if( m_iCurrentRow[p] == r ) continue; m_iCurrentRow[p] = r; - ASSERT( r >= 0 && r < (int)m_Rows.size() ); + ASSERT( r >= 0 && r < (int)m_pRows.size() ); - OptionRow &row = *m_Rows[r]; + OptionRow &row = *m_pRows[r]; switch( m_OptionsNavigation ) { @@ -1123,20 +1123,20 @@ void ScreenOptions::MenuUpDown( PlayerNumber pn, const InputEventType type, int bool bRepeat = type != IET_FIRST_PRESS; int iDest = -1; - for( int r=1; r<(int)m_Rows.size(); r++ ) + for( int r=1; r<(int)m_pRows.size(); r++ ) { int iDelta = r*iDir; iDest = m_iCurrentRow[pn] + iDelta; int iOldDest = iDest; - ASSERT( m_Rows.size() ); - wrap( iDest, m_Rows.size() ); + ASSERT( m_pRows.size() ); + wrap( iDest, m_pRows.size() ); // Don't wrap on repeating inputs. bool bWrapped = iOldDest != iDest; if( bRepeat && bWrapped ) return; - OptionRow &row = *m_Rows[iDest]; + OptionRow &row = *m_pRows[iDest]; if( row.GetRowDef().IsEnabledForPlayer(pn) ) { diff --git a/stepmania/src/ScreenOptions.h b/stepmania/src/ScreenOptions.h index e60368ca58..cd82b03215 100644 --- a/stepmania/src/ScreenOptions.h +++ b/stepmania/src/ScreenOptions.h @@ -83,7 +83,7 @@ protected: // derived classes need access to these protected: /* Map menu lines to m_OptionRow entries. */ - vector m_Rows; + vector m_pRows; Navigation m_OptionsNavigation; diff --git a/stepmania/src/ScreenOptionsMaster.cpp b/stepmania/src/ScreenOptionsMaster.cpp index 53cf8a6365..07db7eaf44 100644 --- a/stepmania/src/ScreenOptionsMaster.cpp +++ b/stepmania/src/ScreenOptionsMaster.cpp @@ -99,7 +99,7 @@ void ScreenOptionsMaster::Init() ScreenOptionsMaster::~ScreenOptionsMaster() { - FOREACH( OptionRow*, m_Rows, r ) + FOREACH( OptionRow*, m_pRows, r ) (*r)->DetachHandler(); FOREACH( OptionRowHandler*, OptionRowHandlers, h ) SAFE_DELETE( *h ); @@ -110,13 +110,13 @@ void ScreenOptionsMaster::ImportOptions( int r, const vector &vpns { FOREACH_CONST( PlayerNumber, vpns, pn ) ASSERT( GAMESTATE->IsHumanPlayer(*pn) ); - OptionRow &row = *m_Rows[r]; + OptionRow &row = *m_pRows[r]; row.ImportOptions( vpns ); } void ScreenOptionsMaster::ExportOptions( int r, const vector &vpns ) { - OptionRow &row = *m_Rows[r]; + OptionRow &row = *m_pRows[r]; bool bRowHasFocus[NUM_PLAYERS]; ZERO( bRowHasFocus ); FOREACH_CONST( PlayerNumber, vpns, p ) @@ -134,8 +134,8 @@ void ScreenOptionsMaster::BeginFadingOut() m_bExportWillSetANewScreen = false; int iCurRow = this->GetCurrentRow(); - ASSERT( iCurRow >= 0 && iCurRow < (int)m_Rows.size() ); - OptionRow &row = *m_Rows[iCurRow]; + ASSERT( iCurRow >= 0 && iCurRow < (int)m_pRows.size() ); + OptionRow &row = *m_pRows[iCurRow]; if( row.GetRowType() != OptionRow::ROW_EXIT ) { @@ -181,7 +181,7 @@ void ScreenOptionsMaster::GoToPrevScreen() void ScreenOptionsMaster::RefreshIcons( int r, PlayerNumber pn ) { - OptionRow &row = *m_Rows[r]; + OptionRow &row = *m_pRows[r]; if( row.GetRowType() == OptionRow::ROW_EXIT ) return; // skip diff --git a/stepmania/src/ScreenPlayerOptions.cpp b/stepmania/src/ScreenPlayerOptions.cpp index e85d45fdcb..3fc00637e6 100644 --- a/stepmania/src/ScreenPlayerOptions.cpp +++ b/stepmania/src/ScreenPlayerOptions.cpp @@ -67,8 +67,8 @@ void ScreenPlayerOptions::Init() FOREACH_HumanPlayer( p ) { - m_bRowCausesDisqualified[p].resize( m_Rows.size(), false ); - for( unsigned r=0; r v; v.push_back( pn ); diff --git a/stepmania/src/ScreenProfileOptions.cpp b/stepmania/src/ScreenProfileOptions.cpp index d3c3987a01..98219faad4 100644 --- a/stepmania/src/ScreenProfileOptions.cpp +++ b/stepmania/src/ScreenProfileOptions.cpp @@ -100,7 +100,7 @@ void ScreenProfileOptions::ImportOptions( int row, const vector &v vsProfiles.end(), PREFSMAN->GetDefaultLocalProfileID(pn).Get() ); if( iter != vsProfiles.end() ) - m_Rows[row]->SetOneSharedSelection( iter - vsProfiles.begin() + 1 ); + m_pRows[row]->SetOneSharedSelection( iter - vsProfiles.begin() + 1 ); } break; } @@ -117,8 +117,8 @@ void ScreenProfileOptions::ExportOptions( int row, const vector &v vector vsProfiles; PROFILEMAN->GetLocalProfileIDs( vsProfiles ); - if( m_Rows[row]->GetOneSharedSelection() > 0 ) - PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_Rows[row]->GetOneSharedSelection()-1] ); + if( m_pRows[row]->GetOneSharedSelection() > 0 ) + PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_pRows[row]->GetOneSharedSelection()-1] ); else PREFSMAN->GetDefaultLocalProfileID(pn).Set( "" ); } @@ -222,7 +222,7 @@ CString ScreenProfileOptions::GetSelectedProfileID() vector vsProfiles; PROFILEMAN->GetLocalProfileIDs( vsProfiles ); - const OptionRow &row = *m_Rows[GetCurrentRow()]; + const OptionRow &row = *m_pRows[GetCurrentRow()]; const int Selection = row.GetOneSharedSelection(); if( !Selection ) return ""; @@ -231,7 +231,7 @@ CString ScreenProfileOptions::GetSelectedProfileID() CString ScreenProfileOptions::GetSelectedProfileName() { - const OptionRow &row = *m_Rows[GetCurrentRow()]; + const OptionRow &row = *m_pRows[GetCurrentRow()]; const int Selection = row.GetOneSharedSelection(); if( !Selection ) return ""; diff --git a/stepmania/src/ScreenSMOnlineLogin.cpp b/stepmania/src/ScreenSMOnlineLogin.cpp index 4b25f125cd..a65cdd792a 100644 --- a/stepmania/src/ScreenSMOnlineLogin.cpp +++ b/stepmania/src/ScreenSMOnlineLogin.cpp @@ -52,7 +52,7 @@ void ScreenSMOnlineLogin::Init() InitMenu( INPUTMODE_SHARE_CURSOR, vDefs, vHands ); SOUND->PlayMusic( THEME->GetPathS("ScreenMachineOptions", "music")); - OptionRow &row = *m_Rows.back(); + OptionRow &row = *m_pRows.back(); row.SetExitText("Login"); } } @@ -72,7 +72,7 @@ void ScreenSMOnlineLogin::ImportOptions( int row, const vector &vp { iter = find(vsProfiles.begin(), vsProfiles.end(), PREFSMAN->GetDefaultLocalProfileID(pn).Get() ); if( iter != vsProfiles.end() ) - m_Rows[0]->SetOneSelection((PlayerNumber) pn, iter - vsProfiles.begin()); + m_pRows[0]->SetOneSelection((PlayerNumber) pn, iter - vsProfiles.begin()); } } break; @@ -89,7 +89,7 @@ void ScreenSMOnlineLogin::ExportOptions( int row, const vector &vp PROFILEMAN->GetLocalProfileIDs( vsProfiles ); FOREACH_EnabledPlayer( pn ) - PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_Rows[0]->GetOneSelection(pn)] ); + PREFSMAN->GetDefaultLocalProfileID(pn).Set( vsProfiles[m_pRows[0]->GetOneSelection(pn)] ); } break; } @@ -104,7 +104,7 @@ void ScreenSMOnlineLogin::GoToNextScreen() { vector v; v.push_back( GAMESTATE->m_MasterPlayerNumber ); - for( unsigned r=0; rSaveGlobalPrefsToDisk(); @@ -172,7 +172,7 @@ CString ScreenSMOnlineLogin::GetSelectedProfileID() vector vsProfiles; PROFILEMAN->GetLocalProfileIDs( vsProfiles ); - const OptionRow &row = *m_Rows[GetCurrentRow()]; + const OptionRow &row = *m_pRows[GetCurrentRow()]; const int Selection = row.GetOneSharedSelection(); if( !Selection ) return ""; diff --git a/stepmania/src/ScreenSelectGroup.cpp b/stepmania/src/ScreenSelectGroup.cpp index c3cb2f9ad0..5b45f7ec52 100644 --- a/stepmania/src/ScreenSelectGroup.cpp +++ b/stepmania/src/ScreenSelectGroup.cpp @@ -32,7 +32,7 @@ void ScreenSelectGroup::Init() { if( !PREFSMAN->m_bShowSelectGroup ) { - GAMESTATE->m_sPreferredSongGroup = GROUP_ALL_MUSIC; + GAMESTATE->m_sPreferredSongGroup.Set( GROUP_ALL_MUSIC ); HandleScreenMessage( SM_GoToNextScreen ); return; } @@ -172,7 +172,7 @@ void ScreenSelectGroup::AfterChange() if( sSelectedGroupName == "ALL MUSIC" ) m_Banner.LoadAllMusic(); else - m_Banner.LoadFromGroup( sSelectedGroupName ); + m_Banner.LoadFromSongGroup( sSelectedGroupName ); const int iNumSongs = m_MusicList.GetNumSongs(); m_textNumber.SetText( ssprintf("%d", iNumSongs) ); @@ -224,7 +224,7 @@ void ScreenSelectGroup::MenuStart( PlayerNumber pn ) m_bChosen = true; GAMESTATE->m_pCurSong.Set( NULL ); - GAMESTATE->m_sPreferredSongGroup = (m_GroupList.GetSelectionName()=="ALL MUSIC" ? GROUP_ALL_MUSIC : m_GroupList.GetSelectionName() ); + GAMESTATE->m_sPreferredSongGroup.Set( m_GroupList.GetSelectionName()=="ALL MUSIC" ? GROUP_ALL_MUSIC : m_GroupList.GetSelectionName() ); if( GAMESTATE->m_sPreferredSongGroup == GROUP_ALL_MUSIC ) SOUND->PlayOnceFromAnnouncer( "select group comment all music" ); diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index abdc10d0e4..5f957ab47b 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -1582,7 +1582,7 @@ void ScreenSelectMusic::AfterMusicChange() switch( m_MusicWheel.GetSelectedType() ) { case TYPE_SECTION: - g_sBannerPath = SONGMAN->GetGroupBannerPath( sGroup ); + g_sBannerPath = SONGMAN->GetSongGroupBannerPath( sGroup ); m_sSampleMusicToPlay = m_sSectionMusicPath; break; case TYPE_SORT: diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index 1744acc1d8..dd07ebcdf6 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -70,7 +70,7 @@ void ScreenTitleMenu::Init() m_textSongs.LoadFromFont( THEME->GetPathF("Common","normal") ); m_textSongs.SetName( "Songs" ); - CString text = ssprintf("%d songs in %d groups, %d courses", SONGMAN->GetNumSongs(), SONGMAN->GetNumGroups(), SONGMAN->GetNumCourses() ); + CString text = ssprintf("%d songs in %d groups, %d courses in %d groups", SONGMAN->GetNumSongs(), SONGMAN->GetNumSongGroups(), SONGMAN->GetNumCourses(), SONGMAN->GetNumCourseGroups() ); if( PREFSMAN->m_bUseUnlockSystem ) text += ssprintf(", %d unlocks", UNLOCKMAN->GetNumUnlocks() ); m_textSongs.SetText( text ); diff --git a/stepmania/src/SongManager.cpp b/stepmania/src/SongManager.cpp index 18c71d5a34..a5cde1d34a 100644 --- a/stepmania/src/SongManager.cpp +++ b/stepmania/src/SongManager.cpp @@ -171,19 +171,18 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld ) CStringArray arrayGroupDirs; GetDirListing( sDir+"*", arrayGroupDirs, true ); SortCStringArray( arrayGroupDirs ); + StripCvs( arrayGroupDirs ); - for( unsigned i=0; i< arrayGroupDirs.size(); i++ ) // for each dir in /Songs/ + FOREACH_CONST( CString, arrayGroupDirs, s ) // foreach dir in /Songs/ { - CString sGroupDirName = arrayGroupDirs[i]; - - if( 0 == stricmp( sGroupDirName, "cvs" ) ) // the directory called "CVS" - continue; // ignore it + CString sGroupDirName = *s; SanityCheckGroupDir(sDir+sGroupDirName); // Find all Song folders in this group directory CStringArray arraySongDirs; GetDirListing( sDir+sGroupDirName + "/*", arraySongDirs, true, true ); + StripCvs( arraySongDirs ); SortCStringArray( arraySongDirs ); LOG->Trace("Attempting to load %i songs from \"%s\"", int(arraySongDirs.size()), @@ -194,9 +193,6 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld ) { CString sSongDirName = arraySongDirs[j]; - if( 0 == stricmp( Basename(sSongDirName), "cvs" ) ) // the directory called "CVS" - continue; // ignore it - // this is a song directory. Load a new song! if( ld ) { @@ -226,7 +222,7 @@ void SongManager::LoadStepManiaSongDir( CString sDir, LoadingWindow *ld ) AddGroup(sDir, sGroupDirName); /* Cache and load the group banner. */ - BANNERCACHE->CacheBanner( GetGroupBannerPath(sGroupDirName) ); + BANNERCACHE->CacheBanner( GetSongGroupBannerPath(sGroupDirName) ); /* Load the group sym links (if any)*/ LoadGroupSymLinks(sDir, sGroupDirName); @@ -312,44 +308,38 @@ void SongManager::FreeSongs() m_pShuffledSongs.clear(); } -CString SongManager::GetGroupBannerPath( CString sGroupName ) +CString SongManager::GetSongGroupBannerPath( CString sSongGroup ) { - unsigned i; - for(i = 0; i < m_sSongGroupNames.size(); ++i) - if( sGroupName == m_sSongGroupNames[i] ) break; + for( unsigned i = 0; i < m_sSongGroupNames.size(); ++i ) + { + if( sSongGroup == m_sSongGroupNames[i] ) + return m_sSongGroupBannerPaths[i]; + } - if( i == m_sSongGroupNames.size() ) - return ""; - - return m_sSongGroupBannerPaths[i]; + ASSERT_M( 0, ssprintf("requested banner for song group '%s' that doesn't exist",sSongGroup.c_str()) ); + return ""; } -void SongManager::GetGroupNames( CStringArray &AddTo ) +void SongManager::GetSongGroupNames( CStringArray &AddTo ) { AddTo.insert(AddTo.end(), m_sSongGroupNames.begin(), m_sSongGroupNames.end() ); } -bool SongManager::DoesGroupExist( CString sGroupName ) +bool SongManager::DoesSongGroupExist( CString sSongGroup ) { - for( unsigned i = 0; i < m_sSongGroupNames.size(); ++i ) - if( !m_sSongGroupNames[i].CompareNoCase(sGroupName) ) - return true; - - return false; + return find( m_sSongGroupNames.begin(), m_sSongGroupNames.end(), sSongGroup ) != m_sSongGroupNames.end(); } -RageColor SongManager::GetSongGroupColor( const CString &sSongGroupName ) +RageColor SongManager::GetSongGroupColor( const CString &sSongGroup ) { - // search for the group index - unsigned i; - for( i=0; im_sGroupName ); } -RageColor SongManager::GetCourseGroupColor( const CString &sCourseGroupName ) +CString SongManager::GetCourseGroupBannerPath( CString sCourseGroup ) { - // search for the group index - unsigned i; - for( i=0; i::iterator eraseme = sCourseGroup; - sCourseGroup--; - m_sCourseGroupNames.erase( eraseme ); - continue; // ignore it - } - // Find all CRS files in this group directory CStringArray vsCoursePaths; GetDirListing( COURSES_DIR + *sCourseGroup + "/*.crs", vsCoursePaths, false, true ); @@ -574,7 +587,7 @@ void SongManager::InitAutogenCourses() // Create group courses for Endless and Nonstop // CStringArray saGroupNames; - this->GetGroupNames( saGroupNames ); + this->GetSongGroupNames( saGroupNames ); Course* pCourse; for( unsigned g=0; g m_pBestCourses[NUM_PROFILE_SLOTS][NUM_COURSE_TYPES]; vector m_pShuffledCourses; // used by GetRandomCourse CStringArray m_sCourseGroupNames; + CStringArray m_sCourseGroupBannerPaths; // each song group may have a banner associated with it ThemeMetric NUM_SONG_GROUP_COLORS; diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index d47a1b9ae6..9b113fe149 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -141,15 +141,7 @@ ThemeManager::~ThemeManager() void ThemeManager::GetThemeNames( CStringArray& AddTo ) { GetDirListing( THEMES_DIR + "*", AddTo, true ); - - // strip out the folder called "CVS" - for( CStringArray::iterator i=AddTo.begin(); i != AddTo.end(); ++i ) - { - if( *i == "CVS" ) { - AddTo.erase(i, i+1); - break; - } - } + StripCvs( AddTo ); } bool ThemeManager::DoesThemeExist( const CString &sThemeName )