have OptionRow save focus state for easier reloading
This commit is contained in:
+32
-22
@@ -64,6 +64,7 @@ void OptionRow::Clear()
|
|||||||
ASSERT( m_pHand == NULL );
|
ASSERT( m_pHand == NULL );
|
||||||
|
|
||||||
m_bFirstItemGoesDown = false;
|
m_bFirstItemGoesDown = false;
|
||||||
|
ZERO( m_bRowHasFocus );
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionRow::DetachHandler()
|
void OptionRow::DetachHandler()
|
||||||
@@ -118,8 +119,8 @@ void OptionRow::LoadNormal( const OptionRowDefinition &def, OptionRowHandler *pH
|
|||||||
{
|
{
|
||||||
vector<bool> &vbSelected = m_vbSelected[p];
|
vector<bool> &vbSelected = m_vbSelected[p];
|
||||||
vbSelected.resize( m_RowDef.choices.size() );
|
vbSelected.resize( m_RowDef.choices.size() );
|
||||||
for( unsigned j=0; j<vbSelected.size(); j++ )
|
FOREACH( bool, vbSelected, b )
|
||||||
vbSelected[j] = false;
|
*b = false;
|
||||||
|
|
||||||
// set select the first item if a SELECT_ONE row
|
// set select the first item if a SELECT_ONE row
|
||||||
if( m_RowDef.selectType == SELECT_ONE )
|
if( m_RowDef.selectType == SELECT_ONE )
|
||||||
@@ -471,23 +472,28 @@ void OptionRow::UpdateText()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionRow::UpdateEnabledDisabled(
|
void OptionRow::SetRowFocus( bool bRowHasFocus[NUM_PLAYERS] )
|
||||||
bool bThisRowHasFocus[NUM_PLAYERS],
|
{
|
||||||
float fTweenSeconds )
|
FOREACH_PlayerNumber( p )
|
||||||
|
m_bRowHasFocus[p] = bRowHasFocus[p];
|
||||||
|
}
|
||||||
|
|
||||||
|
void OptionRow::UpdateEnabledDisabled()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
COLOR_SELECTED,
|
COLOR_SELECTED,
|
||||||
COLOR_NOT_SELECTED,
|
COLOR_NOT_SELECTED,
|
||||||
COLOR_DISABLED,
|
COLOR_DISABLED,
|
||||||
|
TWEEN_SECONDS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool bThisRowHasFocusByAny = false;
|
bool bThisRowHasFocusByAny = false;
|
||||||
FOREACH_HumanPlayer( p )
|
FOREACH_HumanPlayer( p )
|
||||||
bThisRowHasFocusByAny |= bThisRowHasFocus[p];
|
bThisRowHasFocusByAny |= m_bRowHasFocus[p];
|
||||||
|
|
||||||
bool bThisRowHasFocusByAll = true;
|
bool bThisRowHasFocusByAll = true;
|
||||||
FOREACH_HumanPlayer( p )
|
FOREACH_HumanPlayer( p )
|
||||||
bThisRowHasFocusByAll &= bThisRowHasFocus[p];
|
bThisRowHasFocusByAll &= m_bRowHasFocus[p];
|
||||||
|
|
||||||
float fDiffuseAlpha = m_bHidden? 0.0f:1.0f;
|
float fDiffuseAlpha = m_bHidden? 0.0f:1.0f;
|
||||||
|
|
||||||
@@ -508,7 +514,7 @@ void OptionRow::UpdateEnabledDisabled(
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
m_textItems[j]->StopTweening();
|
m_textItems[j]->StopTweening();
|
||||||
m_textItems[j]->BeginTweening( fTweenSeconds );
|
m_textItems[j]->BeginTweening( TWEEN_SECONDS );
|
||||||
m_textItems[j]->SetDiffuseAlpha( fDiffuseAlpha );
|
m_textItems[j]->SetDiffuseAlpha( fDiffuseAlpha );
|
||||||
m_textItems[j]->SetY( m_fY );
|
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();
|
bool bRowEnabled = m_RowDef.m_vEnabledForPlayers.find(pn) != m_RowDef.m_vEnabledForPlayers.end();
|
||||||
|
|
||||||
if( bThisRowHasFocus[pn] )
|
if( m_bRowHasFocus[pn] )
|
||||||
color = COLOR_SELECTED;
|
color = COLOR_SELECTED;
|
||||||
else if( bRowEnabled )
|
else if( bRowEnabled )
|
||||||
color = COLOR_NOT_SELECTED;
|
color = COLOR_NOT_SELECTED;
|
||||||
@@ -537,14 +543,14 @@ void OptionRow::UpdateEnabledDisabled(
|
|||||||
if( bt.GetDestY() != m_fY || bt.DestTweenState().diffuse[0] != color )
|
if( bt.GetDestY() != m_fY || bt.DestTweenState().diffuse[0] != color )
|
||||||
{
|
{
|
||||||
bt.StopTweening();
|
bt.StopTweening();
|
||||||
bt.BeginTweening( fTweenSeconds );
|
bt.BeginTweening( TWEEN_SECONDS );
|
||||||
bt.SetDiffuse( color );
|
bt.SetDiffuse( color );
|
||||||
bt.SetY( m_fY );
|
bt.SetY( m_fY );
|
||||||
FOREACH_HumanPlayer( p )
|
FOREACH_HumanPlayer( p )
|
||||||
{
|
{
|
||||||
OptionsCursor &ul = *m_Underline[p][item_no];
|
OptionsCursor &ul = *m_Underline[p][item_no];
|
||||||
ul.StopTweening();
|
ul.StopTweening();
|
||||||
ul.BeginTweening( fTweenSeconds );
|
ul.BeginTweening( TWEEN_SECONDS );
|
||||||
ul.SetDiffuseAlpha( color.a );
|
ul.SetDiffuseAlpha( color.a );
|
||||||
ul.SetY( m_fY );
|
ul.SetY( m_fY );
|
||||||
}
|
}
|
||||||
@@ -567,8 +573,8 @@ void OptionRow::UpdateEnabledDisabled(
|
|||||||
{
|
{
|
||||||
m_sprBullet.StopTweening();
|
m_sprBullet.StopTweening();
|
||||||
m_textTitle.StopTweening();
|
m_textTitle.StopTweening();
|
||||||
m_sprBullet.BeginTweening( fTweenSeconds );
|
m_sprBullet.BeginTweening( TWEEN_SECONDS );
|
||||||
m_textTitle.BeginTweening( fTweenSeconds );
|
m_textTitle.BeginTweening( TWEEN_SECONDS );
|
||||||
m_sprBullet.SetDiffuseAlpha( m_bHidden? 0.0f:1.0f );
|
m_sprBullet.SetDiffuseAlpha( m_bHidden? 0.0f:1.0f );
|
||||||
m_textTitle.SetDiffuseAlpha( m_bHidden? 0.0f:1.0f );
|
m_textTitle.SetDiffuseAlpha( m_bHidden? 0.0f:1.0f );
|
||||||
m_sprBullet.SetY( m_fY );
|
m_sprBullet.SetY( m_fY );
|
||||||
@@ -664,20 +670,20 @@ void OptionRow::Reload()
|
|||||||
if( m_pHand == NULL )
|
if( m_pHand == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if( m_RowDef.m_bExportOnChange )
|
||||||
ExportOptions();
|
ExportOptions();
|
||||||
|
|
||||||
OptionRowDefinition def;
|
m_pHand->Reload( m_RowDef );
|
||||||
m_pHand->Reload( def );
|
|
||||||
ASSERT( !m_RowDef.choices.empty() );
|
ASSERT( !m_RowDef.choices.empty() );
|
||||||
|
|
||||||
m_RowDef = def;
|
|
||||||
FOREACH_PlayerNumber( p )
|
FOREACH_PlayerNumber( p )
|
||||||
m_vbSelected[p].resize( m_RowDef.choices.size(), false );
|
m_vbSelected[p].resize( m_RowDef.choices.size(), false );
|
||||||
|
|
||||||
|
ImportOptions();
|
||||||
|
|
||||||
|
UpdateEnabledDisabled();
|
||||||
UpdateText();
|
UpdateText();
|
||||||
PositionUnderlines();
|
PositionUnderlines();
|
||||||
|
|
||||||
ImportOptions();
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OptionRow::ROW_EXIT:
|
case OptionRow::ROW_EXIT:
|
||||||
@@ -702,14 +708,16 @@ void OptionRow::HandleMessage( const CString& sMessage )
|
|||||||
#define INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( vbSelected ) \
|
#define INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( vbSelected ) \
|
||||||
if( GetFirstItemGoesDown() ) \
|
if( GetFirstItemGoesDown() ) \
|
||||||
vbSelected.insert( vbSelected.begin(), false );
|
vbSelected.insert( vbSelected.begin(), false );
|
||||||
#define VERIFY_SELECTED( vbSelected ) if( m_RowDef.selectType == SELECT_ONE ) VerifyOneSelected(vbSelected);
|
static void VerifySelected( SelectType st, const vector<bool> vbSelected )
|
||||||
static void VerifyOneSelected( const vector<bool> vbSelected )
|
|
||||||
{
|
{
|
||||||
int iNumSelected = 0;
|
int iNumSelected = 0;
|
||||||
|
if( st == SELECT_ONE )
|
||||||
|
{
|
||||||
for( unsigned e = 0; e < vbSelected.size(); ++e )
|
for( unsigned e = 0; e < vbSelected.size(); ++e )
|
||||||
if( vbSelected[e] )
|
if( vbSelected[e] )
|
||||||
iNumSelected++;
|
iNumSelected++;
|
||||||
ASSERT( iNumSelected == 1 );
|
ASSERT( iNumSelected == 1 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionRow::ImportOptions()
|
void OptionRow::ImportOptions()
|
||||||
@@ -722,13 +730,15 @@ void OptionRow::ImportOptions()
|
|||||||
FOREACH( bool, m_vbSelected[p], b )
|
FOREACH( bool, m_vbSelected[p], b )
|
||||||
*b = false;
|
*b = false;
|
||||||
|
|
||||||
|
ASSERT( m_RowDef.choices.size() > 0 );
|
||||||
|
|
||||||
if( m_RowDef.bOneChoiceForAllPlayers )
|
if( m_RowDef.bOneChoiceForAllPlayers )
|
||||||
{
|
{
|
||||||
ASSERT( m_vbSelected[0].size() == m_RowDef.choices.size() );
|
ASSERT( m_vbSelected[0].size() == m_RowDef.choices.size() );
|
||||||
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[0] );
|
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[0] );
|
||||||
m_pHand->ImportOption( m_RowDef, PLAYER_1, m_vbSelected[0] );
|
m_pHand->ImportOption( m_RowDef, PLAYER_1, m_vbSelected[0] );
|
||||||
INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( 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
|
else
|
||||||
{
|
{
|
||||||
@@ -738,7 +748,7 @@ void OptionRow::ImportOptions()
|
|||||||
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] );
|
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] );
|
||||||
m_pHand->ImportOption( m_RowDef, p, m_vbSelected[p] );
|
m_pHand->ImportOption( m_RowDef, p, m_vbSelected[p] );
|
||||||
INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( 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] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,9 +100,8 @@ public:
|
|||||||
void PositionUnderlines();
|
void PositionUnderlines();
|
||||||
void PositionIcons();
|
void PositionIcons();
|
||||||
void UpdateText();
|
void UpdateText();
|
||||||
void UpdateEnabledDisabled(
|
void SetRowFocus( bool bRowHasFocus[NUM_PLAYERS] );
|
||||||
bool bThisRowHasFocus[NUM_PLAYERS],
|
void UpdateEnabledDisabled();
|
||||||
float fTweenSeconds );
|
|
||||||
|
|
||||||
int GetOneSelection( PlayerNumber pn, bool bAllowFail=false ) const;
|
int GetOneSelection( PlayerNumber pn, bool bAllowFail=false ) const;
|
||||||
int GetOneSharedSelection() const;
|
int GetOneSharedSelection() const;
|
||||||
@@ -154,6 +153,7 @@ protected:
|
|||||||
BitmapText m_textTitle;
|
BitmapText m_textTitle;
|
||||||
OptionIcon m_OptionIcons[NUM_PLAYERS];
|
OptionIcon m_OptionIcons[NUM_PLAYERS];
|
||||||
bool m_bFirstItemGoesDown;
|
bool m_bFirstItemGoesDown;
|
||||||
|
bool m_bRowHasFocus[NUM_PLAYERS];
|
||||||
|
|
||||||
float m_fY;
|
float m_fY;
|
||||||
bool m_bHidden; // currently off screen
|
bool m_bHidden; // currently off screen
|
||||||
|
|||||||
@@ -462,9 +462,8 @@ void ScreenOptions::UpdateEnabledDisabled( int r )
|
|||||||
FOREACH_PlayerNumber( pn )
|
FOREACH_PlayerNumber( pn )
|
||||||
bRowHasFocus[pn] = GAMESTATE->IsHumanPlayer(pn) && m_iCurrentRow[pn] == (int)r;
|
bRowHasFocus[pn] = GAMESTATE->IsHumanPlayer(pn) && m_iCurrentRow[pn] == (int)r;
|
||||||
|
|
||||||
row.UpdateEnabledDisabled(
|
row.SetRowFocus( bRowHasFocus );
|
||||||
bRowHasFocus,
|
row.UpdateEnabledDisabled();
|
||||||
TWEEN_SECONDS );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenOptions::UpdateEnabledDisabled()
|
void ScreenOptions::UpdateEnabledDisabled()
|
||||||
|
|||||||
Reference in New Issue
Block a user