1 /**
2 * Copyright © Novelate 2020
3 * License: MIT (https://github.com/Novelate/NovelateEngine/blob/master/LICENSE)
4 * Author: Jacob Jensen (bausshf)
5 * Website: https://novelate.com/
6 * ------
7 * Novelate is a free and open-source visual novel engine and framework written in the D programming language.
8 * It can be used freely for both personal and commercial projects.
9 * ------
10 * Module Description:
11 * A label is a simple component for displaying text.
12 */
13 module novelate.label;
14 
15 import std.datetime;
16 
17 import novelate.component;
18 import novelate.fonts;
19 import novelate.config;
20 
21 /// Wrapper around a label component.
22 final class Label : Component
23 {
24   private:
25   /// The text component.
26   ExternalText _textComponent;
27   /// The text.
28   dstring _text;
29   /// The font name.
30   string _fontName;
31   /// The font.
32   ExternalFont _font;
33   /// The font size.
34   size_t _fontSize;
35   /// The color.
36   Paint _color;
37 
38   public:
39   final:
40   /// Creates a new label.
41   this()
42   {
43     super();
44 
45     _fontName = config.defaultFont;
46     _font = retrieveFont(_fontName, FontStyle.normal);
47     _fontSize = config.defaultFontSize;
48 
49     _textComponent = new ExternalText;
50     _textComponent.setFont(_font);
51     _textComponent.setString("");
52     _textComponent.setCharacterSize(_fontSize);
53   }
54 
55   @property
56   {
57     /// Gets the text.
58     dstring text() { return _text; }
59 
60     /// Sets the text.
61     void text(dstring newText)
62     {
63       _text = newText;
64 
65       _textComponent.setString(_text);
66 
67       auto bounds = _textComponent.bounds;
68 
69       super.size = FloatVector(bounds.x, bounds.y);
70     }
71 
72     /// Gets the font name.
73     string fontName() { return _fontName; }
74 
75     /// Sets the font name.
76     void fontName(string newFontName)
77     {
78       _fontName = newFontName;
79 
80       _font = retrieveFont(_fontName, FontStyle.normal);
81       _textComponent.setFont(_font);
82     }
83 
84     /// Gets the font size.
85     size_t fontSize() { return _fontSize; }
86 
87     /// Sets the font size.
88     void fontSize(size_t newFontSize)
89     {
90       _fontSize = newFontSize;
91 
92       _textComponent.setCharacterSize(_fontSize);
93     }
94 
95     /// Gets the color.
96     Paint color() { return _color; }
97 
98     /// Sets the color.
99     void color(Paint newColor)
100     {
101       _color = newColor;
102 
103       _textComponent.setColor(_color);
104     }
105   }
106 
107   /// See: Component.render()
108   override void render(ExternalWindow window)
109   {
110     _textComponent.draw(window);
111   }
112 
113   /// See: Component.refresh()
114   override void refresh(size_t width, size_t height)
115   {
116     size_t boxHeight;
117     if (width == 800)
118     {
119       boxHeight = config.defaultDialogueHeight800;
120     }
121     else if (width == 1024)
122     {
123       boxHeight = config.defaultDialogueHeight1024;
124     }
125     else if (width == 1280)
126     {
127       boxHeight = config.defaultDialogueHeight1280;
128     }
129 
130     _textComponent.position = FloatVector(config.defaultDialogueMargin + config.defaultDialoguePadding, ((height + config.defaultDialoguePadding) - boxHeight));
131 
132     updateInternalPosition(_textComponent.position);
133   }
134 
135   /// See: Component.updateSize()
136   override void updateSize()
137   {
138   }
139 
140   /// See: Component.updatePosition()
141   override void updatePosition()
142   {
143     _textComponent.position = super.position;
144   }
145 }