diff --git a/stepmania/src/OptionRow.cpp b/stepmania/src/OptionRow.cpp index 65d004ad05..97ebb620ad 100644 --- a/stepmania/src/OptionRow.cpp +++ b/stepmania/src/OptionRow.cpp @@ -64,6 +64,7 @@ void OptionRow::Clear() ASSERT( m_pHand == NULL ); m_bFirstItemGoesDown = false; + ZERO( m_bRowHasFocus ); } void OptionRow::DetachHandler() @@ -118,8 +119,8 @@ void OptionRow::LoadNormal( const OptionRowDefinition &def, OptionRowHandler *pH { vector &vbSelected = m_vbSelected[p]; vbSelected.resize( m_RowDef.choices.size() ); - for( unsigned j=0; jStopTweening(); - m_textItems[j]->BeginTweening( fTweenSeconds ); + m_textItems[j]->BeginTweening( TWEEN_SECONDS ); m_textItems[j]->SetDiffuseAlpha( fDiffuseAlpha ); m_textItems[j]->SetY( m_fY ); } @@ -518,7 +524,7 @@ void OptionRow::UpdateEnabledDisabled( { bool bRowEnabled = m_RowDef.m_vEnabledForPlayers.find(pn) != m_RowDef.m_vEnabledForPlayers.end(); - if( bThisRowHasFocus[pn] ) + if( m_bRowHasFocus[pn] ) color = COLOR_SELECTED; else if( bRowEnabled ) color = COLOR_NOT_SELECTED; @@ -537,14 +543,14 @@ void OptionRow::UpdateEnabledDisabled( if( bt.GetDestY() != m_fY || bt.DestTweenState().diffuse[0] != color ) { bt.StopTweening(); - bt.BeginTweening( fTweenSeconds ); + bt.BeginTweening( TWEEN_SECONDS ); bt.SetDiffuse( color ); bt.SetY( m_fY ); FOREACH_HumanPlayer( p ) { OptionsCursor &ul = *m_Underline[p][item_no]; ul.StopTweening(); - ul.BeginTweening( fTweenSeconds ); + ul.BeginTweening( TWEEN_SECONDS ); ul.SetDiffuseAlpha( color.a ); ul.SetY( m_fY ); } @@ -567,8 +573,8 @@ void OptionRow::UpdateEnabledDisabled( { m_sprBullet.StopTweening(); m_textTitle.StopTweening(); - m_sprBullet.BeginTweening( fTweenSeconds ); - m_textTitle.BeginTweening( fTweenSeconds ); + m_sprBullet.BeginTweening( TWEEN_SECONDS ); + m_textTitle.BeginTweening( TWEEN_SECONDS ); m_sprBullet.SetDiffuseAlpha( m_bHidden? 0.0f:1.0f ); m_textTitle.SetDiffuseAlpha( m_bHidden? 0.0f:1.0f ); m_sprBullet.SetY( m_fY ); @@ -664,20 +670,20 @@ void OptionRow::Reload() if( m_pHand == NULL ) return; - ExportOptions(); + if( m_RowDef.m_bExportOnChange ) + ExportOptions(); - OptionRowDefinition def; - m_pHand->Reload( def ); + m_pHand->Reload( m_RowDef ); ASSERT( !m_RowDef.choices.empty() ); - m_RowDef = def; FOREACH_PlayerNumber( p ) m_vbSelected[p].resize( m_RowDef.choices.size(), false ); + ImportOptions(); + + UpdateEnabledDisabled(); UpdateText(); PositionUnderlines(); - - ImportOptions(); } break; case OptionRow::ROW_EXIT: @@ -702,14 +708,16 @@ void OptionRow::HandleMessage( const CString& sMessage ) #define INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( vbSelected ) \ if( GetFirstItemGoesDown() ) \ vbSelected.insert( vbSelected.begin(), false ); -#define VERIFY_SELECTED( vbSelected ) if( m_RowDef.selectType == SELECT_ONE ) VerifyOneSelected(vbSelected); -static void VerifyOneSelected( const vector vbSelected ) +static void VerifySelected( SelectType st, const vector vbSelected ) { int iNumSelected = 0; - for( unsigned e = 0; e < vbSelected.size(); ++e ) - if( vbSelected[e] ) - iNumSelected++; - ASSERT( iNumSelected == 1 ); + if( st == SELECT_ONE ) + { + for( unsigned e = 0; e < vbSelected.size(); ++e ) + if( vbSelected[e] ) + iNumSelected++; + ASSERT( iNumSelected == 1 ); + } } void OptionRow::ImportOptions() @@ -722,13 +730,15 @@ void OptionRow::ImportOptions() FOREACH( bool, m_vbSelected[p], b ) *b = false; + ASSERT( m_RowDef.choices.size() > 0 ); + if( m_RowDef.bOneChoiceForAllPlayers ) { ASSERT( m_vbSelected[0].size() == m_RowDef.choices.size() ); ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[0] ); m_pHand->ImportOption( m_RowDef, PLAYER_1, m_vbSelected[0] ); INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[0] ); - VERIFY_SELECTED( m_vbSelected[0] ); + VerifySelected( m_RowDef.selectType, m_vbSelected[0] ); } else { @@ -738,7 +748,7 @@ void OptionRow::ImportOptions() ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] ); m_pHand->ImportOption( m_RowDef, p, m_vbSelected[p] ); INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] ); - VERIFY_SELECTED( m_vbSelected[p] ); + VerifySelected( m_RowDef.selectType, m_vbSelected[p] ); } } } diff --git a/stepmania/src/OptionRow.h b/stepmania/src/OptionRow.h index 129b5c8eb8..a72082d59a 100644 --- a/stepmania/src/OptionRow.h +++ b/stepmania/src/OptionRow.h @@ -100,9 +100,8 @@ public: void PositionUnderlines(); void PositionIcons(); void UpdateText(); - void UpdateEnabledDisabled( - bool bThisRowHasFocus[NUM_PLAYERS], - float fTweenSeconds ); + void SetRowFocus( bool bRowHasFocus[NUM_PLAYERS] ); + void UpdateEnabledDisabled(); int GetOneSelection( PlayerNumber pn, bool bAllowFail=false ) const; int GetOneSharedSelection() const; @@ -154,6 +153,7 @@ protected: BitmapText m_textTitle; OptionIcon m_OptionIcons[NUM_PLAYERS]; bool m_bFirstItemGoesDown; + bool m_bRowHasFocus[NUM_PLAYERS]; float m_fY; bool m_bHidden; // currently off screen diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index 7d136275a7..50f8e4717b 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -462,9 +462,8 @@ void ScreenOptions::UpdateEnabledDisabled( int r ) FOREACH_PlayerNumber( pn ) bRowHasFocus[pn] = GAMESTATE->IsHumanPlayer(pn) && m_iCurrentRow[pn] == (int)r; - row.UpdateEnabledDisabled( - bRowHasFocus, - TWEEN_SECONDS ); + row.SetRowFocus( bRowHasFocus ); + row.UpdateEnabledDisabled(); } void ScreenOptions::UpdateEnabledDisabled()