From 2404ff164147276726a6a4bb589ec4e4e883d16f Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Tue, 8 Mar 2005 03:52:18 +0000 Subject: [PATCH] generic screen popping: pop if pushed, instead of NEXT_SCREEN --- stepmania/src/Screen.cpp | 10 ++++++++-- stepmania/src/ScreenManager.cpp | 9 +++++++++ stepmania/src/ScreenManager.h | 5 +++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index 5752c99ecb..82c17dcae4 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -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; } } diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index 99c5cc7689..835ac03214 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -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. diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index d827663df7..3e1c508659 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -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 );