From a79329daa3dc6e8fa641c52058db3190bdea4219 Mon Sep 17 00:00:00 2001 From: Steve Checkoway Date: Sat, 18 Mar 2006 11:28:41 +0000 Subject: [PATCH] Only rebuild the option rows when they've actually changed. --- stepmania/src/ScreenOptionsManageCourses.cpp | 103 +++++++++++-------- stepmania/src/ScreenOptionsManageCourses.h | 6 +- 2 files changed, 63 insertions(+), 46 deletions(-) diff --git a/stepmania/src/ScreenOptionsManageCourses.cpp b/stepmania/src/ScreenOptionsManageCourses.cpp index d9ba0b9686..8978ef288d 100644 --- a/stepmania/src/ScreenOptionsManageCourses.cpp +++ b/stepmania/src/ScreenOptionsManageCourses.cpp @@ -163,19 +163,13 @@ void ScreenOptionsManageCourses::Init() EDIT_MODE.Load( m_sName,"EditMode" ); GAMESTATE->m_MasterPlayerNumber = GAMESTATE->GetFirstHumanPlayer(); + RebuildOptionRows(); } -void ScreenOptionsManageCourses::BeginScreen() +void ScreenOptionsManageCourses::RebuildOptionRows() { - if( GAMESTATE->m_stEdit == STEPS_TYPE_INVALID || - GAMESTATE->m_cdEdit == DIFFICULTY_INVALID ) - { - SetNextCombination(); - } - - vector vHands; - + int iIndex = 0; { @@ -187,48 +181,50 @@ void ScreenOptionsManageCourses::BeginScreen() def.m_vsChoices.push_back( "Create New" ); iIndex++; } - + + m_vpCourses.clear(); SONGMAN->GetAllCourses( m_vpCourses, false ); - + switch( EDIT_MODE.GetValue() ) { - default: - ASSERT(0); - case EditMode_Practice: - case EditMode_Home: - // Strip out non-edits. - // VC6 is missing mem_fun for const members. Lame. Work around by not using mem_fun. */ - for( int i=m_vpCourses.size()-1; i>=0; i-- ) - { - if( m_vpCourses[i]->IsAnEdit() ) - m_vpCourses.erase( m_vpCourses.begin()+i ); - } - break; - case EditMode_Full: - break; + default: + RageException::Throw( "ScreenOptionsManageCourses: Invalid edit mode:", + EditModeToString(EDIT_MODE.GetValue()).c_str() ); + case EditMode_Practice: + case EditMode_Home: + // Strip out non-edits. + // VC6 is missing mem_fun for const members. Lame. Work around by not using mem_fun. */ + for( int i=m_vpCourses.size()-1; i>=0; i-- ) + { + if( m_vpCourses[i]->IsAnEdit() ) + m_vpCourses.erase( m_vpCourses.begin()+i ); + } + break; + case EditMode_Full: + break; } - + FOREACH_CONST( Course*, m_vpCourses, c ) { vHands.push_back( OptionRowHandlerUtil::MakeNull() ); OptionRowDefinition &def = vHands.back()->m_Def; - + switch( EDIT_MODE.GetValue() ) { - default: - ASSERT(0); - case EditMode_Practice: - case EditMode_Home: - def.m_sName = CourseTypeToLocalizedString( (*c)->GetCourseType() ); - break; - case EditMode_Full: - if( (*c)->IsAnEdit() ) - def.m_sName = "Edit"; - else - def.m_sName = SONGMAN->ShortenGroupName( (*c)->m_sGroupName ); - break; + default: + ASSERT(0); + case EditMode_Practice: + case EditMode_Home: + def.m_sName = CourseTypeToLocalizedString( (*c)->GetCourseType() ); + break; + case EditMode_Full: + if( (*c)->IsAnEdit() ) + def.m_sName = "Edit"; + else + def.m_sName = SONGMAN->ShortenGroupName( (*c)->m_sGroupName ); + break; } - + def.m_sName = ssprintf( "%3d %s", iIndex, def.m_sName.c_str() ); def.m_layoutType = LAYOUT_SHOW_ONE_IN_ROW; def.m_bAllowThemeItems = false; @@ -237,8 +233,21 @@ void ScreenOptionsManageCourses::BeginScreen() def.m_vsChoices.push_back( (*c)->GetDisplayFullTitle() ); iIndex++; } - + ScreenOptions::InitMenu( vHands ); + m_bForceRebuild = false; +} + +void ScreenOptionsManageCourses::BeginScreen() +{ + if( GAMESTATE->m_stEdit == STEPS_TYPE_INVALID || + GAMESTATE->m_cdEdit == DIFFICULTY_INVALID ) + { + SetNextCombination(); + } + + if( m_bForceRebuild ) + RebuildOptionRows(); ScreenOptions::BeginScreen(); @@ -256,6 +265,12 @@ void ScreenOptionsManageCourses::BeginScreen() AfterChangeRow( GAMESTATE->m_MasterPlayerNumber ); } +void ScreenOptionsManageCourses::ReloadScreen() +{ + m_bForceRebuild = true; + ScreenOptionsEditCourseSubMenu::ReloadScreen(); +} + static LocalizedString COURSE_WILL_BE_LOST ( "ScreenOptionsManageCourses", "This course will be lost permanently." ); static LocalizedString CONTINUE_WITH_DELETE ( "ScreenOptionsManageCourses", "Continue with delete?" ); static LocalizedString ENTER_COURSE_NAME ( "ScreenOptionsManageCourses", "Enter a name for the course." ); @@ -273,7 +288,7 @@ void ScreenOptionsManageCourses::HandleScreenMessage( const ScreenMessage SM ) if( !pCourse->IsAnEdit() ) FILEMAN->Remove( pCourse->GetCacheFilePath() ); delete pCourse; - SCREENMAN->SetNewScreen( this->m_sName ); // reload + ReloadScreen(); } else if( SM == SM_Failure ) { @@ -325,7 +340,7 @@ void ScreenOptionsManageCourses::HandleScreenMessage( const ScreenMessage SM ) WriteCourse(); RefreshTrail(); - + m_bForceRebuild = true; this->HandleScreenMessage( SM_GoToNextScreen ); } } @@ -347,7 +362,7 @@ void ScreenOptionsManageCourses::HandleScreenMessage( const ScreenMessage SM ) pCourse->m_sPath = sDir + sNewName + sExt; pCourse->m_sMainTitle = sNewName; WriteCourse(); - SCREENMAN->SetNewScreen( this->m_sName ); // reload + ReloadScreen(); } } else if( SM == SM_BackFromContextMenu ) diff --git a/stepmania/src/ScreenOptionsManageCourses.h b/stepmania/src/ScreenOptionsManageCourses.h index 6ec247922a..4d60ddd1fb 100644 --- a/stepmania/src/ScreenOptionsManageCourses.h +++ b/stepmania/src/ScreenOptionsManageCourses.h @@ -24,7 +24,7 @@ class ScreenOptionsManageCourses : public ScreenOptionsEditCourseSubMenu public: void Init(); virtual void BeginScreen(); - + virtual void ReloadScreen(); virtual void HandleScreenMessage( const ScreenMessage SM ); protected: @@ -34,11 +34,13 @@ protected: virtual void AfterChangeRow( PlayerNumber pn ); virtual void ProcessMenuStart( const InputEventPlus &input ); +private: Course *GetCourseWithFocus() const; + void RebuildOptionRows(); vector m_vpCourses; ThemeMetricEnum EDIT_MODE; - + bool m_bForceRebuild; }; #endif