refactor to support preloading; load this (almost) like any other screen
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user