refactor to support preloading; load this (almost) like any other screen

This commit is contained in:
Glenn Maynard
2005-08-14 01:18:56 +00:00
parent c5c84793b0
commit 9d29f1e50f
2 changed files with 48 additions and 43 deletions
+47 -23
View File
@@ -14,18 +14,31 @@ bool ScreenPrompt::s_bCancelledLast = false;
#define ANSWER_TEXT( elem ) THEME->GetMetric(m_sName,elem+"Text") #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 ) 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 g_sText = sText;
ScreenPrompt *pNewScreen = new ScreenPrompt( "ScreenPrompt" ); g_PromptType = type;
pNewScreen->Init(); g_defaultAnswer = defaultAnswer;
pNewScreen->Load( sText, type, defaultAnswer, OnYes, OnNo, pCallbackData ); g_pOnYes = OnYes;
SCREENMAN->ZeroNextUpdate(); g_pOnNo = OnNo;
SCREENMAN->PushScreen( pNewScreen, true, smSendOnPop ); g_pCallbackData = pCallbackData;
SCREENMAN->AddNewScreenToTop( "ScreenPrompt", smSendOnPop );
} }
//REGISTER_SCREEN_CLASS( ScreenPrompt ); REGISTER_SCREEN_CLASS( ScreenPrompt );
ScreenPrompt::ScreenPrompt( const CString &sScreenName ): ScreenPrompt::ScreenPrompt( const CString &sScreenName ):
ScreenWithMenuElements( sScreenName ) ScreenWithMenuElements( sScreenName )
{ {
@@ -60,27 +73,22 @@ void ScreenPrompt::Load(
void (*OnNo)(void*), void (*OnNo)(void*),
void* pCallbackData ) void* pCallbackData )
{ {
m_sText = sText; m_Answer = g_defaultAnswer;
m_PromptType = type; CLAMP( (int&)m_Answer, 0, g_PromptType );
m_Answer = defaultAnswer;
CLAMP( (int&)m_Answer, 0, m_PromptType );
m_pOnYes = OnYes;
m_pOnNo = OnNo;
m_pCallbackData = pCallbackData;
} }
void ScreenPrompt::BeginScreen() void ScreenPrompt::BeginScreen()
{ {
ScreenWithMenuElements::BeginScreen(); ScreenWithMenuElements::BeginScreen();
m_textQuestion.SetText( m_sText ); m_textQuestion.SetText( g_sText );
SET_XY_AND_ON_COMMAND( m_textQuestion ); SET_XY_AND_ON_COMMAND( m_textQuestion );
ON_COMMAND( m_sprCursor ); 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].SetName( sElem );
m_textAnswer[i].SetText( ANSWER_TEXT(sElem) ); m_textAnswer[i].SetText( ANSWER_TEXT(sElem) );
SET_XY_AND_ON_COMMAND( m_textAnswer[i] ); 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 ); 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 ) void ScreenPrompt::Change( int dir )
{ {
m_textAnswer[m_Answer].StopEffect(); m_textAnswer[m_Answer].StopEffect();
@@ -153,7 +177,7 @@ void ScreenPrompt::MenuBack( PlayerNumber pn )
if( m_Out.IsTransitioning() || m_Cancel.IsTransitioning() ) if( m_Out.IsTransitioning() || m_Cancel.IsTransitioning() )
return; return;
switch( m_PromptType ) switch( g_PromptType )
{ {
case PROMPT_OK: case PROMPT_OK:
case PROMPT_YES_NO: case PROMPT_YES_NO:
@@ -179,18 +203,18 @@ void ScreenPrompt::End( bool bCancelled )
OFF_COMMAND( m_textQuestion ); OFF_COMMAND( m_textQuestion );
OFF_COMMAND( m_sprCursor ); 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] ); OFF_COMMAND( m_textAnswer[i] );
switch( m_Answer ) switch( m_Answer )
{ {
case ANSWER_YES: case ANSWER_YES:
if( m_pOnYes ) if( g_pOnYes )
m_pOnYes(m_pCallbackData); g_pOnYes(g_pCallbackData);
break; break;
case ANSWER_NO: case ANSWER_NO:
if( m_pOnNo ) if( g_pOnNo )
m_pOnNo(m_pCallbackData); g_pOnNo(g_pCallbackData);
break; break;
} }
+1 -20
View File
@@ -44,21 +44,7 @@ public:
protected: protected:
bool CanGoLeft() { return m_Answer > 0; } bool CanGoLeft() { return m_Answer > 0; }
bool CanGoRight() 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;
}
void Change( int dir ); void Change( int dir );
void MenuLeft( PlayerNumber pn ); void MenuLeft( PlayerNumber pn );
void MenuRight( PlayerNumber pn ); void MenuRight( PlayerNumber pn );
@@ -68,15 +54,10 @@ protected:
virtual void End( bool bCancelled ); virtual void End( bool bCancelled );
void PositionCursor(); void PositionCursor();
CString m_sText;
BitmapText m_textQuestion; BitmapText m_textQuestion;
AutoActor m_sprCursor; AutoActor m_sprCursor;
BitmapText m_textAnswer[NUM_PROMPT_ANSWERS]; BitmapText m_textAnswer[NUM_PROMPT_ANSWERS];
PromptType m_PromptType;
PromptAnswer m_Answer; PromptAnswer m_Answer;
void(*m_pOnYes)(void*);
void(*m_pOnNo)(void*);
void* m_pCallbackData;
RageSound m_sndChange; RageSound m_sndChange;
}; };