Simplify: when we're in long row mode, m_textItems contains only the
used rows instead of having a bunch of empty texts. This removes a couple special cases.
This commit is contained in:
+73
-103
@@ -75,13 +75,13 @@ ScreenOptions::ScreenOptions( CString sClassName, bool bEnableTimer ) : Screen("
|
|||||||
memset(&m_bRowIsLong, 0, sizeof(m_bRowIsLong));
|
memset(&m_bRowIsLong, 0, sizeof(m_bRowIsLong));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenOptions::Init( InputMode im, OptionRow OptionRow[], int iNumOptionLines, bool bLoadExplanations )
|
void ScreenOptions::Init( InputMode im, OptionRow OptionRows[], int iNumOptionLines, bool bLoadExplanations )
|
||||||
{
|
{
|
||||||
LOG->Trace( "ScreenOptions::Set()" );
|
LOG->Trace( "ScreenOptions::Set()" );
|
||||||
|
|
||||||
|
|
||||||
m_InputMode = im;
|
m_InputMode = im;
|
||||||
m_OptionRow = OptionRow;
|
m_OptionRow = OptionRows;
|
||||||
m_iNumOptionRows = iNumOptionLines;
|
m_iNumOptionRows = iNumOptionLines;
|
||||||
m_bLoadExplanations = bLoadExplanations;
|
m_bLoadExplanations = bLoadExplanations;
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ void ScreenOptions::Init( InputMode im, OptionRow OptionRow[], int iNumOptionLin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// init text
|
// init m_textItems from optionLines
|
||||||
int r;
|
int r;
|
||||||
for( r=0; r<m_iNumOptionRows; r++ ) // foreach line
|
for( r=0; r<m_iNumOptionRows; r++ ) // foreach line
|
||||||
{
|
{
|
||||||
@@ -129,19 +129,77 @@ void ScreenOptions::Init( InputMode im, OptionRow OptionRow[], int iNumOptionLin
|
|||||||
|
|
||||||
m_framePage.AddChild( &m_textTitles[r] );
|
m_framePage.AddChild( &m_textTitles[r] );
|
||||||
|
|
||||||
for( unsigned c=0; c<m_OptionRow[r].choices.size(); c++ )
|
const OptionRow &optline = m_OptionRow[r];
|
||||||
|
|
||||||
|
float fX = ITEMS_START_X; // indent 70 pixels
|
||||||
|
for( unsigned c=0; c<optline.choices.size(); c++ )
|
||||||
{
|
{
|
||||||
BitmapText *bt = new BitmapText;
|
BitmapText *bt = new BitmapText;
|
||||||
m_textItems[r].push_back( bt );
|
m_textItems[r].push_back( bt );
|
||||||
|
|
||||||
m_framePage.AddChild( bt );
|
bt->LoadFromFont( THEME->GetPathToF("ScreenOptions item") );
|
||||||
|
bt->SetText( optline.choices[c] );
|
||||||
|
bt->SetZoom( ITEMS_ZOOM );
|
||||||
|
bt->EnableShadow( false );
|
||||||
|
|
||||||
|
// set the X position of each item in the line
|
||||||
|
float fItemWidth = bt->GetWidestLineWidthInSourcePixels() * bt->GetZoomX();
|
||||||
|
fX += fItemWidth/2;
|
||||||
|
bt->SetX( fX );
|
||||||
|
fX += fItemWidth/2 + ITEMS_GAP_X;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fX > SCREEN_RIGHT-40 )
|
||||||
|
{
|
||||||
|
// It goes off the edge of the screen. Re-init with the "long row" style.
|
||||||
|
m_bRowIsLong[r] = true;
|
||||||
|
for( unsigned j=0; j<optline.choices.size(); j++ ) // for each option on this line
|
||||||
|
delete m_textItems[r][j];
|
||||||
|
m_textItems[r].clear();
|
||||||
|
|
||||||
|
for( unsigned p=0; p<NUM_PLAYERS; p++ )
|
||||||
|
{
|
||||||
|
if( !GAMESTATE->IsHumanPlayer(p) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BitmapText *bt = new BitmapText;
|
||||||
|
m_textItems[r].push_back( bt );
|
||||||
|
|
||||||
|
const int iChoiceInRow = m_iSelectedOption[p][r];
|
||||||
|
|
||||||
|
bt->LoadFromFont( THEME->GetPathToF("ScreenOptions item") );
|
||||||
|
bt->SetText( m_OptionRow[r].choices[iChoiceInRow] );
|
||||||
|
bt->SetZoom( ITEMS_ZOOM );
|
||||||
|
bt->EnableShadow( false );
|
||||||
|
|
||||||
|
/* if choices are locked together, center the item. */
|
||||||
|
if( optline.bOneChoiceForAllPlayers )
|
||||||
|
bt->SetX( (ITEM_X[0]+ITEM_X[1])/2 );
|
||||||
|
else
|
||||||
|
bt->SetX( ITEM_X[p] );
|
||||||
|
|
||||||
|
UpdateText( (PlayerNumber)p, j );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for( unsigned c=0; c<m_textItems[r].size(); c++ )
|
||||||
|
m_framePage.AddChild( m_textItems[r][c] );
|
||||||
|
}
|
||||||
|
|
||||||
|
InitOptionsText();
|
||||||
|
|
||||||
// TRICKY: Add one more item. This will be "EXIT"
|
// TRICKY: Add one more item. This will be "EXIT"
|
||||||
{
|
{
|
||||||
BitmapText *bt = new BitmapText;
|
BitmapText *bt = new BitmapText;
|
||||||
m_textItems[r].push_back( bt );
|
m_textItems[r].push_back( bt );
|
||||||
|
|
||||||
|
bt->LoadFromFont( THEME->GetPathToF("ScreenOptions item") );
|
||||||
|
bt->SetText( "EXIT" );
|
||||||
|
bt->SetZoom( ITEMS_ZOOM );
|
||||||
|
bt->SetShadowLength( 0 );
|
||||||
|
float fY = ITEMS_START_Y + ITEMS_SPACING_Y*m_iNumOptionRows;
|
||||||
|
bt->SetXY( CENTER_X, fY );
|
||||||
|
|
||||||
m_framePage.AddChild( bt );
|
m_framePage.AddChild( bt );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +211,6 @@ void ScreenOptions::Init( InputMode im, OptionRow OptionRow[], int iNumOptionLin
|
|||||||
m_framePage.AddChild( &m_textExplanation );
|
m_framePage.AddChild( &m_textExplanation );
|
||||||
|
|
||||||
|
|
||||||
InitOptionsText();
|
|
||||||
PositionItems();
|
PositionItems();
|
||||||
PositionUnderlines();
|
PositionUnderlines();
|
||||||
PositionIcons();
|
PositionIcons();
|
||||||
@@ -216,11 +273,9 @@ void ScreenOptions::GetWidthXY( PlayerNumber pn, int iRow, int &iWidthOut, int &
|
|||||||
|
|
||||||
void ScreenOptions::InitOptionsText()
|
void ScreenOptions::InitOptionsText()
|
||||||
{
|
{
|
||||||
// init m_textItems from optionLines
|
for( int i=0; i<m_iNumOptionRows; i++ ) // foreach options line
|
||||||
int i;
|
|
||||||
for( i=0; i<m_iNumOptionRows; i++ ) // foreach options line
|
|
||||||
{
|
{
|
||||||
OptionRow &optline = m_OptionRow[i];
|
const OptionRow &optline = m_OptionRow[i];
|
||||||
|
|
||||||
const float fY = ITEMS_START_Y + ITEMS_SPACING_Y*i;
|
const float fY = ITEMS_START_Y + ITEMS_SPACING_Y*i;
|
||||||
|
|
||||||
@@ -236,82 +291,14 @@ void ScreenOptions::InitOptionsText()
|
|||||||
title.SetVertAlign( Actor::align_middle );
|
title.SetVertAlign( Actor::align_middle );
|
||||||
title.EnableShadow( false );
|
title.EnableShadow( false );
|
||||||
|
|
||||||
|
|
||||||
Sprite &bullet = m_sprBullets[i];
|
Sprite &bullet = m_sprBullets[i];
|
||||||
bullet.Load( THEME->GetPathToG("ScreenOptions bullet") );
|
bullet.Load( THEME->GetPathToG("ScreenOptions bullet") );
|
||||||
bullet.SetXY( ARROWS_X, fY );
|
bullet.SetXY( ARROWS_X, fY );
|
||||||
|
|
||||||
|
// set the Y position of each item in the line
|
||||||
// init all text in this line and count the width of the line
|
for( unsigned c=0; c<m_textItems[i].size(); c++ )
|
||||||
float fX = ITEMS_START_X; // indent 70 pixels
|
m_textItems[i][c]->SetY( fY );
|
||||||
for( unsigned j=0; j<optline.choices.size(); j++ ) // for each option on this line
|
|
||||||
{
|
|
||||||
ASSERT( j < m_textItems[i].size() );
|
|
||||||
BitmapText &option = *m_textItems[i][j];
|
|
||||||
|
|
||||||
option.LoadFromFont( THEME->GetPathToF("ScreenOptions item") );
|
|
||||||
option.SetText( optline.choices[j] );
|
|
||||||
option.SetZoom( ITEMS_ZOOM );
|
|
||||||
option.EnableShadow( false );
|
|
||||||
|
|
||||||
// set the XY position of each item in the line
|
|
||||||
float fItemWidth = option.GetWidestLineWidthInSourcePixels() * option.GetZoomX();
|
|
||||||
fX += fItemWidth/2;
|
|
||||||
option.SetXY( fX, fY );
|
|
||||||
fX += fItemWidth/2 + ITEMS_GAP_X;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_bRowIsLong[i] = fX > SCREEN_RIGHT-40; // goes off edge of screen
|
|
||||||
|
|
||||||
if( m_bRowIsLong[i] )
|
|
||||||
{
|
|
||||||
// re-init with "long row" style
|
|
||||||
unsigned j;
|
|
||||||
for( j=0; j<optline.choices.size(); j++ ) // for each option on this line
|
|
||||||
m_textItems[i][j]->SetText( "" );
|
|
||||||
|
|
||||||
for( unsigned p=0; p<NUM_PLAYERS; p++ )
|
|
||||||
{
|
|
||||||
if( !GAMESTATE->IsHumanPlayer(p) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( p >= m_textItems[i].size() )
|
|
||||||
{
|
|
||||||
BitmapText *bt = new BitmapText;
|
|
||||||
m_textItems[i].push_back( bt );
|
|
||||||
|
|
||||||
m_framePage.AddChild( bt );
|
|
||||||
}
|
|
||||||
|
|
||||||
BitmapText &option = *m_textItems[i][p];
|
|
||||||
|
|
||||||
const int iChoiceInRow = m_iSelectedOption[p][i];
|
|
||||||
|
|
||||||
option.LoadFromFont( THEME->GetPathToF("ScreenOptions item") );
|
|
||||||
option.SetText( m_OptionRow[i].choices[iChoiceInRow] );
|
|
||||||
option.SetZoom( ITEMS_ZOOM );
|
|
||||||
option.EnableShadow( false );
|
|
||||||
|
|
||||||
option.SetY( fY );
|
|
||||||
|
|
||||||
/* if choices are locked together, center the item. */
|
|
||||||
if( optline.bOneChoiceForAllPlayers )
|
|
||||||
option.SetX( (ITEM_X[0]+ITEM_X[1])/2 );
|
|
||||||
else
|
|
||||||
option.SetX( ITEM_X[p] );
|
|
||||||
|
|
||||||
UpdateText( (PlayerNumber)p, j );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BitmapText &option = *m_textItems[i][0];
|
|
||||||
option.LoadFromFont( THEME->GetPathToF("ScreenOptions item") );
|
|
||||||
option.SetText( "EXIT" );
|
|
||||||
option.SetZoom( ITEMS_ZOOM );
|
|
||||||
option.SetShadowLength( 0 );
|
|
||||||
float fY = ITEMS_START_Y + ITEMS_SPACING_Y*i;
|
|
||||||
option.SetXY( CENTER_X, fY );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenOptions::PositionUnderlines()
|
void ScreenOptions::PositionUnderlines()
|
||||||
@@ -450,16 +437,14 @@ void ScreenOptions::UpdateText( PlayerNumber player_no, int iRow )
|
|||||||
{
|
{
|
||||||
int iChoiceInRow = m_iSelectedOption[player_no][iRow];
|
int iChoiceInRow = m_iSelectedOption[player_no][iRow];
|
||||||
|
|
||||||
bool bLotsOfOptions = m_bRowIsLong[iRow];
|
if( !m_bRowIsLong[iRow] )
|
||||||
|
return;
|
||||||
|
|
||||||
OptionRow &row = m_OptionRow[iRow];
|
const OptionRow &row = m_OptionRow[iRow];
|
||||||
|
|
||||||
if( bLotsOfOptions )
|
|
||||||
{
|
|
||||||
unsigned item_no = row.bOneChoiceForAllPlayers?0:player_no;
|
unsigned item_no = row.bOneChoiceForAllPlayers?0:player_no;
|
||||||
m_textItems[iRow][item_no]->SetText( m_OptionRow[iRow].choices[iChoiceInRow] );
|
m_textItems[iRow][item_no]->SetText( m_OptionRow[iRow].choices[iChoiceInRow] );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void ScreenOptions::UpdateEnabledDisabled()
|
void ScreenOptions::UpdateEnabledDisabled()
|
||||||
{
|
{
|
||||||
@@ -479,11 +464,7 @@ void ScreenOptions::UpdateEnabledDisabled()
|
|||||||
m_sprBullets[i].SetGlobalDiffuseColor( color );
|
m_sprBullets[i].SetGlobalDiffuseColor( color );
|
||||||
m_textTitles[i].SetGlobalDiffuseColor( color );
|
m_textTitles[i].SetGlobalDiffuseColor( color );
|
||||||
|
|
||||||
if( m_bRowIsLong[i] )
|
for( unsigned j=0; j<m_textItems[i].size(); j++ )
|
||||||
for( unsigned j=0; j<NUM_PLAYERS; j++ )
|
|
||||||
m_textItems[i][j]->SetGlobalDiffuseColor( color );
|
|
||||||
else
|
|
||||||
for( unsigned j=0; j<m_OptionRow[i].choices.size(); j++ )
|
|
||||||
m_textItems[i][j]->SetGlobalDiffuseColor( color );
|
m_textItems[i][j]->SetGlobalDiffuseColor( color );
|
||||||
|
|
||||||
if( m_sprBullets[i].GetDestY() != m_fRowY[i] )
|
if( m_sprBullets[i].GetDestY() != m_fRowY[i] )
|
||||||
@@ -499,18 +480,7 @@ void ScreenOptions::UpdateEnabledDisabled()
|
|||||||
m_sprBullets[i].SetY( m_fRowY[i] );
|
m_sprBullets[i].SetY( m_fRowY[i] );
|
||||||
m_textTitles[i].SetY( m_fRowY[i] );
|
m_textTitles[i].SetY( m_fRowY[i] );
|
||||||
|
|
||||||
/* XXX: If we're long, then remove the old choices when we switch to long so we don't
|
for( unsigned j=0; j<m_textItems[i].size(); j++ )
|
||||||
* need a special case here. */
|
|
||||||
if( m_bRowIsLong[i] )
|
|
||||||
for( unsigned j=0; j<NUM_PLAYERS; j++ )
|
|
||||||
{
|
|
||||||
m_textItems[i][j]->StopTweening();
|
|
||||||
m_textItems[i][j]->BeginTweening( 0.3f );
|
|
||||||
m_textItems[i][j]->SetDiffuseAlpha( m_bRowIsHidden[i]? 0.0f:1.0f );
|
|
||||||
m_textItems[i][j]->SetY( m_fRowY[i] );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
for( unsigned j=0; j<m_OptionRow[i].choices.size(); j++ )
|
|
||||||
{
|
{
|
||||||
m_textItems[i][j]->StopTweening();
|
m_textItems[i][j]->StopTweening();
|
||||||
m_textItems[i][j]->BeginTweening( 0.3f );
|
m_textItems[i][j]->BeginTweening( 0.3f );
|
||||||
|
|||||||
Reference in New Issue
Block a user