From 9d29f1e50fa1cf941ce6a7f1cf44d0d6f43c3cf0 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sun, 14 Aug 2005 01:18:56 +0000 Subject: [PATCH] refactor to support preloading; load this (almost) like any other screen --- stepmania/src/ScreenPrompt.cpp | 70 +++++++++++++++++++++++----------- stepmania/src/ScreenPrompt.h | 21 +--------- 2 files changed, 48 insertions(+), 43 deletions(-) diff --git a/stepmania/src/ScreenPrompt.cpp b/stepmania/src/ScreenPrompt.cpp index 7522054b78..e2907b6df6 100644 --- a/stepmania/src/ScreenPrompt.cpp +++ b/stepmania/src/ScreenPrompt.cpp @@ -14,18 +14,31 @@ bool ScreenPrompt::s_bCancelledLast = false; #define ANSWER_TEXT( elem ) THEME->GetMetric(m_sName,elem+"Text") +/* Settings: */ +namespace +{ + CString g_sText; + PromptType g_PromptType; + PromptAnswer g_defaultAnswer; + void(*g_pOnYes)(void*); + void(*g_pOnNo)(void*); + void *g_pCallbackData; +}; + void ScreenPrompt::Prompt( ScreenMessage smSendOnPop, const CString &sText, PromptType type, PromptAnswer defaultAnswer, void(*OnYes)(void*), void(*OnNo)(void*), void* pCallbackData ) { - // add the new state onto the back of the array - ScreenPrompt *pNewScreen = new ScreenPrompt( "ScreenPrompt" ); - pNewScreen->Init(); - pNewScreen->Load( sText, type, defaultAnswer, OnYes, OnNo, pCallbackData ); - SCREENMAN->ZeroNextUpdate(); - SCREENMAN->PushScreen( pNewScreen, true, smSendOnPop ); + g_sText = sText; + g_PromptType = type; + g_defaultAnswer = defaultAnswer; + g_pOnYes = OnYes; + g_pOnNo = OnNo; + g_pCallbackData = pCallbackData; + + SCREENMAN->AddNewScreenToTop( "ScreenPrompt", smSendOnPop ); } -//REGISTER_SCREEN_CLASS( ScreenPrompt ); +REGISTER_SCREEN_CLASS( ScreenPrompt ); ScreenPrompt::ScreenPrompt( const CString &sScreenName ): ScreenWithMenuElements( sScreenName ) { @@ -60,27 +73,22 @@ void ScreenPrompt::Load( void (*OnNo)(void*), void* pCallbackData ) { - m_sText = sText; - m_PromptType = type; - m_Answer = defaultAnswer; - CLAMP( (int&)m_Answer, 0, m_PromptType ); - m_pOnYes = OnYes; - m_pOnNo = OnNo; - m_pCallbackData = pCallbackData; + m_Answer = g_defaultAnswer; + CLAMP( (int&)m_Answer, 0, g_PromptType ); } void ScreenPrompt::BeginScreen() { ScreenWithMenuElements::BeginScreen(); - m_textQuestion.SetText( m_sText ); + m_textQuestion.SetText( g_sText ); SET_XY_AND_ON_COMMAND( m_textQuestion ); ON_COMMAND( m_sprCursor ); - for( int i=0; i<=m_PromptType; i++ ) + for( int i=0; i<=g_PromptType; i++ ) { - CString sElem = ssprintf("Answer%dOf%d", i+1, m_PromptType+1); + CString sElem = ssprintf("Answer%dOf%d", i+1, g_PromptType+1); m_textAnswer[i].SetName( sElem ); m_textAnswer[i].SetText( ANSWER_TEXT(sElem) ); SET_XY_AND_ON_COMMAND( m_textAnswer[i] ); @@ -117,6 +125,22 @@ void ScreenPrompt::Input( const DeviceInput& DeviceI, const InputEventType type, ScreenWithMenuElements::Input( DeviceI, type, GameI, MenuI, StyleI ); } +bool ScreenPrompt::CanGoRight() +{ + switch( g_PromptType ) + { + case PROMPT_OK: + return false; + case PROMPT_YES_NO: + return m_Answer < ANSWER_NO; + case PROMPT_YES_NO_CANCEL: + return m_Answer < ANSWER_CANCEL; + default: + ASSERT(0); + } + return false; +} + void ScreenPrompt::Change( int dir ) { m_textAnswer[m_Answer].StopEffect(); @@ -153,7 +177,7 @@ void ScreenPrompt::MenuBack( PlayerNumber pn ) if( m_Out.IsTransitioning() || m_Cancel.IsTransitioning() ) return; - switch( m_PromptType ) + switch( g_PromptType ) { case PROMPT_OK: case PROMPT_YES_NO: @@ -179,18 +203,18 @@ void ScreenPrompt::End( bool bCancelled ) OFF_COMMAND( m_textQuestion ); OFF_COMMAND( m_sprCursor ); - for( int i=0; i<=m_PromptType; i++ ) + for( int i=0; i<=g_PromptType; i++ ) OFF_COMMAND( m_textAnswer[i] ); switch( m_Answer ) { case ANSWER_YES: - if( m_pOnYes ) - m_pOnYes(m_pCallbackData); + if( g_pOnYes ) + g_pOnYes(g_pCallbackData); break; case ANSWER_NO: - if( m_pOnNo ) - m_pOnNo(m_pCallbackData); + if( g_pOnNo ) + g_pOnNo(g_pCallbackData); break; } diff --git a/stepmania/src/ScreenPrompt.h b/stepmania/src/ScreenPrompt.h index 6f7c318553..51544e4d06 100644 --- a/stepmania/src/ScreenPrompt.h +++ b/stepmania/src/ScreenPrompt.h @@ -44,21 +44,7 @@ public: protected: bool CanGoLeft() { return m_Answer > 0; } - bool CanGoRight() - { - switch( m_PromptType ) - { - case PROMPT_OK: - return false; - case PROMPT_YES_NO: - return m_Answer < ANSWER_NO; - case PROMPT_YES_NO_CANCEL: - return m_Answer < ANSWER_CANCEL; - default: - ASSERT(0); - } - return false; - } + bool CanGoRight(); void Change( int dir ); void MenuLeft( PlayerNumber pn ); void MenuRight( PlayerNumber pn ); @@ -68,15 +54,10 @@ protected: virtual void End( bool bCancelled ); void PositionCursor(); - CString m_sText; BitmapText m_textQuestion; AutoActor m_sprCursor; BitmapText m_textAnswer[NUM_PROMPT_ANSWERS]; - PromptType m_PromptType; PromptAnswer m_Answer; - void(*m_pOnYes)(void*); - void(*m_pOnNo)(void*); - void* m_pCallbackData; RageSound m_sndChange; };