generic screen popping: pop if pushed, instead of NEXT_SCREEN
This commit is contained in:
@@ -150,11 +150,17 @@ void Screen::HandleScreenMessage( const ScreenMessage SM )
|
||||
MenuStart( p );
|
||||
break;
|
||||
case SM_GoToNextScreen:
|
||||
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
||||
if( SCREENMAN->IsStackedScreen(this) )
|
||||
SCREENMAN->PopTopScreen();
|
||||
else
|
||||
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
||||
break;
|
||||
case SM_GoToPrevScreen:
|
||||
SCREENMAN->DeletePreparedScreens();
|
||||
SCREENMAN->SetNewScreen( PREV_SCREEN );
|
||||
if( SCREENMAN->IsStackedScreen(this) )
|
||||
SCREENMAN->PopTopScreen();
|
||||
else
|
||||
SCREENMAN->SetNewScreen( PREV_SCREEN );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,6 +137,15 @@ Screen *ScreenManager::GetTopScreen()
|
||||
return m_ScreenStack[m_ScreenStack.size()-1];
|
||||
}
|
||||
|
||||
bool ScreenManager::IsStackedScreen( const Screen *pScreen ) const
|
||||
{
|
||||
/* True if the screen is in the screen stack, but not the first. */
|
||||
for( unsigned i = 1; i < m_ScreenStack.size(); ++i )
|
||||
if( m_ScreenStack[i] == pScreen )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void ScreenManager::Update( float fDeltaTime )
|
||||
{
|
||||
// Only update the topmost screen on the stack.
|
||||
|
||||
@@ -63,6 +63,11 @@ public:
|
||||
|
||||
Screen *GetTopScreen();
|
||||
|
||||
/* Return true if the given screen is in the main screen stack, but not the bottommost
|
||||
* screen. If true, the screen should usually exit by popping itself, not by loading
|
||||
* another screen. */
|
||||
bool IsStackedScreen( const Screen *pScreen ) const;
|
||||
|
||||
// Lua
|
||||
void PushSelf( lua_State *L );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user