-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRichText.hpp
179 lines (147 loc) · 7.19 KB
/
RichText.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#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
};
}