1/**************************************************************************/
2/* label.h */
3/**************************************************************************/
4/* This file is part of: */
5/* GODOT ENGINE */
6/* https://godotengine.org */
7/**************************************************************************/
8/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10/* */
11/* Permission is hereby granted, free of charge, to any person obtaining */
12/* a copy of this software and associated documentation files (the */
13/* "Software"), to deal in the Software without restriction, including */
14/* without limitation the rights to use, copy, modify, merge, publish, */
15/* distribute, sublicense, and/or sell copies of the Software, and to */
16/* permit persons to whom the Software is furnished to do so, subject to */
17/* the following conditions: */
18/* */
19/* The above copyright notice and this permission notice shall be */
20/* included in all copies or substantial portions of the Software. */
21/* */
22/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29/**************************************************************************/
30
31#ifndef LABEL_H
32#define LABEL_H
33
34#include "scene/gui/control.h"
35#include "scene/resources/label_settings.h"
36
37class Label : public Control {
38 GDCLASS(Label, Control);
39
40private:
41 HorizontalAlignment horizontal_alignment = HORIZONTAL_ALIGNMENT_LEFT;
42 VerticalAlignment vertical_alignment = VERTICAL_ALIGNMENT_TOP;
43 String text;
44 String xl_text;
45 TextServer::AutowrapMode autowrap_mode = TextServer::AUTOWRAP_OFF;
46 BitField<TextServer::JustificationFlag> jst_flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_SKIP_LAST_LINE | TextServer::JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE;
47 bool clip = false;
48 TextServer::OverrunBehavior overrun_behavior = TextServer::OVERRUN_NO_TRIMMING;
49 Size2 minsize;
50 bool uppercase = false;
51
52 bool lines_dirty = true;
53 bool dirty = true;
54 bool font_dirty = true;
55 RID text_rid;
56 Vector<RID> lines_rid;
57
58 String language;
59 TextDirection text_direction = TEXT_DIRECTION_AUTO;
60 TextServer::StructuredTextParser st_parser = TextServer::STRUCTURED_TEXT_DEFAULT;
61 Array st_args;
62
63 TextServer::VisibleCharactersBehavior visible_chars_behavior = TextServer::VC_CHARS_BEFORE_SHAPING;
64 int visible_chars = -1;
65 float visible_ratio = 1.0;
66 int lines_skipped = 0;
67 int max_lines_visible = -1;
68 PackedFloat32Array tab_stops;
69
70 Ref<LabelSettings> settings;
71
72 struct ThemeCache {
73 Ref<StyleBox> normal_style;
74 Ref<Font> font;
75
76 int font_size = 0;
77 int line_spacing = 0;
78 Color font_color;
79 Color font_shadow_color;
80 Point2 font_shadow_offset;
81 Color font_outline_color;
82 int font_outline_size;
83 int font_shadow_outline_size;
84 } theme_cache;
85
86 void _update_visible();
87 void _shape();
88 void _invalidate();
89
90protected:
91 void _notification(int p_what);
92 static void _bind_methods();
93
94public:
95 virtual Size2 get_minimum_size() const override;
96 virtual PackedStringArray get_configuration_warnings() const override;
97
98 void set_horizontal_alignment(HorizontalAlignment p_alignment);
99 HorizontalAlignment get_horizontal_alignment() const;
100
101 void set_vertical_alignment(VerticalAlignment p_alignment);
102 VerticalAlignment get_vertical_alignment() const;
103
104 void set_text(const String &p_string);
105 String get_text() const;
106
107 void set_label_settings(const Ref<LabelSettings> &p_settings);
108 Ref<LabelSettings> get_label_settings() const;
109
110 void set_text_direction(TextDirection p_text_direction);
111 TextDirection get_text_direction() const;
112
113 void set_language(const String &p_language);
114 String get_language() const;
115
116 void set_structured_text_bidi_override(TextServer::StructuredTextParser p_parser);
117 TextServer::StructuredTextParser get_structured_text_bidi_override() const;
118
119 void set_structured_text_bidi_override_options(Array p_args);
120 Array get_structured_text_bidi_override_options() const;
121
122 void set_autowrap_mode(TextServer::AutowrapMode p_mode);
123 TextServer::AutowrapMode get_autowrap_mode() const;
124
125 void set_justification_flags(BitField<TextServer::JustificationFlag> p_flags);
126 BitField<TextServer::JustificationFlag> get_justification_flags() const;
127
128 void set_uppercase(bool p_uppercase);
129 bool is_uppercase() const;
130
131 void set_visible_characters_behavior(TextServer::VisibleCharactersBehavior p_behavior);
132 TextServer::VisibleCharactersBehavior get_visible_characters_behavior() const;
133
134 void set_visible_characters(int p_amount);
135 int get_visible_characters() const;
136 int get_total_character_count() const;
137
138 void set_visible_ratio(float p_ratio);
139 float get_visible_ratio() const;
140
141 void set_clip_text(bool p_clip);
142 bool is_clipping_text() const;
143
144 void set_tab_stops(const PackedFloat32Array &p_tab_stops);
145 PackedFloat32Array get_tab_stops() const;
146
147 void set_text_overrun_behavior(TextServer::OverrunBehavior p_behavior);
148 TextServer::OverrunBehavior get_text_overrun_behavior() const;
149
150 void set_lines_skipped(int p_lines);
151 int get_lines_skipped() const;
152
153 void set_max_lines_visible(int p_lines);
154 int get_max_lines_visible() const;
155
156 int get_line_height(int p_line = -1) const;
157 int get_line_count() const;
158 int get_visible_line_count() const;
159
160 Label(const String &p_text = String());
161 ~Label();
162};
163
164#endif // LABEL_H
165