CUGL 1.2
Cornell University Game Library
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
CULabel.h
1 //
2 // CULabel.h
3 // Cornell University Game Library (CUGL)
4 //
5 // This module provides a scene graph node that displays a single line of text.
6 // We have moved multiline text support to a separate class.
7 //
8 // This class uses our standard shared-pointer architecture.
9 //
10 // 1. The constructor does not perform any initialization; it just sets all
11 // attributes to their defaults.
12 //
13 // 2. All initialization takes place via init methods, which can fail if an
14 // object is initialized more than once.
15 //
16 // 3. All allocation takes place via static constructors which return a shared
17 // pointer.
18 //
19 // CUGL MIT License:
20 // This software is provided 'as-is', without any express or implied
21 // warranty. In no event will the authors be held liable for any damages
22 // arising from the use of this software.
23 //
24 // Permission is granted to anyone to use this software for any purpose,
25 // including commercial applications, and to alter it and redistribute it
26 // freely, subject to the following restrictions:
27 //
28 // 1. The origin of this software must not be misrepresented; you must not
29 // claim that you wrote the original software. If you use this software
30 // in a product, an acknowledgment in the product documentation would be
31 // appreciated but is not required.
32 //
33 // 2. Altered source versions must be plainly marked as such, and must not
34 // be misrepresented as being the original software.
35 //
36 // 3. This notice may not be removed or altered from any source distribution.
37 //
38 // Author: Walker White
39 // Version: 7/6/16
40 //
41 #ifndef __CU_LABEL_H__
42 #define __CU_LABEL_H__
43 
44 #include <string>
45 #include <cugl/2d/CUNode.h>
46 #include <cugl/2d/CUFont.h>
47 
48 namespace cugl {
49 
74 class Label : public Node {
75 #pragma mark Values
76 public:
85  enum class HAlign : int {
92  LEFT = 0,
99  CENTER = 1,
106  RIGHT = 2,
113  HARDLEFT = 3,
121  TRUECENTER = 4,
128  HARDRIGHT = 5
129  };
130 
137  enum class VAlign {
145  BOTTOM = 0,
154  MIDDLE = 1,
162  TOP = 2,
170  HARDBOTTOM= 3,
178  TRUEMIDDLE= 4,
186  HARDTOP = 5,
187  };
188 protected:
190  std::shared_ptr<Font> _font;
191 
193  std::string _text;
198 
205 
210 
214  GLenum _srcFactor;
216  GLenum _dstFactor;
217 
219  bool _rendered;
221  std::vector<Vertex2> _vertices;
223  std::vector<unsigned short> _indices;
224  std::shared_ptr<Texture> _texture;
225 
226 public:
227 #pragma mark -
228 #pragma mark Constructors
229 
237  Label();
238 
242  ~Label() { dispose(); }
243 
253  virtual void dispose() override;
254 
262  virtual bool init() override {
263  CUAssertLog(false,"This node does not support the empty initializer");
264  return false;
265  }
266 
277  bool init(const Size& size, const std::shared_ptr<Font>& font);
278 
296  bool initWithText(const char* text, const std::shared_ptr<Font>& font) {
297  return initWithText(std::string(text), font);
298  }
299 
317  bool initWithText(const std::string& text, const std::shared_ptr<Font>& font);
318 
344  virtual bool initWithData(const SceneLoader* loader, const std::shared_ptr<JsonValue>& data) override;
345 
346 #pragma mark -
347 #pragma mark Static Constructors
348 
358  static std::shared_ptr<Label> alloc(const Size& size, const std::shared_ptr<Font>& font) {
359  std::shared_ptr<Label> result = std::make_shared<Label>();
360  return (result->init(size,font) ? result : nullptr);
361  }
362 
380  static std::shared_ptr<Label> alloc(const std::string& text, const std::shared_ptr<Font>& font) {
381  std::shared_ptr<Label> result = std::make_shared<Label>();
382  return (result->initWithText(text,font) ? result : nullptr);
383  }
384 
405  static std::shared_ptr<Label> alloc(const char* text, const std::shared_ptr<Font>& font) {
406  std::shared_ptr<Label> result = std::make_shared<Label>();
407  return (result->initWithText(text,font) ? result : nullptr);
408  }
409 
435  static std::shared_ptr<Node> allocWithData(const SceneLoader* loader,
436  const std::shared_ptr<JsonValue>& data) {
437  std::shared_ptr<Label> result = std::make_shared<Label>();
438  if (!result->initWithData(loader,data)) { result = nullptr; }
439  return std::dynamic_pointer_cast<Node>(result);
440  }
441 
442 #pragma mark -
443 #pragma mark Text Attributes
444 
455  const std::string& getText() const { return _text; }
456 
476  virtual void setText(const std::string& text, bool resize=false);
477 
494  const Vec2& getPadding() const { return _padding; }
495 
509  float getPaddingX() const { return _padding.x; }
510 
524  float getPaddingY() const { return _padding.y; }
525 
542  void setPadding(const Vec2& padding) {
543  setPadding(padding.x,padding.y);
544  }
545 
563  void setPadding(float padx, float pady);
564 
578  void setPaddingX(float padx) {
579  setPadding(padx,_padding.y);
580  }
581 
595  void setPaddingY(float pady) {
596  setPadding(_padding.x,pady);
597  }
598 
608 
617  void setHorizontalAlignment(HAlign halign);
618 
627  VAlign getVerticalAlignment() const { return _valign; }
628 
637  void setVerticalAlignment(VAlign valign);
638 
656  const Rect& getTextBounds() const { return _textbounds; }
657 
675  const Rect getTrueBounds() const {
676  return Rect(_textbounds.origin+_truebounds.origin,_truebounds.size);
677  }
678 
687  float getBaseLine() const;
688 
705  virtual void setContentSize(const Size& size) override;
706 
721  virtual void setContentSize(float width, float height) override {
722  setContentSize(Size(width, height));
723  }
724 
725 #pragma mark -
726 #pragma mark Other Attributes
727 
735  Color4 getForeground() const { return _foreground; }
736 
745  void setForeground(Color4 color) { _foreground = color; updateColor(); }
746 
756  Color4 getBackground() const { return _background; }
757 
767  void setBackground(Color4 color);
768 
774  std::shared_ptr<Font> getFont() const { return _font; }
775 
784  void setFont(const std::shared_ptr<Font>& font, bool resize=false);
785 
786 #pragma mark -
787 #pragma mark Rendering
788 
806  void setBlendFunc(GLenum srcFactor, GLenum dstFactor) { _srcFactor = srcFactor; _dstFactor = dstFactor; }
807 
820  GLenum getSourceBlendFactor() const { return _srcFactor; }
821 
834  GLenum getDestinationBlendFactor() const { return _srcFactor; }
835 
851  void setBlendEquation(GLenum equation) { _blendEquation = equation; }
852 
865  GLenum getBlendEquation() const { return _blendEquation; }
866 
890  virtual void draw(const std::shared_ptr<SpriteBatch>& batch, const Mat4& transform, Color4 tint) override;
891 
892 private:
893 #pragma mark -
894 #pragma mark Internal Helpers
895 
905  void computeSize();
906 
910  void generateRenderData();
911 
915  void clearRenderData();
916 
923  void updateColor();
924 };
925 
926 }
927 #endif /* __CU_LABEL_H__ */
Definition: CUSize.h:57
virtual void setContentSize(const Size &size) override
float x
Definition: CUVec2.h:66
GLenum _srcFactor
Definition: CULabel.h:214
float y
Definition: CUVec2.h:68
const Rect & getTextBounds() const
Definition: CULabel.h:656
bool _rendered
Definition: CULabel.h:219
Definition: CUVec2.h:61
Rect _textbounds
Definition: CULabel.h:195
bool initWithText(const char *text, const std::shared_ptr< Font > &font)
Definition: CULabel.h:296
void setPaddingX(float padx)
Definition: CULabel.h:578
virtual void draw(const std::shared_ptr< SpriteBatch > &batch, const Mat4 &transform, Color4 tint) override
const std::string & getText() const
Definition: CULabel.h:455
VAlign _valign
Definition: CULabel.h:204
Definition: CUNode.h:92
~Label()
Definition: CULabel.h:242
VAlign getVerticalAlignment() const
Definition: CULabel.h:627
GLenum _blendEquation
Definition: CULabel.h:212
GLenum getDestinationBlendFactor() const
Definition: CULabel.h:834
static std::shared_ptr< Label > alloc(const std::string &text, const std::shared_ptr< Font > &font)
Definition: CULabel.h:380
Vec2 _padding
Definition: CULabel.h:200
virtual bool initWithData(const SceneLoader *loader, const std::shared_ptr< JsonValue > &data) override
GLenum getSourceBlendFactor() const
Definition: CULabel.h:820
HAlign _halign
Definition: CULabel.h:202
std::vector< Vertex2 > _vertices
Definition: CULabel.h:221
virtual void setText(const std::string &text, bool resize=false)
std::shared_ptr< Font > getFont() const
Definition: CULabel.h:774
Color4 getBackground() const
Definition: CULabel.h:756
Color4 getForeground() const
Definition: CULabel.h:735
const Vec2 & getPadding() const
Definition: CULabel.h:494
float getBaseLine() const
Color4 _foreground
Definition: CULabel.h:207
static std::shared_ptr< Label > alloc(const char *text, const std::shared_ptr< Font > &font)
Definition: CULabel.h:405
void setPaddingY(float pady)
Definition: CULabel.h:595
HAlign
Definition: CULabel.h:85
void setBackground(Color4 color)
void setForeground(Color4 color)
Definition: CULabel.h:745
Color4 _background
Definition: CULabel.h:209
virtual bool init() override
Definition: CULabel.h:262
void setBlendEquation(GLenum equation)
Definition: CULabel.h:851
GLenum getBlendEquation() const
Definition: CULabel.h:865
Rect _truebounds
Definition: CULabel.h:197
virtual void dispose() override
GLenum _dstFactor
Definition: CULabel.h:216
Definition: CURect.h:45
void setPadding(const Vec2 &padding)
Definition: CULabel.h:542
Vec2 origin
Definition: CURect.h:49
void setFont(const std::shared_ptr< Font > &font, bool resize=false)
std::vector< unsigned short > _indices
Definition: CULabel.h:223
float getPaddingX() const
Definition: CULabel.h:509
Definition: CUSceneLoader.h:77
std::string _text
Definition: CULabel.h:193
std::shared_ptr< Font > _font
Definition: CULabel.h:190
Size size
Definition: CURect.h:51
static std::shared_ptr< Node > allocWithData(const SceneLoader *loader, const std::shared_ptr< JsonValue > &data)
Definition: CULabel.h:435
void setBlendFunc(GLenum srcFactor, GLenum dstFactor)
Definition: CULabel.h:806
Definition: CUColor4.h:1084
Definition: CULabel.h:74
float getPaddingY() const
Definition: CULabel.h:524
Definition: CUAction.h:51
static std::shared_ptr< Label > alloc(const Size &size, const std::shared_ptr< Font > &font)
Definition: CULabel.h:358
VAlign
Definition: CULabel.h:137
Definition: CUMat4.h:83
void setVerticalAlignment(VAlign valign)
virtual void setContentSize(float width, float height) override
Definition: CULabel.h:721
const Rect getTrueBounds() const
Definition: CULabel.h:675
void setHorizontalAlignment(HAlign halign)
HAlign getHorizontalAlignment() const
Definition: CULabel.h:607