use alternate choice selection on ScreenOptions automatically if text runs off right edge of screen
This commit is contained in:
@@ -21,7 +21,6 @@
|
|||||||
#include "GameState.h"
|
#include "GameState.h"
|
||||||
#include "ThemeManager.h"
|
#include "ThemeManager.h"
|
||||||
|
|
||||||
const int MAX_ITEMS_PER_ROW = 8;
|
|
||||||
const float ITEM_X[NUM_PLAYERS] = { 260, 420 };
|
const float ITEM_X[NUM_PLAYERS] = { 260, 420 };
|
||||||
|
|
||||||
#define ICONS_X( p ) THEME->GetMetricF("ScreenOptions",ssprintf("IconsP%dX",p+1))
|
#define ICONS_X( p ) THEME->GetMetricF("ScreenOptions",ssprintf("IconsP%dX",p+1))
|
||||||
@@ -76,6 +75,7 @@ ScreenOptions::ScreenOptions( CString sClassName, bool bEnableTimer )
|
|||||||
m_framePage.BeginTweening( 0.3f, Actor::TWEEN_DECELERATE );
|
m_framePage.BeginTweening( 0.3f, Actor::TWEEN_DECELERATE );
|
||||||
m_framePage.SetTweenX( 0 );
|
m_framePage.SetTweenX( 0 );
|
||||||
memset(&m_OptionDim, 0, sizeof(m_OptionDim));
|
memset(&m_OptionDim, 0, sizeof(m_OptionDim));
|
||||||
|
memset(&m_bRowIsLong, 0, sizeof(m_bRowIsLong));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenOptions::Init( InputMode im, OptionRow OptionRow[], int iNumOptionLines, bool bUseIcons, bool bLoadExplanations )
|
void ScreenOptions::Init( InputMode im, OptionRow OptionRow[], int iNumOptionLines, bool bUseIcons, bool bLoadExplanations )
|
||||||
@@ -126,7 +126,7 @@ void ScreenOptions::Init( InputMode im, OptionRow OptionRow[], int iNumOptionLin
|
|||||||
m_framePage.AddChild( &m_textTitles[i] );
|
m_framePage.AddChild( &m_textTitles[i] );
|
||||||
|
|
||||||
for( unsigned j=0; j<m_OptionRow[i].choices.size(); j++ )
|
for( unsigned j=0; j<m_OptionRow[i].choices.size(); j++ )
|
||||||
m_framePage.AddChild( &m_textItems[i][j] ); // this array has to be big enough to hold all of the options
|
m_framePage.AddChild( &m_textItems[i][j] );
|
||||||
}
|
}
|
||||||
|
|
||||||
// TRICKY: Add one more item. This will be "EXIT"
|
// TRICKY: Add one more item. This will be "EXIT"
|
||||||
@@ -158,7 +158,7 @@ ScreenOptions::~ScreenOptions()
|
|||||||
void ScreenOptions::GetWidthXY( PlayerNumber pn, int iRow, int &iWidthOut, int &iXOut, int &iYOut )
|
void ScreenOptions::GetWidthXY( PlayerNumber pn, int iRow, int &iWidthOut, int &iXOut, int &iYOut )
|
||||||
{
|
{
|
||||||
bool bExitRow = iRow == m_iNumOptionRows;
|
bool bExitRow = iRow == m_iNumOptionRows;
|
||||||
bool bLotsOfOptions = m_OptionRow[iRow].choices.size()>=MAX_ITEMS_PER_ROW;
|
bool bLotsOfOptions = m_bRowIsLong[iRow];
|
||||||
int iOptionInRow = bExitRow ? 0 : bLotsOfOptions ? pn : m_iSelectedOption[pn][iRow];
|
int iOptionInRow = bExitRow ? 0 : bLotsOfOptions ? pn : m_iSelectedOption[pn][iRow];
|
||||||
|
|
||||||
BitmapText &text = m_textItems[iRow][iOptionInRow];
|
BitmapText &text = m_textItems[iRow][iOptionInRow];
|
||||||
@@ -199,8 +199,31 @@ void ScreenOptions::InitOptionsText()
|
|||||||
|
|
||||||
|
|
||||||
// init all text in this line and count the width of the line
|
// init all text in this line and count the width of the line
|
||||||
if( optline.choices.size() >= MAX_ITEMS_PER_ROW )
|
float fX = ITEMS_START_X; // indent 70 pixels
|
||||||
|
for( unsigned j=0; j<optline.choices.size(); j++ ) // for each option on this line
|
||||||
{
|
{
|
||||||
|
BitmapText &option = m_textItems[i][j];
|
||||||
|
|
||||||
|
option.LoadFromFont( THEME->GetPathTo("Fonts","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
|
||||||
|
for( unsigned j=0; j<optline.choices.size(); j++ ) // for each option on this line
|
||||||
|
m_textItems[i][j].SetText( "" );
|
||||||
|
|
||||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||||
{
|
{
|
||||||
if( GAMESTATE->IsPlayerEnabled(p) )
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
||||||
@@ -220,25 +243,6 @@ void ScreenOptions::InitOptionsText()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
float fX = ITEMS_START_X; // indent 70 pixels
|
|
||||||
for( unsigned j=0; j<optline.choices.size(); j++ ) // for each option on this line
|
|
||||||
{
|
|
||||||
BitmapText &option = m_textItems[i][j];
|
|
||||||
|
|
||||||
option.LoadFromFont( THEME->GetPathTo("Fonts","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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BitmapText &option = m_textItems[i][0];
|
BitmapText &option = m_textItems[i][0];
|
||||||
@@ -365,7 +369,7 @@ void ScreenOptions::UpdateText( PlayerNumber player_no )
|
|||||||
int iCurRow = m_iCurrentRow[player_no];
|
int iCurRow = m_iCurrentRow[player_no];
|
||||||
int iChoiceInRow = m_iSelectedOption[player_no][iCurRow];
|
int iChoiceInRow = m_iSelectedOption[player_no][iCurRow];
|
||||||
|
|
||||||
bool bLotsOfOptions = m_OptionRow[iCurRow].choices.size()>=MAX_ITEMS_PER_ROW;
|
bool bLotsOfOptions = m_bRowIsLong[iCurRow];
|
||||||
|
|
||||||
if( bLotsOfOptions )
|
if( bLotsOfOptions )
|
||||||
m_textItems[iCurRow][player_no].SetText( m_OptionRow[iCurRow].choices[iChoiceInRow] );
|
m_textItems[iCurRow][player_no].SetText( m_OptionRow[iCurRow].choices[iChoiceInRow] );
|
||||||
@@ -389,7 +393,7 @@ void ScreenOptions::UpdateEnabledDisabled()
|
|||||||
|
|
||||||
m_textTitles[i].SetDiffuse( bThisRowIsSelected ? colorSelected : colorNotSelected );
|
m_textTitles[i].SetDiffuse( bThisRowIsSelected ? colorSelected : colorNotSelected );
|
||||||
|
|
||||||
if( m_OptionRow[i].choices.size() >= MAX_ITEMS_PER_ROW )
|
if( m_bRowIsLong[i] )
|
||||||
for( unsigned j=0; j<NUM_PLAYERS; j++ )
|
for( unsigned j=0; j<NUM_PLAYERS; j++ )
|
||||||
m_textItems[i][j].SetDiffuse( bThisRowIsSelected ? colorSelected : colorNotSelected );
|
m_textItems[i][j].SetDiffuse( bThisRowIsSelected ? colorSelected : colorNotSelected );
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ protected:
|
|||||||
void DimOption(int line, int option, bool dim);
|
void DimOption(int line, int option, bool dim);
|
||||||
bool RowCompletelyDimmed(int line) const;
|
bool RowCompletelyDimmed(int line) const;
|
||||||
|
|
||||||
|
bool m_bRowIsLong[MAX_OPTION_LINES]; // goes off edge of screen
|
||||||
int m_iSelectedOption[NUM_PLAYERS][MAX_OPTION_LINES];
|
int m_iSelectedOption[NUM_PLAYERS][MAX_OPTION_LINES];
|
||||||
int m_iCurrentRow[NUM_PLAYERS];
|
int m_iCurrentRow[NUM_PLAYERS];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user