VoroniTessellation (std::map<string, VoroniPoint*> points) : Thing () { Text *t = new Text ("Voroni Tessellation with Oblong Greenhouse"); t->SetTextColor(Color(0.8117, 0.7843, 0.7098)); t -> SetFontSize (Feld () -> Height () / 40.0); t -> SlapOnFeld (); t->IncTranslation(Vect(-100,100,0)); //http://greenhouse.oblong.com/reference/color_methods.html#qr_setalpha SlapOnFeld(); Vect feld_loc = Feld()-> Loc (); greenhouse_width = ((float)Feld()-> Width() / 2) - 2; greenhouse_height = ((float)Feld()-> Height() / 2) - 2; right = feld_loc.Dot(Feld()-> Over()) + greenhouse_width; left = feld_loc.Dot(Feld()-> Over()) - greenhouse_width; top = feld_loc.Dot (Feld ()-> Up()) + greenhouse_height; bottom = feld_loc.Dot (Feld()-> Up()) - greenhouse_height; #ifdef DEBUG2 cout<<"\ngreenhouse window dimensions "<<greenhouse_width<<", "<<greenhouse_height<<endl; // gives (166, 133) #endif moving_points = points; num_points = moving_points.size(); }
void Text::RefreshSizeWrap() { RemoveAllChildren(); for ( TextLines::iterator it = m_Lines.begin(); it != m_Lines.end(); ++it ) { delete *it; } m_Lines.clear(); std::vector<Gwen::UnicodeString> words; SplitWords( GetText().GetUnicode(), words ); // Adding a bullshit word to the end simplifies the code below // which is anything but simple. words.push_back( L"" ); if ( !GetFont() ) { Debug::AssertCheck( 0, "Text::RefreshSize() - No Font!!\n" ); return; } Point pFontSize = GetSkin()->GetRender()->MeasureText( GetFont(), L" " ); int w = GetParent()->Width() - GetParent()->GetPadding().left-GetParent()->GetPadding().right; int x = 0, y = 0; Gwen::UnicodeString strLine; for ( std::vector<Gwen::UnicodeString>::iterator it = words.begin(); 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] == L'\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 > w ) { bFinishLine = true; bWrapped = true; } } // If this is the last word then finish the line if ( --words.end() == it ) { bFinishLine = true; } if ( bFinishLine ) { Text* t = new Text( this ); t->SetFont( GetFont() ); t->SetTextColor( m_Color ); if(bWrapped) { t->SetString( strLine.substr( 0, strLine.length() - (*it).length() ) ); // newline should start with the word that was too big strLine = *it; } else { t->SetString( strLine.substr( 0, strLine.length()) ); //new line is empty strLine.clear(); } 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] == L' ' ) x -= pFontSize.x; } } // Size to children height and parent width Point childsize = ChildrenSize(); { SetSize( w, childsize.y ); } // Align the text within the parent int y_offset = 0; for ( TextLines::iterator it = m_Lines.begin(); it != m_Lines.end(); ++it ) { Text* text = *it; const Rect & bounds = GetInnerBounds(); int x = 0; int y = 0; if ( m_iAlign & Pos::Left ) { x = bounds.x; } if ( m_iAlign & Pos::Right ) { x = bounds.x + ( bounds.w - text->Width() ); } if ( m_iAlign & Pos::CenterH ) { x = bounds.x + ( bounds.w - text->Width() ) * 0.5; } if ( m_iAlign & Pos::Top ) { y = bounds.y; } if ( m_iAlign & Pos::Bottom ) { y = bounds.y + ( bounds.h - childsize.y ); } if ( m_iAlign & Pos::CenterV ) { y = bounds.y + ( bounds.h - childsize.y ) * 0.5; } text->SetPos( x, y + y_offset ); y_offset += text->Height(); } InvalidateParent(); Invalidate(); }