#pragma once ////////////////////////////////////////////////////////////////////////// // Headers ////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include namespace sf { class Font; class String; template class Rect; typedef Rect FloatRect; } namespace sfe { class RichText : public sf::Drawable, public sf::Transformable { public: ////////////////////////////////////////////////////////////////////////// // Nested class that represents a single line ////////////////////////////////////////////////////////////////////////// class Line : public sf::Transformable, public sf::Drawable { public: ////////////////////////////////////////////////////////////////////// // Set character size ////////////////////////////////////////////////////////////////////// void setCharacterSize(unsigned int size); ////////////////////////////////////////////////////////////////////// // Set font ////////////////////////////////////////////////////////////////////// void setFont(const sf::Font &font); ////////////////////////////////////////////////////////////////////// // Get texts ////////////////////////////////////////////////////////////////////// const std::vector &getTexts() const; ////////////////////////////////////////////////////////////////////// // Append text ////////////////////////////////////////////////////////////////////// void appendText(sf::Text text); ////////////////////////////////////////////////////////////////////// // Get local bounds ////////////////////////////////////////////////////////////////////// sf::FloatRect getLocalBounds() const; ////////////////////////////////////////////////////////////////////// // Get global bounds ////////////////////////////////////////////////////////////////////// sf::FloatRect getGlobalBounds() const; protected: ////////////////////////////////////////////////////////////////////// // Draw ////////////////////////////////////////////////////////////////////// void draw(sf::RenderTarget &target, sf::RenderStates states) const override; private: ////////////////////////////////////////////////////////////////////// // Update geometry ////////////////////////////////////////////////////////////////////// void updateGeometry() const; ////////////////////////////////////////////////////////////////////// // Update geometry for a given text ////////////////////////////////////////////////////////////////////// void updateTextAndGeometry(sf::Text &text) const; ////////////////////////////////////////////////////////////////////// // Member data ////////////////////////////////////////////////////////////////////// mutable std::vector m_texts; ///< List of texts mutable sf::FloatRect m_bounds; ///< Local bounds }; ////////////////////////////////////////////////////////////////////////// // Constructor ////////////////////////////////////////////////////////////////////////// RichText(); ////////////////////////////////////////////////////////////////////////// // Constructor ////////////////////////////////////////////////////////////////////////// RichText(const sf::Font &font); ////////////////////////////////////////////////////////////////////////// // Operators ////////////////////////////////////////////////////////////////////////// RichText & operator << (const sf::Color &color); RichText & operator << (sf::Text::Style style); RichText & operator << (const sf::String &string); ////////////////////////////////////////////////////////////////////////// // Set character size ////////////////////////////////////////////////////////////////////////// void setCharacterSize(unsigned int size); ////////////////////////////////////////////////////////////////////////// // Set font ////////////////////////////////////////////////////////////////////////// void setFont(const sf::Font &font); ////////////////////////////////////////////////////////////////////////// // Clear ////////////////////////////////////////////////////////////////////////// void clear(); ////////////////////////////////////////////////////////////////////////// // Get text list ////////////////////////////////////////////////////////////////////////// const std::vector &getLines() const; ////////////////////////////////////////////////////////////////////////// // Get character size ////////////////////////////////////////////////////////////////////////// unsigned int getCharacterSize() const; ////////////////////////////////////////////////////////////////////////// // Get font ////////////////////////////////////////////////////////////////////////// const sf::Font *getFont() const; ////////////////////////////////////////////////////////////////////////// // Get local bounds ////////////////////////////////////////////////////////////////////////// sf::FloatRect getLocalBounds() const; ////////////////////////////////////////////////////////////////////////// // Get global bounds ////////////////////////////////////////////////////////////////////////// sf::FloatRect getGlobalBounds() const; protected: ////////////////////////////////////////////////////////////////////////// // Render ////////////////////////////////////////////////////////////////////////// void draw(sf::RenderTarget &target, sf::RenderStates states) const override; private: ////////////////////////////////////////////////////////////////////////// // Delegate constructor ////////////////////////////////////////////////////////////////////////// RichText(const sf::Font *font); ////////////////////////////////////////////////////////////////////////// // Creates a sf::Text instance using the current styles ////////////////////////////////////////////////////////////////////////// sf::Text createText(const sf::String &string) const; ////////////////////////////////////////////////////////////////////////// // Update geometry ////////////////////////////////////////////////////////////////////////// void updateGeometry() const; ////////////////////////////////////////////////////////////////////////// // Member data ////////////////////////////////////////////////////////////////////////// mutable std::vector m_lines; ///< List of lines const sf::Font *m_font; ///< Font unsigned int m_characterSize; ///< Character size mutable sf::FloatRect m_bounds; ///< Local bounds sf::Color m_currentColor; ///< Last used color sf::Text::Style m_currentStyle; ///< Last style used }; }