fix SeparateExitRow
add ShowExitRow Allow ScreenOptions to override BeginFadingOut in case they don't want to set a new screen
This commit is contained in:
@@ -2219,6 +2219,7 @@ OptionRowType=OptionRowNoUnderline
|
||||
FrameOnCommand=
|
||||
FrameOffCommand=
|
||||
OptionRowType=OptionRowEditMenu
|
||||
ShowExitRow=0
|
||||
|
||||
NumRowsShown=8
|
||||
RowYOffScreenTop=SCREEN_CENTER_Y-152+34*(-0.5)
|
||||
@@ -2494,6 +2495,7 @@ ScrollBarTime=0
|
||||
ShowBpmInSpeedTitle=0
|
||||
FrameOnCommand=addx,-SCREEN_WIDTH;decelerate,0.3;addx,SCREEN_WIDTH
|
||||
FrameOffCommand=accelerate,0.3;addx,SCREEN_WIDTH
|
||||
ShowExitRow=1
|
||||
SeparateExitRow=0
|
||||
SeparateExitRowY=0
|
||||
MoreX=
|
||||
|
||||
@@ -982,12 +982,9 @@ public:
|
||||
defOut.choices.push_back( "none" );
|
||||
}
|
||||
|
||||
if( m_ppStepsToFill->Get() == NULL )
|
||||
{
|
||||
if( m_pDifficultyToFill )
|
||||
m_pDifficultyToFill->Set( m_vDifficulties[0] );
|
||||
m_ppStepsToFill->Set( m_vSteps[0] );
|
||||
}
|
||||
if( m_pDifficultyToFill )
|
||||
m_pDifficultyToFill->Set( m_vDifficulties[0] );
|
||||
m_ppStepsToFill->Set( m_vSteps[0] );
|
||||
}
|
||||
virtual void ImportOption( const OptionRowDefinition &def, PlayerNumber pn, vector<bool> &vbSelectedOut ) const
|
||||
{
|
||||
|
||||
@@ -91,6 +91,7 @@ ScreenOptions::ScreenOptions( CString sClassName ) : ScreenWithMenuElements(sCla
|
||||
SHOW_BPM_IN_SPEED_TITLE (m_sName,"ShowBpmInSpeedTitle"),
|
||||
FRAME_ON_COMMAND (m_sName,"FrameOnCommand"),
|
||||
FRAME_OFF_COMMAND (m_sName,"FrameOffCommand"),
|
||||
SHOW_EXIT_ROW (m_sName,"ShowExitRow"),
|
||||
SEPARATE_EXIT_ROW (m_sName,"SeparateExitRow"),
|
||||
SEPARATE_EXIT_ROW_Y (m_sName,"SeparateExitRowY"),
|
||||
OPTION_ROW_TYPE (m_sName,"OptionRowType")
|
||||
@@ -191,9 +192,9 @@ void ScreenOptions::InitMenu( InputMode im, const vector<OptionRowDefinition> &v
|
||||
m_framePage.AddChild( &row );
|
||||
}
|
||||
|
||||
if( SEPARATE_EXIT_ROW )
|
||||
if( SHOW_EXIT_ROW )
|
||||
{
|
||||
// TRICKY: Add one more item. This will be "EXIT"
|
||||
// TRICKY: Add "EXIT" item
|
||||
m_Rows.push_back( new OptionRow() );
|
||||
OptionRow &row = *m_Rows.back();
|
||||
row.LoadMetrics( OPTION_ROW_TYPE );
|
||||
@@ -298,10 +299,9 @@ ScreenOptions::~ScreenOptions()
|
||||
CString ScreenOptions::GetExplanationText( int iRow ) const
|
||||
{
|
||||
OptionRow &row = *m_Rows[iRow];
|
||||
if( row.GetRowType() == OptionRow::ROW_EXIT )
|
||||
return "";
|
||||
|
||||
CString sLineName = row.GetRowDef().name;
|
||||
ASSERT( !sLineName.empty() );
|
||||
sLineName.Replace("\n-","");
|
||||
sLineName.Replace("\n","");
|
||||
sLineName.Replace(" ","");
|
||||
@@ -311,8 +311,6 @@ CString ScreenOptions::GetExplanationText( int iRow ) const
|
||||
CString ScreenOptions::GetExplanationTitle( int iRow ) const
|
||||
{
|
||||
OptionRow &row = *m_Rows[iRow];
|
||||
if( row.GetRowType() == OptionRow::ROW_EXIT )
|
||||
return "";
|
||||
|
||||
CString sLineName = row.GetRowDef().name;
|
||||
sLineName.Replace("\n-","");
|
||||
@@ -515,7 +513,7 @@ void ScreenOptions::HandleScreenMessage( const ScreenMessage SM )
|
||||
switch( SM )
|
||||
{
|
||||
case SM_MenuTimer:
|
||||
StartGoToNextScreen();
|
||||
this->BeginFadingOut();
|
||||
break;
|
||||
case SM_GoToPrevScreen:
|
||||
// this->ExportOptions(); // Don't save options if we're going back!
|
||||
@@ -738,16 +736,19 @@ void ScreenOptions::MenuBack( PlayerNumber pn )
|
||||
Back( SM_GoToPrevScreen );
|
||||
}
|
||||
|
||||
void ScreenOptions::StartGoToNextScreen()
|
||||
bool ScreenOptions::IsOnLastRow( PlayerNumber pn ) const
|
||||
{
|
||||
this->PostScreenMessage( SM_BeginFadingOut, 0 );
|
||||
int iCurRow = m_iCurrentRow[pn];
|
||||
return iCurRow == (int)(m_Rows.size()-1);
|
||||
}
|
||||
|
||||
bool ScreenOptions::AllAreOnExit() const
|
||||
bool ScreenOptions::AllAreOnLastRow() const
|
||||
{
|
||||
FOREACH_HumanPlayer( p )
|
||||
if( m_Rows[m_iCurrentRow[p]]->GetRowType() != OptionRow::ROW_EXIT )
|
||||
{
|
||||
if( !IsOnLastRow(p) )
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -766,7 +767,8 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType selectType
|
||||
break;
|
||||
}
|
||||
|
||||
OptionRow &row = *m_Rows[m_iCurrentRow[pn]];
|
||||
int iCurRow = m_iCurrentRow[pn];
|
||||
OptionRow &row = *m_Rows[iCurRow];
|
||||
|
||||
|
||||
/* If we are in a three-button mode, check to see if MENU_BUTTON_LEFT and
|
||||
@@ -789,11 +791,11 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType selectType
|
||||
|
||||
|
||||
// If on exit, check it all players are on "Exit"
|
||||
if( row.GetRowType() == OptionRow::ROW_EXIT )
|
||||
if( IsOnLastRow(pn) )
|
||||
{
|
||||
/* Don't accept START to go to the next screen if we're still transitioning in. */
|
||||
if( AllAreOnExit() && selectType == IET_FIRST_PRESS && !IsTransitioning() )
|
||||
StartGoToNextScreen();
|
||||
if( AllAreOnLastRow() && selectType == IET_FIRST_PRESS && !IsTransitioning() )
|
||||
this->BeginFadingOut();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -851,7 +853,7 @@ void ScreenOptions::MenuStart( PlayerNumber pn, const InputEventType selectType
|
||||
case NAV_THREE_KEY_MENU:
|
||||
/* Don't accept START to go to the next screen if we're still transitioning in. */
|
||||
if( selectType == IET_FIRST_PRESS && !IsTransitioning() )
|
||||
StartGoToNextScreen();
|
||||
this->BeginFadingOut();
|
||||
break;
|
||||
case NAV_FIVE_KEY:
|
||||
/* Jump to the exit row. (If everyone's already on the exit row, then
|
||||
@@ -882,7 +884,10 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat )
|
||||
const int iCurRow = m_iCurrentRow[pn];
|
||||
OptionRow &row = *m_Rows[iCurRow];
|
||||
|
||||
const int iNumOptions = (row.GetRowType() == OptionRow::ROW_EXIT)? 1: row.GetRowDef().choices.size();
|
||||
if( row.GetRowType() == OptionRow::ROW_EXIT ) // EXIT is selected
|
||||
return; // don't allow a move
|
||||
|
||||
const int iNumOptions = row.GetRowDef().choices.size();
|
||||
if( m_OptionsNavigation == NAV_THREE_KEY_MENU && iNumOptions <= 1 ) // 1 or 0
|
||||
{
|
||||
/* There are no other options on the row; move up or down instead of left and right.
|
||||
@@ -897,9 +902,6 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat )
|
||||
if( Repeat )
|
||||
return;
|
||||
|
||||
if( row.GetRowType() == OptionRow::ROW_EXIT ) // EXIT is selected
|
||||
return; // don't allow a move
|
||||
|
||||
bool bOneChanged = false;
|
||||
|
||||
|
||||
|
||||
@@ -53,8 +53,7 @@ protected:
|
||||
virtual void MenuBack( PlayerNumber pn );
|
||||
virtual void MenuStart( PlayerNumber pn, const InputEventType type );
|
||||
|
||||
void StartGoToNextScreen();
|
||||
|
||||
virtual void BeginFadingOut() { this->PostScreenMessage( SM_BeginFadingOut, 0 ); }
|
||||
virtual void GoToNextScreen() = 0;
|
||||
virtual void GoToPrevScreen() = 0;
|
||||
|
||||
@@ -68,7 +67,8 @@ protected:
|
||||
|
||||
/* Returns -1 if on a row with no OptionRowDefinition (eg. EXIT). */
|
||||
int GetCurrentRow(PlayerNumber pn = PLAYER_1) const;
|
||||
bool AllAreOnExit() const;
|
||||
bool IsOnLastRow( PlayerNumber pn ) const;
|
||||
bool AllAreOnLastRow() const;
|
||||
|
||||
protected: // derived classes need access to these
|
||||
void LoadOptionIcon( PlayerNumber pn, int iRow, CString sText );
|
||||
@@ -133,6 +133,7 @@ protected:
|
||||
ThemeMetric<bool> SHOW_BPM_IN_SPEED_TITLE;
|
||||
ThemeMetric<apActorCommands> FRAME_ON_COMMAND;
|
||||
ThemeMetric<apActorCommands> FRAME_OFF_COMMAND;
|
||||
ThemeMetric<bool> SHOW_EXIT_ROW;
|
||||
ThemeMetric<bool> SEPARATE_EXIT_ROW;
|
||||
ThemeMetric<float> SEPARATE_EXIT_ROW_Y;
|
||||
ThemeMetric<CString> OPTION_ROW_TYPE;
|
||||
|
||||
@@ -69,12 +69,13 @@ void ScreenOptionsMaster::Init()
|
||||
RageException::Throw( "Unknown flag \"%s\"", sFlag.c_str() );
|
||||
}
|
||||
|
||||
m_OptionRowAlloc.resize( asLineNames.size() );
|
||||
vector<OptionRowDefinition> OptionRowDefs;
|
||||
OptionRowDefs.resize( asLineNames.size() );
|
||||
OptionRowHandlers.resize( asLineNames.size() );
|
||||
for( unsigned i = 0; i < asLineNames.size(); ++i )
|
||||
{
|
||||
CString sLineName = asLineNames[i];
|
||||
OptionRowDefinition &def = m_OptionRowAlloc[i];
|
||||
OptionRowDefinition &def = OptionRowDefs[i];
|
||||
CString sRowCommands = LINE(sLineName);
|
||||
OptionRowHandler* &pHand = OptionRowHandlers[i];
|
||||
pHand = NULL;
|
||||
@@ -92,7 +93,7 @@ void ScreenOptionsMaster::Init()
|
||||
|
||||
ASSERT( OptionRowHandlers.size() == asLineNames.size() );
|
||||
|
||||
InitMenu( im, m_OptionRowAlloc, OptionRowHandlers );
|
||||
InitMenu( im, OptionRowDefs, OptionRowHandlers );
|
||||
}
|
||||
|
||||
ScreenOptionsMaster::~ScreenOptionsMaster()
|
||||
@@ -147,6 +148,41 @@ void ScreenOptionsMaster::ExportOptions( int r )
|
||||
m_iChangeMask |= row.ExportOptions();
|
||||
}
|
||||
|
||||
void ScreenOptionsMaster::BeginFadingOut()
|
||||
{
|
||||
/* If the selection is on a LIST, and the selected LIST option sets the screen,
|
||||
* honor it. */
|
||||
m_sNextScreen = "";
|
||||
|
||||
const unsigned uFocusRow = this->GetCurrentRow();
|
||||
|
||||
for( unsigned r = 0; r < OptionRowHandlers.size(); ++r )
|
||||
{
|
||||
OptionRow &row = *m_Rows[r];
|
||||
|
||||
CHECKPOINT_M( ssprintf("%i/%i", r, int(OptionRowHandlers.size())) );
|
||||
|
||||
/* If SELECT_NONE, only apply it if it's the selected option. */
|
||||
if( row.GetRowDef().selectType == SELECT_NONE && r != uFocusRow )
|
||||
continue;
|
||||
|
||||
OptionRowHandler *pHand = OptionRowHandlers[r];
|
||||
|
||||
const int iChoice = row.GetChoiceInRowWithFocus(GAMESTATE->m_MasterPlayerNumber);
|
||||
CString sScreen = pHand->GetAndEraseScreen( iChoice );
|
||||
if( !sScreen.empty() )
|
||||
m_sNextScreen = sScreen;
|
||||
}
|
||||
CHECKPOINT;
|
||||
|
||||
// NEXT_SCREEN;
|
||||
if( m_sNextScreen == "" )
|
||||
m_sNextScreen = NEXT_SCREEN;
|
||||
|
||||
if( !m_sNextScreen.empty() )
|
||||
ScreenOptions::BeginFadingOut();
|
||||
}
|
||||
|
||||
void ScreenOptionsMaster::GoToNextScreen()
|
||||
{
|
||||
if( GAMESTATE->m_bEditing )
|
||||
@@ -221,36 +257,14 @@ void ScreenOptionsMaster::HandleScreenMessage( const ScreenMessage SM )
|
||||
|
||||
CHECKPOINT;
|
||||
|
||||
const unsigned uFocusRow = this->GetCurrentRow();
|
||||
/* If the selection is on a LIST, and the selected LIST option sets the screen,
|
||||
* honor it. */
|
||||
m_sNextScreen = "";
|
||||
|
||||
for( unsigned r = 0; r < OptionRowHandlers.size(); ++r )
|
||||
{
|
||||
OptionRow &row = *m_Rows[r];
|
||||
const OptionRow &row = *m_Rows[r];
|
||||
|
||||
CHECKPOINT_M( ssprintf("%i/%i", r, int(OptionRowHandlers.size())) );
|
||||
|
||||
/* If SELECT_NONE, only apply it if it's the selected option. */
|
||||
const OptionRowDefinition &def = m_OptionRowAlloc[r];
|
||||
if( def.selectType == SELECT_NONE && r != uFocusRow )
|
||||
continue;
|
||||
|
||||
OptionRowHandler *pHand = OptionRowHandlers[r];
|
||||
|
||||
const int iChoice = row.GetChoiceInRowWithFocus(GAMESTATE->m_MasterPlayerNumber);
|
||||
CString sScreen = pHand->GetAndEraseScreen( iChoice );
|
||||
if( !sScreen.empty() )
|
||||
m_sNextScreen = sScreen;
|
||||
|
||||
|
||||
ExportOptions( r );
|
||||
}
|
||||
CHECKPOINT;
|
||||
|
||||
// NEXT_SCREEN;
|
||||
if( m_sNextScreen == "" )
|
||||
m_sNextScreen = NEXT_SCREEN;
|
||||
|
||||
if( m_iChangeMask & OPT_APPLY_ASPECT_RATIO )
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
class OptionRowHandler;
|
||||
|
||||
class ScreenOptionsMaster: public ScreenOptions
|
||||
class ScreenOptionsMaster : public ScreenOptions
|
||||
{
|
||||
public:
|
||||
ScreenOptionsMaster( CString sName );
|
||||
@@ -19,7 +19,6 @@ protected:
|
||||
CString m_sNextScreen;
|
||||
|
||||
vector<OptionRowHandler*> OptionRowHandlers;
|
||||
vector<OptionRowDefinition> m_OptionRowAlloc;
|
||||
|
||||
protected:
|
||||
void HandleScreenMessage( const ScreenMessage SM );
|
||||
@@ -28,6 +27,7 @@ protected:
|
||||
virtual void ExportOptions( int row );
|
||||
virtual void ImportOptionsForPlayer( PlayerNumber pn ); // used by ScreenPlayerOptions
|
||||
|
||||
virtual void BeginFadingOut();
|
||||
virtual void GoToNextScreen();
|
||||
virtual void GoToPrevScreen();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user