diff --git a/stepmania/src/BitmapText.cpp b/stepmania/src/BitmapText.cpp index 3258eee315..a20ee6becc 100644 --- a/stepmania/src/BitmapText.cpp +++ b/stepmania/src/BitmapText.cpp @@ -190,16 +190,18 @@ void BitmapText::DrawChars() } /* sText is UTF-8. */ -void BitmapText::SetText( CString sText ) +void BitmapText::SetText( CString sText, bool DoSubst ) { ASSERT( m_pFont ); + + if(DoSubst) + FontManager::ReplaceMarkers(sText); + if(m_szText == sText) return; m_szText = sText; - FontManager::ReplaceMarkers(sText); - /* Break the string into lines. */ m_szTextLines.clear(); m_iLineWidths.clear(); diff --git a/stepmania/src/BitmapText.h b/stepmania/src/BitmapText.h index 4295c65628..ad5bdc9f99 100644 --- a/stepmania/src/BitmapText.h +++ b/stepmania/src/BitmapText.h @@ -26,7 +26,7 @@ public: bool LoadFromFont( CString sFontName ); bool LoadFromNumbers( CString sTexturePath ) { return LoadFromTextureAndChars(sTexturePath,"0123456789%. :x"); }; bool LoadFromTextureAndChars( CString sTexturePath, CString sChars ); - void SetText( CString sText ); + void SetText( CString sText, bool DoSubst = true ); int GetWidestLineWidthInSourcePixels() { return m_iWidestLineWidth; }; void CropToWidth( int iWidthInSourcePixels ); diff --git a/stepmania/src/RageUtil.cpp b/stepmania/src/RageUtil.cpp index e9863bd64b..91c970e53c 100644 --- a/stepmania/src/RageUtil.cpp +++ b/stepmania/src/RageUtil.cpp @@ -924,6 +924,16 @@ lstring CStringToLstring(const CString &str) return ret; } +CString LStringToCString(const lstring &str) +{ + CString ret; + + for(unsigned i = 0; i < str.size(); ++i) + ret.append(LcharToUTF8(str[i])); + + return ret; +} + int unichar_to_utf8 (longchar c, char *outbuf) { unsigned int len = 0; diff --git a/stepmania/src/RageUtil.h b/stepmania/src/RageUtil.h index fe0d0de9c2..b4efe44a6a 100644 --- a/stepmania/src/RageUtil.h +++ b/stepmania/src/RageUtil.h @@ -156,6 +156,7 @@ typedef basic_string lstring; extern const longchar INVALID_CHAR; lstring CStringToLstring(const CString &str); +CString LStringToCString(const lstring &str); CString LcharToUTF8( longchar c ); // Splits a CString into an CStringArray according the Deliminator. diff --git a/stepmania/src/ScreenTextEntry.cpp b/stepmania/src/ScreenTextEntry.cpp index 7c2f2b986d..6b8d62ba93 100644 --- a/stepmania/src/ScreenTextEntry.cpp +++ b/stepmania/src/ScreenTextEntry.cpp @@ -18,6 +18,7 @@ #include "GameConstantsAndTypes.h" #include "PrefsManager.h" #include "ThemeManager.h" +#include "FontManager.h" const float QUESTION_X = CENTER_X; const float QUESTION_Y = CENTER_Y - 60; @@ -27,12 +28,20 @@ const float ANSWER_Y = CENTER_Y + 120; const float ANSWER_WIDTH = 440; const float ANSWER_HEIGHT = 30; +/* XXX: Don't let the user use internal-use codepoints (those + * that resolve to Unicode codepoints above 0xFFFF); those are + * subject to change and shouldn't be written to .SMs. + * + * Handle UTF-8. Right now, we need to at least be able to backspace + * a whole UTF-8 character. Better would be to operate in longchars. + */ ScreenTextEntry::ScreenTextEntry( ScreenMessage SM_SendWhenDone, CString sQuestion, CString sInitialAnswer, void(*OnOK)(CString sAnswer), void(*OnCancel)() ) { m_SMSendWhenDone = SM_SendWhenDone; m_pOnOK = OnOK; m_pOnCancel = OnCancel; - m_sAnswer = sInitialAnswer; + + m_sAnswer = CStringToLstring(sInitialAnswer); m_bCancelled = false; m_Fade.SetTransitionTime( 0.5f ); @@ -57,7 +66,7 @@ ScreenTextEntry::ScreenTextEntry( ScreenMessage SM_SendWhenDone, CString sQuesti m_textAnswer.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textAnswer.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textAnswer.SetXY( ANSWER_X, ANSWER_Y ); - m_textAnswer.SetText( m_sAnswer ); + m_textAnswer.SetText( LStringToCString(m_sAnswer) ); this->AddChild( &m_textAnswer ); SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu prompt") ); @@ -91,8 +100,9 @@ void ScreenTextEntry::Input( const DeviceInput& DeviceI, const InputEventType ty MenuStart(PLAYER_1); break; case SDLK_BACKSPACE: - m_sAnswer = m_sAnswer.Left( max(0,m_sAnswer.GetLength()-1) ); - m_textAnswer.SetText( m_sAnswer ); + if(!m_sAnswer.empty()) + m_sAnswer = m_sAnswer.erase( m_sAnswer.size()-1 ); + m_textAnswer.SetText( LStringToCString(m_sAnswer) ); break; default: char c; @@ -137,7 +147,7 @@ void ScreenTextEntry::Input( const DeviceInput& DeviceI, const InputEventType ty if( c != '\0' ) { m_sAnswer += c; - m_textAnswer.SetText( m_sAnswer ); + m_textAnswer.SetText( LStringToCString(m_sAnswer) ); } break; } @@ -187,7 +197,12 @@ void ScreenTextEntry::MenuStart( PlayerNumber pn ) if( m_bCancelled ) { if( m_pOnCancel ) m_pOnCancel(); } else { - if( m_pOnOK ) m_pOnOK( m_sAnswer ); + if( m_pOnOK ) + { + CString ret = LStringToCString(m_sAnswer); + FontManager::ReplaceMarkers(ret); + m_pOnOK( ret ); + } } } diff --git a/stepmania/src/ScreenTextEntry.h b/stepmania/src/ScreenTextEntry.h index c77571f994..2124c2d40d 100644 --- a/stepmania/src/ScreenTextEntry.h +++ b/stepmania/src/ScreenTextEntry.h @@ -38,7 +38,7 @@ protected: TransitionFade m_Fade; BitmapText m_textQuestion; Quad m_rectAnswerBox; - CString m_sAnswer; + lstring m_sAnswer; BitmapText m_textAnswer; ScreenMessage m_SMSendWhenDone; void(*m_pOnOK)( CString sAnswer );