fix skip when changing value in row:

broadcast the row export only once - not for each player
disable export/import on reload - nothing uses it yet
This commit is contained in:
Chris Danford
2005-04-03 06:21:02 +00:00
parent afd53cfc5e
commit 134cdb4451
17 changed files with 505 additions and 386 deletions
+68 -31
View File
@@ -720,9 +720,17 @@ void OptionRow::Reload()
if( m_pHand == NULL )
return;
if( m_RowDef.m_bExportOnChange )
FOREACH_HumanPlayer( p )
ExportOptions( p, false );
vector<PlayerNumber> vpns;
FOREACH_HumanPlayer( p )
vpns.push_back( p );
// TODO: Nothing uses this yet and it causes skips when changing options.
//if( m_RowDef.m_bExportOnChange )
//{
// bool bRowHasFocus[NUM_PLAYERS];
// ZERO( bRowHasFocus );
// ExportOptions( vpns, bRowHasFocus );
//}
m_pHand->Reload( m_RowDef );
ASSERT( !m_RowDef.choices.empty() );
@@ -730,8 +738,8 @@ void OptionRow::Reload()
FOREACH_PlayerNumber( p )
m_vbSelected[p].resize( m_RowDef.choices.size(), false );
FOREACH_HumanPlayer( p )
ImportOptions( p );
// TODO: Nothing uses this yet and it causes skips when changing options.
//ImportOptions( vpns );
switch( m_RowDef.selectType )
{
@@ -747,9 +755,13 @@ void OptionRow::Reload()
ASSERT(0);
}
if( m_RowDef.m_bExportOnChange )
FOREACH_HumanPlayer( p )
ExportOptions( p, false );
// TODO: Nothing uses this yet and it causes skips when changing options.
//if( m_RowDef.m_bExportOnChange )
//{
// bool bRowHasFocus[NUM_PLAYERS];
// ZERO( bRowHasFocus );
// ExportOptions( vpns, bRowHasFocus );
//}
UpdateEnabledDisabled();
UpdateText();
@@ -792,24 +804,36 @@ static void VerifySelected( SelectType st, const vector<bool> &vbSelected, const
}
}
void OptionRow::ImportOptions( PlayerNumber pn )
void OptionRow::ImportOptions( const vector<PlayerNumber> &vpns )
{
if( m_pHand == NULL )
return;
ASSERT( m_RowDef.choices.size() > 0 );
FOREACH( bool, m_vbSelected[pn], b )
*b = false;
FOREACH_CONST( PlayerNumber, vpns, iter )
{
PlayerNumber p = *iter;
ASSERT( m_vbSelected[pn].size() == m_RowDef.choices.size() );
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[pn] );
m_pHand->ImportOption( m_RowDef, pn, m_vbSelected[pn] );
INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[pn] );
VerifySelected( m_RowDef.selectType, m_vbSelected[pn], m_RowDef.name );
FOREACH( bool, m_vbSelected[p], b )
*b = false;
ASSERT( m_vbSelected[p].size() == m_RowDef.choices.size() );
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] );
}
m_pHand->ImportOption( m_RowDef, vpns, m_vbSelected );
FOREACH_CONST( PlayerNumber, vpns, iter )
{
PlayerNumber p = *iter;
INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] );
VerifySelected( m_RowDef.selectType, m_vbSelected[p], m_RowDef.name );
}
}
int OptionRow::ExportOptions( PlayerNumber pn, bool bRowHasFocus )
int OptionRow::ExportOptions( const vector<PlayerNumber> &vpns, bool bRowHasFocus[NUM_PLAYERS] )
{
if( m_pHand == NULL )
return 0;
@@ -818,23 +842,36 @@ int OptionRow::ExportOptions( PlayerNumber pn, bool bRowHasFocus )
int iChangeMask = 0;
VerifySelected( m_RowDef.selectType, m_vbSelected[pn], m_RowDef.name );
ASSERT( m_vbSelected[pn].size() == m_RowDef.choices.size() );
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[pn] );
FOREACH_CONST( PlayerNumber, vpns, iter )
{
PlayerNumber p = *iter;
bool bFocus = bRowHasFocus[p];
// SELECT_NONE rows get exported if they have focus when the user presses
// Start.
int iChoice = GetChoiceInRowWithFocus( pn );
if( m_RowDef.selectType == SELECT_NONE && bRowHasFocus )
m_vbSelected[pn][iChoice] = true;
VerifySelected( m_RowDef.selectType, m_vbSelected[p], m_RowDef.name );
ASSERT( m_vbSelected[p].size() == m_RowDef.choices.size() );
ERASE_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] );
iChangeMask |= m_pHand->ExportOption( m_RowDef, pn, m_vbSelected[pn] );
if( m_RowDef.selectType == SELECT_NONE && bRowHasFocus )
m_vbSelected[pn][iChoice] = false;
INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[pn] );
// SELECT_NONE rows get exported if they have focus when the user presses
// Start.
int iChoice = GetChoiceInRowWithFocus( p );
if( m_RowDef.selectType == SELECT_NONE && bFocus )
m_vbSelected[p][iChoice] = true;
}
iChangeMask |= m_pHand->ExportOption( m_RowDef, vpns, m_vbSelected );
FOREACH_CONST( PlayerNumber, vpns, iter )
{
PlayerNumber p = *iter;
bool bFocus = bRowHasFocus[p];
int iChoice = GetChoiceInRowWithFocus( p );
if( m_RowDef.selectType == SELECT_NONE && bFocus )
m_vbSelected[p][iChoice] = false;
INSERT_ONE_BOOL_AT_FRONT_IF_NEEDED( m_vbSelected[p] );
}
return iChangeMask;
}