180 lines
7.2 KiB
C++
180 lines
7.2 KiB
C++
#pragma once
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Headers
|
|
//////////////////////////////////////////////////////////////////////////
|
|
#include <vector>
|
|
|
|
#include <SFML/Graphics/Transformable.hpp>
|
|
#include <SFML/Graphics/Drawable.hpp>
|
|
#include <SFML/Graphics/Color.hpp>
|
|
#include <SFML/Graphics/Text.hpp>
|
|
|
|
#include <SFML/System/Vector2.hpp>
|
|
|
|
namespace sf
|
|
{
|
|
class Font;
|
|
class String;
|
|
template <class T> class Rect;
|
|
typedef Rect<float> 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<sf::Text> &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<sf::Text> 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<Line> &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<Line> 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
|
|
};
|
|
|
|
}
|