add ValidateAppend and FormatAnswerForDisplay callbacks

This commit is contained in:
Chris Danford
2006-05-01 06:14:07 +00:00
parent 3f17212a09
commit 5656de263f
2 changed files with 39 additions and 12 deletions
+28 -7
View File
@@ -36,6 +36,8 @@ namespace
void(*g_pOnOK)(const RString &sAnswer); void(*g_pOnOK)(const RString &sAnswer);
void(*g_pOnCancel)(); void(*g_pOnCancel)();
bool g_bPassword; bool g_bPassword;
bool (*g_pValidateAppend)(const RString &sAnswerBeforeChar, RString &sAppend);
RString (*g_pFormatAnswerForDisplay)(const RString &sAnswer);
}; };
void ScreenTextEntry::SetTextEntrySettings( void ScreenTextEntry::SetTextEntrySettings(
@@ -45,7 +47,9 @@ void ScreenTextEntry::SetTextEntrySettings(
bool(*Validate)(const RString &sAnswer,RString &sErrorOut), bool(*Validate)(const RString &sAnswer,RString &sErrorOut),
void(*OnOK)(const RString &sAnswer), void(*OnOK)(const RString &sAnswer),
void(*OnCancel)(), void(*OnCancel)(),
bool bPassword bool bPassword,
bool (*ValidateAppend)(const RString &sAnswerBeforeChar, RString &sAppend),
RString (*FormatAnswerForDisplay)(const RString &sAnswer)
) )
{ {
g_sQuestion = sQuestion; g_sQuestion = sQuestion;
@@ -54,7 +58,8 @@ void ScreenTextEntry::SetTextEntrySettings(
g_pValidate = Validate; g_pValidate = Validate;
g_pOnOK = OnOK; g_pOnOK = OnOK;
g_pOnCancel = OnCancel; g_pOnCancel = OnCancel;
g_bPassword = bPassword; g_pValidateAppend = ValidateAppend;
g_pFormatAnswerForDisplay = FormatAnswerForDisplay;
} }
void ScreenTextEntry::TextEntry( void ScreenTextEntry::TextEntry(
@@ -65,7 +70,9 @@ void ScreenTextEntry::TextEntry(
bool(*Validate)(const RString &sAnswer,RString &sErrorOut), bool(*Validate)(const RString &sAnswer,RString &sErrorOut),
void(*OnOK)(const RString &sAnswer), void(*OnOK)(const RString &sAnswer),
void(*OnCancel)(), void(*OnCancel)(),
bool bPassword bool bPassword,
bool (*ValidateAppend)(const RString &sAnswerBeforeChar, RString &sAppend),
RString (*FormatAnswerForDisplay)(const RString &sAnswer)
) )
{ {
g_sQuestion = sQuestion; g_sQuestion = sQuestion;
@@ -75,6 +82,8 @@ void ScreenTextEntry::TextEntry(
g_pOnOK = OnOK; g_pOnOK = OnOK;
g_pOnCancel = OnCancel; g_pOnCancel = OnCancel;
g_bPassword = bPassword; g_bPassword = bPassword;
g_pValidateAppend = ValidateAppend;
g_pFormatAnswerForDisplay = FormatAnswerForDisplay;
SCREENMAN->AddNewScreenToTop( "ScreenTextEntry", smSendOnPop ); SCREENMAN->AddNewScreenToTop( "ScreenTextEntry", smSendOnPop );
} }
@@ -130,6 +139,9 @@ void ScreenTextEntry::UpdateAnswerText()
else else
s = WStringToRString(m_sAnswer); s = WStringToRString(m_sAnswer);
if( g_pFormatAnswerForDisplay )
s = g_pFormatAnswerForDisplay( s );
bool bAnswerFull = (int) s.length() >= g_iMaxInputLength; bool bAnswerFull = (int) s.length() >= g_iMaxInputLength;
if( m_bShowAnswerCaret && !bAnswerFull ) if( m_bShowAnswerCaret && !bAnswerFull )
s += '_'; s += '_';
@@ -198,7 +210,7 @@ void ScreenTextEntry::Input( const InputEventPlus &input )
} }
} }
AppendToAnswer( ssprintf( "%c", c ) ); TryAppendToAnswer( ssprintf( "%c", c ) );
TextEnteredDirectly(); TextEnteredDirectly();
} }
@@ -207,15 +219,24 @@ void ScreenTextEntry::Input( const InputEventPlus &input )
ScreenWithMenuElements::Input( input ); ScreenWithMenuElements::Input( input );
} }
void ScreenTextEntry::AppendToAnswer( RString s ) void ScreenTextEntry::TryAppendToAnswer( RString s )
{ {
{
wstring sNewAnswer = m_sAnswer+RStringToWstring(s); wstring sNewAnswer = m_sAnswer+RStringToWstring(s);
if( (int)sNewAnswer.length() > g_iMaxInputLength ) if( (int)sNewAnswer.length() > g_iMaxInputLength )
{ {
SCREENMAN->PlayInvalidSound(); SCREENMAN->PlayInvalidSound();
return; return;
} }
}
if( g_pValidateAppend && !g_pValidateAppend( WStringToRString(m_sAnswer), s ) )
{
SCREENMAN->PlayInvalidSound();
return;
}
wstring sNewAnswer = m_sAnswer+RStringToWstring(s);
m_sAnswer = sNewAnswer; m_sAnswer = sNewAnswer;
m_sndType.Play(); m_sndType.Play();
UpdateAnswerText(); UpdateAnswerText();
@@ -430,7 +451,7 @@ void ScreenTextEntryVisual::MenuStart( PlayerNumber pn )
switch( m_iFocusX ) switch( m_iFocusX )
{ {
case SPACEBAR: case SPACEBAR:
AppendToAnswer( " " ); TryAppendToAnswer( " " );
break; break;
case BACKSPACE: case BACKSPACE:
BackspaceInAnswer(); BackspaceInAnswer();
@@ -447,7 +468,7 @@ void ScreenTextEntryVisual::MenuStart( PlayerNumber pn )
} }
else else
{ {
AppendToAnswer( g_szKeys[m_iFocusY][m_iFocusX] ); TryAppendToAnswer( g_szKeys[m_iFocusY][m_iFocusX] );
} }
} }
+9 -3
View File
@@ -31,7 +31,10 @@ public:
bool(*Validate)(const RString &sAnswer,RString &sErrorOut) = NULL, bool(*Validate)(const RString &sAnswer,RString &sErrorOut) = NULL,
void(*OnOK)(const RString &sAnswer) = NULL, void(*OnOK)(const RString &sAnswer) = NULL,
void(*OnCanel)() = NULL, void(*OnCanel)() = NULL,
bool bPassword = false ); bool bPassword = false,
bool (*ValidateAppend)(const RString &sAnswerBeforeChar, RString &sAppend) = NULL,
RString (*FormatAnswerForDisplay)(const RString &sAnswer) = NULL
);
static void TextEntry( static void TextEntry(
ScreenMessage smSendOnPop, ScreenMessage smSendOnPop,
RString sQuestion, RString sQuestion,
@@ -40,7 +43,10 @@ public:
bool(*Validate)(const RString &sAnswer,RString &sErrorOut) = NULL, bool(*Validate)(const RString &sAnswer,RString &sErrorOut) = NULL,
void(*OnOK)(const RString &sAnswer) = NULL, void(*OnOK)(const RString &sAnswer) = NULL,
void(*OnCanel)() = NULL, void(*OnCanel)() = NULL,
bool bPassword = false ); bool bPassword = false,
bool (*ValidateAppend)(const RString &sAnswerBeforeChar, RString &sAppend) = NULL,
RString (*FormatAnswerForDisplay)(const RString &sAnswer) = NULL
);
static void Password( static void Password(
ScreenMessage smSendOnPop, ScreenMessage smSendOnPop,
const RString &sQuestion, const RString &sQuestion,
@@ -61,7 +67,7 @@ public:
static bool s_bCancelledLast; static bool s_bCancelledLast;
protected: protected:
void AppendToAnswer( RString s ); void TryAppendToAnswer( RString s );
void BackspaceInAnswer(); void BackspaceInAnswer();
virtual void TextEnteredDirectly() { } virtual void TextEnteredDirectly() { }