From fcbe7b1bd7ce777c7955ef74b789354f93782682 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Thu, 14 Jul 2005 21:42:52 +0000 Subject: [PATCH] rename SetFromNewScreen -> PushScreen (it doesn't touch existing screens) allow pushing screens without having them deleted on pop --- stepmania/src/ScreenManager.cpp | 65 +++++++++++++++++-------------- stepmania/src/ScreenManager.h | 9 ++++- stepmania/src/ScreenMiniMenu.cpp | 2 +- stepmania/src/ScreenPrompt.cpp | 2 +- stepmania/src/ScreenTextEntry.cpp | 2 +- 5 files changed, 46 insertions(+), 34 deletions(-) diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index ba3d0d31f3..65fa3bb6cc 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -68,7 +68,10 @@ ScreenManager::~ScreenManager() SAFE_DELETE( m_pSharedBGA ); for( unsigned i=0; iHandleScreenMessage( SM_LoseFocus ); + ls.m_pScreen->HandleScreenMessage( SM_LoseFocus ); SendMessageToTopScreen( SM ); SendMessageToTopScreen( SM_GainFocus ); - delete pScreenToPop; + if( ls.m_bDeleteWhenDone ) + delete ls.m_pScreen; } /* @@ -188,7 +192,7 @@ void ScreenManager::Update( float fDeltaTime ) // { for( unsigned i=0; iProcessMessages( fDeltaTime ); + m_ScreenStack[i].m_pScreen->ProcessMessages( fDeltaTime ); m_pSharedBGA->ProcessMessages( fDeltaTime ); @@ -246,7 +250,7 @@ void ScreenManager::Draw() * that'll confuse the "zero out the next update after loading a screen logic. * If we don't render, don't call BeginFrame or EndFrame. That way, we won't * clear the buffer, and we won't wait for vsync. */ - if( m_ScreenStack.size() && m_ScreenStack.back()->IsFirstUpdate() ) + if( m_ScreenStack.size() && m_ScreenStack.back().m_pScreen->IsFirstUpdate() ) return; if( !DISPLAY->BeginFrame() ) @@ -254,14 +258,14 @@ void ScreenManager::Draw() m_pSharedBGA->Draw(); - if( !m_ScreenStack.empty() && !m_ScreenStack.back()->IsTransparent() ) // top screen isn't transparent + if( !m_ScreenStack.empty() && !m_ScreenStack.back().m_pScreen->IsTransparent() ) // top screen isn't transparent { - m_ScreenStack.back()->Draw(); + m_ScreenStack.back().m_pScreen->Draw(); } else { for( unsigned i=0; iDraw(); + m_ScreenStack[i].m_pScreen->Draw(); } for( unsigned i=0; iInput( DeviceI, type, GameI, MenuI, StyleI ); + m_ScreenStack.back().m_pScreen->Input( DeviceI, type, GameI, MenuI, StyleI ); } /* Just create a new screen; don't do any associated cleanup. */ @@ -416,10 +420,13 @@ void ScreenManager::DeletePreparedScreens() void ScreenManager::ClearScreenStack() { if( m_ScreenStack.size() ) - m_ScreenStack.back()->HandleScreenMessage( SM_LoseFocus ); + m_ScreenStack.back().m_pScreen->HandleScreenMessage( SM_LoseFocus ); for( unsigned i=0; iHandleScreenMessage( SM_LoseFocus ); + m_ScreenStack.back().m_pScreen->HandleScreenMessage( SM_LoseFocus ); - m_ScreenStack.push_back( pNewScreen ); + LoadedScreen ls; + ls.m_pScreen = pNewScreen; + ls.m_bDeleteWhenDone = bDeleteWhenDone; + + m_ScreenStack.push_back( ls ); RefreshCreditsMessages(); @@ -448,7 +459,7 @@ void ScreenManager::SetNewScreen( const CString &sScreenName ) void ScreenManager::LoadDelayedScreen() { - const bool bWasOnSystemMenu = !m_ScreenStack.empty() && m_ScreenStack.back()->GetScreenType() == system_menu; + const bool bWasOnSystemMenu = !m_ScreenStack.empty() && m_ScreenStack.back().m_pScreen->GetScreenType() == system_menu; /* * We have a screen to display. Delete the current screens and load it. @@ -533,14 +544,14 @@ void ScreenManager::LoadDelayedScreen() TEXTUREMAN->DiagnosticOutput(); - LOG->Trace("... SetFromNewScreen"); - SetFromNewScreen( pNewScreen ); + LOG->Trace("... PushScreen"); + PushScreen( pNewScreen, true ); } void ScreenManager::AddNewScreenToTop( const CString &sScreenName ) { Screen* pNewScreen = MakeNewScreen(sScreenName); - SetFromNewScreen( pNewScreen ); + PushScreen( pNewScreen, true ); } void ScreenManager::PopTopScreen( ScreenMessage SM ) @@ -552,20 +563,16 @@ void ScreenManager::PopTopScreen( ScreenMessage SM ) void ScreenManager::PostMessageToTopScreen( ScreenMessage SM, float fDelay ) { - if( m_ScreenStack.size() ) - { - Screen* pTopScreen = m_ScreenStack.back(); + Screen* pTopScreen = GetTopScreen(); + if( pTopScreen != NULL ) pTopScreen->PostScreenMessage( SM, fDelay ); - } } void ScreenManager::SendMessageToTopScreen( ScreenMessage SM ) { - if( m_ScreenStack.size() ) - { - Screen* pTopScreen = m_ScreenStack.back(); + Screen* pTopScreen = GetTopScreen(); + if( pTopScreen != NULL ) pTopScreen->HandleScreenMessage( SM ); - } } diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index 324ec419d1..86f93e1949 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -42,7 +42,7 @@ public: bool ConcurrentlyPrepareScreen( const CString &sScreenName, ScreenMessage send_when_done = SM_None ); bool IsConcurrentlyLoading() const; void DeletePreparedScreens(); - void SetFromNewScreen( Screen *pNewScreen ); + void PushScreen( Screen *pNewScreen, bool bDeleteWhenDone=false ); void PopTopScreen( ScreenMessage SM ); Screen *GetTopScreen(); @@ -74,7 +74,12 @@ private: // // in draw order first to last // - vector m_ScreenStack; // bottommost to topmost + struct LoadedScreen + { + Screen *m_pScreen; + bool m_bDeleteWhenDone; + }; + vector m_ScreenStack; // bottommost to topmost vector m_OverlayScreens; Screen *m_pInputFocus; // NULL = top of m_ScreenStack diff --git a/stepmania/src/ScreenMiniMenu.cpp b/stepmania/src/ScreenMiniMenu.cpp index de24699b48..dbcfad0e0c 100644 --- a/stepmania/src/ScreenMiniMenu.cpp +++ b/stepmania/src/ScreenMiniMenu.cpp @@ -22,7 +22,7 @@ void ScreenMiniMenu::MiniMenu( MenuDef* pDef, ScreenMessage SM_SendOnOK, ScreenM pNewScreen->Init( pDef, SM_SendOnOK, SM_SendOnCancel ); pNewScreen->SetXY( fX, fY ); SCREENMAN->ZeroNextUpdate(); - SCREENMAN->SetFromNewScreen( pNewScreen ); + SCREENMAN->PushScreen( pNewScreen, true ); } //REGISTER_SCREEN_CLASS( ScreenMiniMenu ); diff --git a/stepmania/src/ScreenPrompt.cpp b/stepmania/src/ScreenPrompt.cpp index 7ed8911adb..5c2d461035 100644 --- a/stepmania/src/ScreenPrompt.cpp +++ b/stepmania/src/ScreenPrompt.cpp @@ -21,7 +21,7 @@ void ScreenPrompt::Prompt( ScreenMessage smSendOnPop, const CString &sText, Prom pNewScreen->Init(); pNewScreen->Load( smSendOnPop, sText, type, defaultAnswer, OnYes, OnNo, pCallbackData ); SCREENMAN->ZeroNextUpdate(); - SCREENMAN->SetFromNewScreen( pNewScreen ); + SCREENMAN->PushScreen( pNewScreen, true ); } diff --git a/stepmania/src/ScreenTextEntry.cpp b/stepmania/src/ScreenTextEntry.cpp index 44ec0b7b7f..a056deb5b8 100644 --- a/stepmania/src/ScreenTextEntry.cpp +++ b/stepmania/src/ScreenTextEntry.cpp @@ -62,7 +62,7 @@ void ScreenTextEntry::TextEntry( bPassword ); pNewScreen->Init(); SCREENMAN->ZeroNextUpdate(); - SCREENMAN->SetFromNewScreen( pNewScreen ); + SCREENMAN->PushScreen( pNewScreen, true ); } bool ScreenTextEntry::s_bCancelledLast = false;