void SplitWords(const Gwen::String &s, char delim, stl::vector<Gwen::String> &elems) { Gwen::String str; for ( unsigned int i=0; i<s.length(); i++ ) { if ( s[i] == '\n' ) { if ( !str.empty() ) elems.push_back( str ); elems.push_back( "\n" ); str.clear(); continue; } if ( s[i] == ' ' ) { str += s[i]; elems.push_back( str ); str.clear(); continue; } str += s[i]; } if ( !str.empty() ) elems.push_back( str ); }
Gwen::Point Base::MeasureText( Gwen::Font* pFont, const Gwen::String& text ) { Gwen::Point p; p.x = pFont->size * Scale() * (float)text.length() * 0.4; p.y = pFont->size * Scale(); return p; }
void Gwen::Utility::Strings::Split( const Gwen::String& str, const Gwen::String& seperator, Strings::List& outbits, bool bLeave ) { int iOffset = 0; int iLength = str.length(); int iSepLen = seperator.length(); size_t i = str.find( seperator, 0 ); while ( i != std::string::npos ) { outbits.push_back( str.substr( iOffset, i-iOffset ) ); iOffset = i + iSepLen; i = str.find( seperator, iOffset ); if ( bLeave ) iOffset -= iSepLen; } outbits.push_back( str.substr( iOffset, iLength-iOffset ) ); }
void Base::RenderText( Gwen::Font* pFont, Gwen::Point pos, const Gwen::String& text ) { float fSize = pFont->size * Scale(); for ( float i=0; i<text.length(); i++ ) { char chr = text[i]; if ( chr == ' ' ) continue; Gwen::Rect r( pos.x + i * fSize * 0.4, pos.y, fSize * 0.4 -1, fSize ); /* This isn't important, it's just me messing around changing the shape of the rect based on the letter.. just for fun. */ if ( chr == 'l' || chr == 'i' || chr == '!' || chr == 't' ) { r.w = 1; } else if ( chr >= 'a' && chr <= 'z' ) { r.y += fSize * 0.5f; r.h -= fSize * 0.4f; } else if ( chr == '.' || chr == ',' ) { r.x += 2; r.y += r.h - 2; r.w = 2; r.h = 2; } else if ( chr == '\'' || chr == '`' || chr == '"' ) { r.x += 3; r.w = 2; r.h = 2; } if ( chr == 'o' || chr == 'O' || chr == '0' ) DrawLinedRect( r ); else DrawFilledRect( r ); } }
void Text::RefreshSizeWrap() { RemoveAllChildren(); m_Lines.clear(); stl::vector<Gwen::String> words; SplitWords( GetText().Get(), ' ', words ); // Adding a bullshit word to the end simplifies the code below // which is anything but simple. words.push_back( "" ); if ( !GetFont() ) { Debug::AssertCheck( 0, "Text::RefreshSize() - No Font!!\n" ); return; } Point pFontSize = GetSkin()->GetRender()->MeasureText( GetFont(), " " ); int w = GetParent()->Width(); int x = 0, y = 0; Gwen::String strLine; stl::vector<Gwen::String>::iterator it = words.begin(); for (; it != words.end(); ++it ) { bool bFinishLine = false; //bool bWrapped = false; // If this word is a newline - make a newline (we still add it to the text) if ( (*it).c_str()[0] == '\n' ) bFinishLine = true; // Does adding this word drive us over the width? { strLine += (*it); Gwen::Point p = GetSkin()->GetRender()->MeasureText( GetFont(), strLine ); if ( p.x > Width() ) { bFinishLine = true; /*bWrapped = true;*/ } } // If this is the last word then finish the line // if ( --words.end() == it ) // NOTE: replaced above commented out 'if' statement with this to appease // the GCC compiler that comes with Marmalade SDK 6.0 stl::vector<Gwen::String>::iterator temp = words.end() - 1; if ( temp == it ) { bFinishLine = true; } if ( bFinishLine ) { Text* t = new Text( this ); t->SetFont( GetFont() ); t->SetString( strLine.substr( 0, strLine.length() - (*it).length() ) ); t->RefreshSize(); t->SetPos( x, y ); m_Lines.push_back( t ); // newline should start with the word that was too big strLine = *it; // Position the newline y += pFontSize.y; x = 0; //if ( strLine[0] == ' ' ) x -= pFontSize.x; } } // Size to children height and parent width { Point childsize = ChildrenSize(); SetSize( w, childsize.y ); } InvalidateParent(); Invalidate(); }