Pyrogenesis  trunk
CGUI.h
Go to the documentation of this file.
1 /* Copyright (C) 2015 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /*
19 CGUI
20 
21 --Overview--
22 
23  This is the top class of the whole GUI, all objects
24  and settings are stored within this class.
25 
26 --More info--
27 
28  Check GUI.h
29 
30 */
31 
32 #ifndef INCLUDED_CGUI
33 #define INCLUDED_CGUI
34 
35 #include "GUITooltip.h"
36 #include "GUIbase.h"
37 
38 #include "lib/input.h"
39 #include "ps/Shapes.h"
40 #include "ps/XML/Xeromyces.h"
42 
43 #include <boost/unordered_set.hpp>
44 
45 ERROR_TYPE(GUI, JSOpenFailed);
46 
47 extern const double SELECT_DBLCLICK_RATE;
48 
49 /**
50  * Contains a list of values for new defaults to objects.
51  */
52 struct SGUIStyle
53 {
54  std::map<CStr, CStrW> m_SettingsDefaults;
55 };
56 
57 class JSObject; // The GUI stores a JSObject*, so needs to know that JSObject exists
58 class IGUIObject;
59 class CGUISpriteInstance;
60 struct SGUIText;
61 struct CColor;
62 struct SGUIText;
63 struct SGUIIcon;
64 class CGUIString;
65 class CGUISprite;
66 struct SGUIImageEffects;
67 struct SGUIScrollBarStyle;
68 class GUITooltip;
69 
70 /**
71  * The main object that represents a whole GUI page.
72  *
73  * No interfacial functions throws.
74  */
75 class CGUI
76 {
78 
79  friend class IGUIObject;
80  friend class IGUIScrollBarOwner;
82 
83 private:
84  // Private typedefs
85  typedef IGUIObject *(*ConstructObjectFunction)();
86 
87 public:
88  CGUI(const shared_ptr<ScriptRuntime>& runtime);
89  ~CGUI();
90 
91  /**
92  * Initializes the GUI, needs to be called before the GUI is used
93  */
94  void Initialize();
95 
96  /**
97  * Performs processing that should happen every frame
98  * (including sending the "Tick" event to scripts)
99  */
100  void TickObjects();
101 
102  /**
103  * Sends a specified script event to every object
104  *
105  * @param EventName String representation of event name
106  */
107  void SendEventToAll(const CStr& EventName);
108 
109  /**
110  * Displays the whole GUI
111  */
112  void Draw();
113 
114  /**
115  * Draw GUI Sprite
116  *
117  * @param Sprite Object referring to the sprite (which also caches
118  * calculations for faster rendering)
119  * @param CellID Number of the icon cell to use. (Ignored if this sprite doesn't
120  * have any images with "cell-size")
121  * @param Z Drawing order, depth value
122  * @param Rect Position and Size
123  * @param Clipping The sprite shouldn't be drawn outside this rectangle
124  */
125  void DrawSprite(const CGUISpriteInstance& Sprite, int CellID, const float& Z, const CRect& Rect, const CRect& Clipping = CRect());
126 
127  /**
128  * Draw a SGUIText object
129  *
130  * @param Text Text object.
131  * @param DefaultColor Color used if no tag applied.
132  * @param pos position
133  * @param z z value.
134  * @param clipping
135  */
136  void DrawText(SGUIText& Text, const CColor& DefaultColor, const CPos& pos, const float& z, const CRect& clipping);
137 
138  /**
139  * Clean up, call this to clean up all memory allocated
140  * within the GUI.
141  */
142  void Destroy();
143 
144  /**
145  * The replacement of Process(), handles an SDL_Event_
146  *
147  * @param ev SDL Event, like mouse/keyboard input
148  */
149  InReaction HandleEvent(const SDL_Event_* ev);
150 
151  /**
152  * Load a GUI XML file into the GUI.
153  *
154  * <b>VERY IMPORTANT!</b> All <styles>-files must be read before
155  * everything else!
156  *
157  * @param Filename Name of file
158  * @param Paths Set of paths; all XML and JS files loaded will be added to this
159  */
160  void LoadXmlFile(const VfsPath& Filename, boost::unordered_set<VfsPath>& Paths);
161 
162  /**
163  * Checks if object exists and return true or false accordingly
164  *
165  * @param Name String name of object
166  * @return true if object exists
167  */
168  bool ObjectExists(const CStr& Name) const;
169 
170 
171  /**
172  * Returns the GUI object with the desired name, or NULL
173  * if no match is found,
174  *
175  * @param Name String name of object
176  * @return Matching object, or NULL
177  */
178  IGUIObject* FindObjectByName(const CStr& Name) const;
179 
180  /**
181  * Returns the GUI object under the mouse, or NULL if none.
182  */
183  IGUIObject* FindObjectUnderMouse() const;
184 
185  /**
186  * The GUI needs to have all object types inputted and
187  * their constructors. Also it needs to associate a type
188  * by a string name of the type.
189  *
190  * To add a type:
191  * @code
192  * AddObjectType("button", &CButton::ConstructObject);
193  * @endcode
194  *
195  * @param str Reference name of object type
196  * @param pFunc Pointer of function ConstuctObject() in the object
197  *
198  * @see CGUI#ConstructObject()
199  */
200  void AddObjectType(const CStr& str, ConstructObjectFunction pFunc) { m_ObjectTypes[str] = pFunc; }
201 
202  /**
203  * Update Resolution, should be called every time the resolution
204  * of the OpenGL screen has been changed, this is because it needs
205  * to re-cache all its actual sizes
206  *
207  * Needs no input since screen resolution is global.
208  *
209  * @see IGUIObject#UpdateCachedSize()
210  */
211  void UpdateResolution();
212 
213  /**
214  * Generate a SGUIText object from the inputted string.
215  * The function will break down the string and its
216  * tags to calculate exactly which rendering queries
217  * will be sent to the Renderer. Also, horizontal alignment
218  * is taken into acount in this method but NOT vertical alignment.
219  *
220  * Done through the CGUI since it can communicate with
221  *
222  * @param Text Text to generate SGUIText object from
223  * @param Font Default font, notice both Default color and default font
224  * can be changed by tags.
225  * @param Width Width, 0 if no word-wrapping.
226  * @param BufferZone space between text and edge, and space between text and images.
227  * @param pObject Optional parameter for error output. Used *only* if error parsing fails,
228  * and we need to be able to output which object the error occured in to aid the user.
229  */
230  SGUIText GenerateText(const CGUIString& Text, const CStrW& Font, const float& Width, const float& BufferZone, const IGUIObject* pObject = NULL);
231 
232 
233  /**
234  * Check if an icon exists
235  */
236  bool IconExists(const CStr& str) const { return (m_Icons.count(str) != 0); }
237 
238  /**
239  * Get Icon (a copy, can never be changed)
240  */
241  SGUIIcon GetIcon(const CStr& str) const { return m_Icons.find(str)->second; }
242 
243  /**
244  * Get pre-defined color (if it exists)
245  * Returns false if it fails.
246  */
247  bool GetPreDefinedColor(const CStr& name, CColor& Output) const;
248 
249  shared_ptr<ScriptInterface> GetScriptInterface() { return m_ScriptInterface; };
250  jsval GetGlobalObject() { return m_ScriptInterface->GetGlobalObject(); };
251 
252 private:
253 
254  /**
255  * Updates the object pointers, needs to be called each
256  * time an object has been added or removed.
257  *
258  * This function is atomic, meaning if it throws anything, it will
259  * have seen it through that nothing was ultimately changed.
260  *
261  * @throws PSERROR_GUI that is thrown from IGUIObject::AddToPointersMap().
262  */
263  void UpdateObjects();
264 
265  /**
266  * Adds an object to the GUI's object database
267  * Private, since you can only add objects through
268  * XML files. Why? Because it enables the GUI to
269  * be much more encapsulated and safe.
270  *
271  * @throws Rethrows PSERROR_GUI from IGUIObject::AddChild().
272  */
273  void AddObject(IGUIObject* pObject);
274 
275  /**
276  * You input the name of the object type, and let's
277  * say you input "button", then it will construct a
278  * CGUIObjet* as a CButton.
279  *
280  * @param str Name of object type
281  * @return Newly constructed IGUIObject (but constructed as a subclass)
282  */
283  IGUIObject* ConstructObject(const CStr& str);
284 
285  /**
286  * Get Focused Object.
287  */
288  IGUIObject* GetFocusedObject() { return m_FocusedObject; }
289 
290 public:
291  /**
292  * Change focus to new object.
293  * Will send LOST_FOCUS/GOT_FOCUS messages as appropriate.
294  * pObject can be NULL to remove all focus.
295  */
296  void SetFocusedObject(IGUIObject* pObject);
297 
298 private:
299  //--------------------------------------------------------
300  /** @name XML Reading Xeromyces specific subroutines
301  *
302  * These does not throw!
303  * Because when reading in XML files, it won't be fatal
304  * if an error occurs, perhaps one particular object
305  * fails, but it'll still continue reading in the next.
306  * All Error are reported with ReportParseError
307  */
308  //--------------------------------------------------------
309 
310  /*
311  Xeromyces_* functions tree
312  <objects> (ReadRootObjects)
313  |
314  +-<script> (ReadScript)
315  |
316  +-<object> (ReadObject)
317  |
318  +-<action>
319  |
320  +-Optional Type Extensions (IGUIObject::ReadExtendedElement) TODO
321  |
322  +-<<object>> *recursive*
323 
324 
325  <styles> (ReadRootStyles)
326  |
327  +-<style> (ReadStyle)
328 
329 
330  <sprites> (ReadRootSprites)
331  |
332  +-<sprite> (ReadSprite)
333  |
334  +-<image> (ReadImage)
335 
336 
337  <setup> (ReadRootSetup)
338  |
339  +-<tooltip> (ReadToolTip)
340  |
341  +-<scrollbar> (ReadScrollBar)
342  |
343  +-<icon> (ReadIcon)
344  |
345  +-<color> (ReadColor)
346  */
347  //@{
348 
349  // Read Roots
350 
351  /**
352  * Reads in the root element <objects> (the DOMElement).
353  *
354  * @param Element The Xeromyces object that represents
355  * the objects-tag.
356  * @param pFile The Xeromyces object for the file being read
357  * @param Paths Collects the set of all XML/JS files that are loaded
358  *
359  * @see LoadXmlFile()
360  */
361  void Xeromyces_ReadRootObjects(XMBElement Element, CXeromyces* pFile, boost::unordered_set<VfsPath>& Paths);
362 
363  /**
364  * Reads in the root element <sprites> (the DOMElement).
365  *
366  * @param Element The Xeromyces object that represents
367  * the sprites-tag.
368  * @param pFile The Xeromyces object for the file being read
369  *
370  * @see LoadXmlFile()
371  */
372  void Xeromyces_ReadRootSprites(XMBElement Element, CXeromyces* pFile);
373 
374  /**
375  * Reads in the root element <styles> (the DOMElement).
376  *
377  * @param Element The Xeromyces object that represents
378  * the styles-tag.
379  * @param pFile The Xeromyces object for the file being read
380  *
381  * @see LoadXmlFile()
382  */
383  void Xeromyces_ReadRootStyles(XMBElement Element, CXeromyces* pFile);
384 
385  /**
386  * Reads in the root element <setup> (the DOMElement).
387  *
388  * @param Element The Xeromyces object that represents
389  * the setup-tag.
390  * @param pFile The Xeromyces object for the file being read
391  *
392  * @see LoadXmlFile()
393  */
394  void Xeromyces_ReadRootSetup(XMBElement Element, CXeromyces* pFile);
395 
396  // Read Subs
397 
398  /**
399  * Notice! Recursive function!
400  *
401  * Read in an <object> (the XMBElement) and stores it
402  * as a child in the pParent.
403  *
404  * It will also check the object's children and call this function
405  * on them too. Also it will call all other functions that reads
406  * in other stuff that can be found within an object. Check the
407  * tree in the beginning of this class' Xeromyces_* section.
408  *
409  * @param Element The Xeromyces object that represents
410  * the object-tag.
411  * @param pFile The Xeromyces object for the file being read
412  * @param pParent Parent to add this object as child in.
413  * @param NameSubst A set of substitution strings that will be
414  * applied to all object names within this object.
415  * @param Paths Output set of file paths that this GUI object
416  * relies on.
417  *
418  * @see LoadXmlFile()
419  */
420  void Xeromyces_ReadObject(XMBElement Element, CXeromyces* pFile, IGUIObject* pParent, std::vector<std::pair<CStr, CStr> >& NameSubst, boost::unordered_set<VfsPath>& Paths, u32 nesting_depth);
421 
422  /**
423  * Reads in the element <repeat>, which repeats its child <object>s
424  * 'count' times, replacing the string "[n]" (or the value of the attribute
425  * 'var' enclosed in square brackets) in its descendants' names with "[0]",
426  * "[1]", etc.
427  */
428  void Xeromyces_ReadRepeat(XMBElement Element, CXeromyces* pFile, IGUIObject* pParent, std::vector<std::pair<CStr, CStr> >& NameSubst, boost::unordered_set<VfsPath>& Paths, u32 nesting_depth);
429 
430  /**
431  * Reads in the element <script> (the XMBElement) and executes
432  * the script's code.
433  *
434  * @param Element The Xeromyces object that represents
435  * the script-tag.
436  * @param pFile The Xeromyces object for the file being read
437  * @param Paths Output set of file paths that this script is loaded from.
438  *
439  * @see LoadXmlFile()
440  */
441  void Xeromyces_ReadScript(XMBElement Element, CXeromyces* pFile, boost::unordered_set<VfsPath>& Paths);
442 
443  /**
444  * Reads in the element <sprite> (the XMBElement) and stores the
445  * result in a new CGUISprite.
446  *
447  * @param Element The Xeromyces object that represents
448  * the sprite-tag.
449  * @param pFile The Xeromyces object for the file being read
450  *
451  * @see LoadXmlFile()
452  */
453  void Xeromyces_ReadSprite(XMBElement Element, CXeromyces* pFile);
454 
455  /**
456  * Reads in the element <image> (the XMBElement) and stores the
457  * result within the CGUISprite.
458  *
459  * @param Element The Xeromyces object that represents
460  * the image-tag.
461  * @param pFile The Xeromyces object for the file being read
462  * @param parent Parent sprite.
463  *
464  * @see LoadXmlFile()
465  */
466  void Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite& parent);
467 
468  /**
469  * Reads in the element <effect> (the XMBElement) and stores the
470  * result within the SGUIImageEffects.
471  *
472  * @param Element The Xeromyces object that represents
473  * the image-tag.
474  * @param pFile The Xeromyces object for the file being read
475  * @param effects Effects object to add this effect to.
476  *
477  * @see LoadXmlFile()
478  */
479  void Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImageEffects& effects);
480 
481  /**
482  * Reads in the element <style> (the XMBElement) and stores the
483  * result in m_Styles.
484  *
485  * @param Element The Xeromyces object that represents
486  * the style-tag.
487  * @param pFile The Xeromyces object for the file being read
488  *
489  * @see LoadXmlFile()
490  */
491  void Xeromyces_ReadStyle(XMBElement Element, CXeromyces* pFile);
492 
493  /**
494  * Reads in the element <scrollbar> (the XMBElement) and stores the
495  * result in m_ScrollBarStyles.
496  *
497  * @param Element The Xeromyces object that represents
498  * the scrollbar-tag.
499  * @param pFile The Xeromyces object for the file being read
500  *
501  * @see LoadXmlFile()
502  */
503  void Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile);
504 
505  /**
506  * Reads in the element <icon> (the XMBElement) and stores the
507  * result in m_Icons.
508  *
509  * @param Element The Xeromyces object that represents
510  * the scrollbar-tag.
511  * @param pFile The Xeromyces object for the file being read
512  *
513  * @see LoadXmlFile()
514  */
515  void Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile);
516 
517  /**
518  * Reads in the element <tooltip> (the XMBElement) and stores the
519  * result as an object with the name __tooltip_#.
520  *
521  * @param Element The Xeromyces object that represents
522  * the scrollbar-tag.
523  * @param pFile The Xeromyces object for the file being read
524  *
525  * @see LoadXmlFile()
526  */
527  void Xeromyces_ReadTooltip(XMBElement Element, CXeromyces* pFile);
528 
529  /**
530  * Reads in the element <color> (the XMBElement) and stores the
531  * result in m_PreDefinedColors
532  *
533  * @param Element The Xeromyces object that represents
534  * the scrollbar-tag.
535  * @param pFile The Xeromyces object for the file being read
536  *
537  * @see LoadXmlFile()
538  */
539  void Xeromyces_ReadColor(XMBElement Element, CXeromyces* pFile);
540 
541  //@}
542 
543 private:
544 
545  // Variables
546 
547  //--------------------------------------------------------
548  /** @name Miscellaneous */
549  //--------------------------------------------------------
550  //@{
551 
552  shared_ptr<ScriptInterface> m_ScriptInterface;
553 
554  /**
555  * don't want to pass this around with the
556  * ChooseMouseOverAndClosest broadcast -
557  * we'd need to pack this and pNearest in a struct
558  */
560 
561  /**
562  * Indicates which buttons are pressed (bit 0 = LMB,
563  * bit 1 = RMB, bit 2 = MMB)
564  */
565  unsigned int m_MouseButtons;
566 
567  // Tooltip
569 
570  /**
571  * This is a bank of custom colors, it is simply a look up table that
572  * will return a color object when someone inputs the name of that
573  * color. Of course the colors have to be declared in XML, there are
574  * no hard-coded values.
575  */
576  std::map<CStr, CColor> m_PreDefinedColors;
577 
578  //@}
579  //--------------------------------------------------------
580  /** @name Objects */
581  //--------------------------------------------------------
582  //@{
583 
584  /**
585  * Base Object, all its children are considered parentless
586  * because this is not a real object per se.
587  */
589 
590  /**
591  * Focused object!
592  * Say an input box that is selected. That one is focused.
593  * There can only be one focused object.
594  */
596 
597  /**
598  * Just pointers for fast name access, each object
599  * is really constructed within its parent for easy
600  * recursive management.
601  * Notice m_BaseObject won't belong here since it's
602  * not considered a real object.
603  */
605 
606  /**
607  * Number of object that has been given name automatically.
608  * the name given will be '__internal(#)', the number (#)
609  * being this variable. When an object's name has been set
610  * as followed, the value will increment.
611  */
613 
614  /**
615  * Function pointers to functions that constructs
616  * IGUIObjects by name... For instance m_ObjectTypes["button"]
617  * is filled with a function that will "return new CButton();"
618  */
619  std::map<CStr, ConstructObjectFunction> m_ObjectTypes;
620 
621  /**
622  * Map from hotkey names to objects that listen to the hotkey.
623  * (This is an optimisation to avoid recursing over the whole GUI
624  * tree every time a hotkey is pressed).
625  * Currently this is only set at load time - dynamic changes to an
626  * object's hotkey property will be ignored.
627  */
628  std::map<CStr, std::vector<IGUIObject*> > m_HotkeyObjects;
629 
630  //--------------------------------------------------------
631  // Databases
632  //--------------------------------------------------------
633 
634  // Sprites
635  std::map<CStr, CGUISprite*> m_Sprites;
636 
637  // Styles
638  std::map<CStr, SGUIStyle> m_Styles;
639 
640  // Scroll-bar styles
641  std::map<CStr, SGUIScrollBarStyle> m_ScrollBarStyles;
642 
643  // Icons
644  std::map<CStr, SGUIIcon> m_Icons;
645 };
646 
647 #endif // INCLUDED_CGUI
#define NONCOPYABLE(className)
Indicates that a class is noncopyable (usually due to const or reference members, or because the clas...
Definition: code_annotation.h:217
std::map< CStr, CColor > m_PreDefinedColors
This is a bank of custom colors, it is simply a look up table that will return a color object when so...
Definition: CGUI.h:576
Definition: CGUISprite.h:44
Base class to only the class GUI.
Definition: GUIutil.h:59
std::map< CStr, CStrW > m_SettingsDefaults
Definition: CGUI.h:54
IGUIObject * m_FocusedObject
Focused object! Say an input box that is selected.
Definition: CGUI.h:595
GUITooltip m_Tooltip
Definition: CGUI.h:568
Definition: Shapes.h:36
bool IconExists(const CStr &str) const
Check if an icon exists.
Definition: CGUI.h:236
The GUI Scroll-bar style.
Definition: IGUIScrollBar.h:50
Definition: XeroXMB.h:160
Base settings, all objects possess these settings in their m_BaseSettings Instructions can be found i...
Definition: IGUIObject.h:117
Definition: libsdl.h:51
std::map< CStr, std::vector< IGUIObject * > > m_HotkeyObjects
Map from hotkey names to objects that listen to the hotkey.
Definition: CGUI.h:628
The main object that represents a whole GUI page.
Definition: CGUI.h:75
ERROR_TYPE(GUI, JSOpenFailed)
Includes static functions that needs one template argument.
Definition: GUIutil.h:89
unsigned int m_MouseButtons
Indicates which buttons are pressed (bit 0 = LMB, bit 1 = RMB, bit 2 = MMB)
Definition: CGUI.h:565
CPos m_MousePos
don&#39;t want to pass this around with the ChooseMouseOverAndClosest broadcast - we&#39;d need to pack this ...
Definition: CGUI.h:559
uint32_t u32
Definition: types.h:39
IGUIObject * GetFocusedObject()
Get Focused Object.
Definition: CGUI.h:288
Definition: path.h:77
jsval GetGlobalObject()
Definition: CGUI.h:250
InReaction
Definition: input.h:34
std::map< CStr, SGUIStyle > m_Styles
Definition: CGUI.h:638
shared_ptr< ScriptInterface > GetScriptInterface()
Definition: CGUI.h:249
void AddObjectType(const CStr &str, ConstructObjectFunction pFunc)
The GUI needs to have all object types inputted and their constructors.
Definition: CGUI.h:200
int m_InternalNameNumber
Number of object that has been given name automatically.
Definition: CGUI.h:612
std::map< CStr, SGUIIcon > m_Icons
Definition: CGUI.h:644
Made to represent screen positions and delta values.
Definition: Shapes.h:169
std::map< CStr, IGUIObject * > map_pObjects
Definition: GUIbase.h:139
The GUI sprite, is actually several real sprites (images) like a collage.
Definition: CGUISprite.h:135
IGUIObject * m_BaseObject
Base Object, all its children are considered parentless because this is not a real object per se...
Definition: CGUI.h:588
map_pObjects m_pAllObjects
Just pointers for fast name access, each object is really constructed within its parent for easy recu...
Definition: CGUI.h:604
Definition: Xeromyces.h:42
Definition: GUIbase.h:144
Wrapper class for OS paths used by the game.
Definition: Paths.h:27
Definition: Decompose.h:22
std::map< CStr, CGUISprite * > m_Sprites
Definition: CGUI.h:635
shared_ptr< ScriptInterface > m_ScriptInterface
Definition: CGUI.h:552
const double SELECT_DBLCLICK_RATE
Definition: CGUI.cpp:63
void Draw(DrawCalls &Calls, float Z)
Definition: GUIRenderer.cpp:345
Definition: CGUISprite.h:158
std::map< CStr, SGUIScrollBarStyle > m_ScrollBarStyles
Definition: CGUI.h:641
Base-class this if you want an object to contain one, or several, scroll-bars.
Definition: IGUIScrollBarOwner.h:33
std::map< CStr, ConstructObjectFunction > m_ObjectTypes
Function pointers to functions that constructs IGUIObjects by name...
Definition: CGUI.h:619
Contains a list of values for new defaults to objects.
Definition: CGUI.h:52
Definition: GUITooltip.h:27
String class, substitute for CStr, but that parses the tags and builds up a list of all text that wil...
Definition: GUItext.h:169
SGUIIcon GetIcon(const CStr &str) const
Get Icon (a copy, can never be changed)
Definition: CGUI.h:241
An SGUIText object is a parsed string, divided into text-rendering components.
Definition: GUItext.h:55
Rectangle class used for screen rectangles.
Definition: Shapes.h:73