1/**************************************************************************/
2/* rich_text_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 RICH_TEXT_LABEL_H
32#define RICH_TEXT_LABEL_H
33
34#include "core/object/worker_thread_pool.h"
35#include "scene/gui/popup_menu.h"
36#include "scene/gui/rich_text_effect.h"
37#include "scene/gui/scroll_bar.h"
38#include "scene/resources/text_paragraph.h"
39
40class RichTextLabel : public Control {
41 GDCLASS(RichTextLabel, Control);
42
43public:
44 enum ListType {
45 LIST_NUMBERS,
46 LIST_LETTERS,
47 LIST_ROMAN,
48 LIST_DOTS
49 };
50
51 enum ItemType {
52 ITEM_FRAME,
53 ITEM_TEXT,
54 ITEM_IMAGE,
55 ITEM_NEWLINE,
56 ITEM_FONT,
57 ITEM_FONT_SIZE,
58 ITEM_FONT_FEATURES,
59 ITEM_COLOR,
60 ITEM_OUTLINE_SIZE,
61 ITEM_OUTLINE_COLOR,
62 ITEM_UNDERLINE,
63 ITEM_STRIKETHROUGH,
64 ITEM_PARAGRAPH,
65 ITEM_INDENT,
66 ITEM_LIST,
67 ITEM_TABLE,
68 ITEM_FADE,
69 ITEM_SHAKE,
70 ITEM_WAVE,
71 ITEM_TORNADO,
72 ITEM_RAINBOW,
73 ITEM_PULSE,
74 ITEM_BGCOLOR,
75 ITEM_FGCOLOR,
76 ITEM_META,
77 ITEM_HINT,
78 ITEM_DROPCAP,
79 ITEM_CUSTOMFX,
80 ITEM_CONTEXT,
81 ITEM_LANGUAGE,
82 };
83
84 enum MenuItems {
85 MENU_COPY,
86 MENU_SELECT_ALL,
87 MENU_MAX
88 };
89
90 enum DefaultFont {
91 NORMAL_FONT,
92 BOLD_FONT,
93 ITALICS_FONT,
94 BOLD_ITALICS_FONT,
95 MONO_FONT,
96 CUSTOM_FONT,
97 };
98
99protected:
100 virtual void _update_theme_item_cache() override;
101
102 void _notification(int p_what);
103 static void _bind_methods();
104
105private:
106 struct Item;
107
108 struct Line {
109 Item *from = nullptr;
110
111 Ref<TextParagraph> text_buf;
112 Color dc_color;
113 int dc_ol_size = 0;
114 Color dc_ol_color;
115
116 Vector2 offset;
117 int char_offset = 0;
118 int char_count = 0;
119
120 Line() { text_buf.instantiate(); }
121
122 _FORCE_INLINE_ float get_height(float line_separation) const {
123 return offset.y + text_buf->get_size().y + text_buf->get_line_count() * line_separation;
124 }
125 };
126
127 struct Item {
128 int index = 0;
129 int char_ofs = 0;
130 Item *parent = nullptr;
131 ItemType type = ITEM_FRAME;
132 List<Item *> subitems;
133 List<Item *>::Element *E = nullptr;
134 int line = 0;
135
136 void _clear_children() {
137 while (subitems.size()) {
138 memdelete(subitems.front()->get());
139 subitems.pop_front();
140 }
141 }
142
143 virtual ~Item() { _clear_children(); }
144 };
145
146 struct ItemFrame : public Item {
147 bool cell = false;
148
149 LocalVector<Line> lines;
150 std::atomic<int> first_invalid_line;
151 std::atomic<int> first_invalid_font_line;
152 std::atomic<int> first_resized_line;
153
154 ItemFrame *parent_frame = nullptr;
155
156 Color odd_row_bg = Color(0, 0, 0, 0);
157 Color even_row_bg = Color(0, 0, 0, 0);
158 Color border = Color(0, 0, 0, 0);
159 Size2 min_size_over = Size2(-1, -1);
160 Size2 max_size_over = Size2(-1, -1);
161 Rect2 padding;
162
163 ItemFrame() {
164 type = ITEM_FRAME;
165 first_invalid_line.store(0);
166 first_invalid_font_line.store(0);
167 first_resized_line.store(0);
168 }
169 };
170
171 struct ItemText : public Item {
172 String text;
173 ItemText() { type = ITEM_TEXT; }
174 };
175
176 struct ItemDropcap : public Item {
177 String text;
178 Ref<Font> font;
179 int font_size = 0;
180 Color color;
181 int ol_size = 0;
182 Color ol_color;
183 Rect2 dropcap_margins;
184 ItemDropcap() { type = ITEM_DROPCAP; }
185 };
186
187 struct ItemImage : public Item {
188 Ref<Texture2D> image;
189 InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER;
190 Size2 size;
191 Color color;
192 ItemImage() { type = ITEM_IMAGE; }
193 };
194
195 struct ItemFont : public Item {
196 DefaultFont def_font = CUSTOM_FONT;
197 Ref<Font> font;
198 bool variation = false;
199 bool def_size = false;
200 int font_size = 0;
201 ItemFont() { type = ITEM_FONT; }
202 };
203
204 struct ItemFontSize : public Item {
205 int font_size = 16;
206 ItemFontSize() { type = ITEM_FONT_SIZE; }
207 };
208
209 struct ItemColor : public Item {
210 Color color;
211 ItemColor() { type = ITEM_COLOR; }
212 };
213
214 struct ItemOutlineSize : public Item {
215 int outline_size = 0;
216 ItemOutlineSize() { type = ITEM_OUTLINE_SIZE; }
217 };
218
219 struct ItemOutlineColor : public Item {
220 Color color;
221 ItemOutlineColor() { type = ITEM_OUTLINE_COLOR; }
222 };
223
224 struct ItemUnderline : public Item {
225 ItemUnderline() { type = ITEM_UNDERLINE; }
226 };
227
228 struct ItemStrikethrough : public Item {
229 ItemStrikethrough() { type = ITEM_STRIKETHROUGH; }
230 };
231
232 struct ItemMeta : public Item {
233 Variant meta;
234 ItemMeta() { type = ITEM_META; }
235 };
236
237 struct ItemHint : public Item {
238 String description;
239 ItemHint() { type = ITEM_HINT; }
240 };
241
242 struct ItemLanguage : public Item {
243 String language;
244 ItemLanguage() { type = ITEM_LANGUAGE; }
245 };
246
247 struct ItemParagraph : public Item {
248 HorizontalAlignment alignment = HORIZONTAL_ALIGNMENT_LEFT;
249 String language;
250 Control::TextDirection direction = Control::TEXT_DIRECTION_AUTO;
251 TextServer::StructuredTextParser st_parser = TextServer::STRUCTURED_TEXT_DEFAULT;
252 BitField<TextServer::JustificationFlag> jst_flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_SKIP_LAST_LINE | TextServer::JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE;
253 PackedFloat32Array tab_stops;
254 ItemParagraph() { type = ITEM_PARAGRAPH; }
255 };
256
257 struct ItemIndent : public Item {
258 int level = 0;
259 ItemIndent() { type = ITEM_INDENT; }
260 };
261
262 struct ItemList : public Item {
263 ListType list_type = LIST_DOTS;
264 bool capitalize = false;
265 int level = 0;
266 String bullet = U"•";
267 ItemList() { type = ITEM_LIST; }
268 };
269
270 struct ItemNewline : public Item {
271 ItemNewline() { type = ITEM_NEWLINE; }
272 };
273
274 struct ItemTable : public Item {
275 struct Column {
276 bool expand = false;
277 int expand_ratio = 0;
278 int min_width = 0;
279 int max_width = 0;
280 int width = 0;
281 };
282
283 LocalVector<Column> columns;
284 LocalVector<float> rows;
285 LocalVector<float> rows_baseline;
286
287 int align_to_row = -1;
288 int total_width = 0;
289 int total_height = 0;
290 InlineAlignment inline_align = INLINE_ALIGNMENT_TOP;
291 ItemTable() { type = ITEM_TABLE; }
292 };
293
294 struct ItemFade : public Item {
295 int starting_index = 0;
296 int length = 0;
297
298 ItemFade() { type = ITEM_FADE; }
299 };
300
301 struct ItemFX : public Item {
302 double elapsed_time = 0.f;
303 bool connected = true;
304 };
305
306 struct ItemShake : public ItemFX {
307 int strength = 0;
308 float rate = 0.0f;
309 uint64_t _current_rng = 0;
310 uint64_t _previous_rng = 0;
311 Vector2 prev_off;
312
313 ItemShake() { type = ITEM_SHAKE; }
314
315 void reroll_random() {
316 _previous_rng = _current_rng;
317 _current_rng = Math::rand();
318 }
319
320 uint64_t offset_random(int p_index) {
321 return (_current_rng >> (p_index % 64)) |
322 (_current_rng << (64 - (p_index % 64)));
323 }
324
325 uint64_t offset_previous_random(int p_index) {
326 return (_previous_rng >> (p_index % 64)) |
327 (_previous_rng << (64 - (p_index % 64)));
328 }
329 };
330
331 struct ItemWave : public ItemFX {
332 float frequency = 1.0f;
333 float amplitude = 1.0f;
334 Vector2 prev_off;
335
336 ItemWave() { type = ITEM_WAVE; }
337 };
338
339 struct ItemTornado : public ItemFX {
340 float radius = 1.0f;
341 float frequency = 1.0f;
342 Vector2 prev_off;
343
344 ItemTornado() { type = ITEM_TORNADO; }
345 };
346
347 struct ItemRainbow : public ItemFX {
348 float saturation = 0.8f;
349 float value = 0.8f;
350 float frequency = 1.0f;
351
352 ItemRainbow() { type = ITEM_RAINBOW; }
353 };
354
355 struct ItemPulse : public ItemFX {
356 Color color = Color(1.0, 1.0, 1.0, 0.25);
357 float frequency = 1.0f;
358 float ease = -2.0f;
359
360 ItemPulse() { type = ITEM_PULSE; }
361 };
362
363 struct ItemBGColor : public Item {
364 Color color;
365 ItemBGColor() { type = ITEM_BGCOLOR; }
366 };
367
368 struct ItemFGColor : public Item {
369 Color color;
370 ItemFGColor() { type = ITEM_FGCOLOR; }
371 };
372
373 struct ItemCustomFX : public ItemFX {
374 Ref<CharFXTransform> char_fx_transform;
375 Ref<RichTextEffect> custom_effect;
376
377 ItemCustomFX() {
378 type = ITEM_CUSTOMFX;
379 char_fx_transform.instantiate();
380 }
381
382 virtual ~ItemCustomFX() {
383 _clear_children();
384
385 char_fx_transform.unref();
386 custom_effect.unref();
387 }
388 };
389
390 struct ItemContext : public Item {
391 ItemContext() { type = ITEM_CONTEXT; }
392 };
393
394 ItemFrame *main = nullptr;
395 Item *current = nullptr;
396 ItemFrame *current_frame = nullptr;
397
398 WorkerThreadPool::TaskID task = WorkerThreadPool::INVALID_TASK_ID;
399 Mutex data_mutex;
400 bool threaded = false;
401 std::atomic<bool> stop_thread;
402 std::atomic<bool> updating;
403 std::atomic<bool> validating;
404 std::atomic<double> loaded;
405
406 uint64_t loading_started = 0;
407 int progress_delay = 1000;
408
409 VScrollBar *vscroll = nullptr;
410
411 TextServer::AutowrapMode autowrap_mode = TextServer::AUTOWRAP_WORD_SMART;
412
413 bool scroll_visible = false;
414 bool scroll_follow = false;
415 bool scroll_following = false;
416 bool scroll_active = true;
417 int scroll_w = 0;
418 bool scroll_updated = false;
419 bool updating_scroll = false;
420 int current_idx = 1;
421 int current_char_ofs = 0;
422 int visible_paragraph_count = 0;
423 int visible_line_count = 0;
424
425 int tab_size = 4;
426 bool underline_meta = true;
427 bool underline_hint = true;
428 bool use_selected_font_color = false;
429
430 HorizontalAlignment default_alignment = HORIZONTAL_ALIGNMENT_LEFT;
431 BitField<TextServer::JustificationFlag> default_jst_flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_SKIP_LAST_LINE | TextServer::JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE;
432
433 ItemMeta *meta_hovering = nullptr;
434 Variant current_meta;
435
436 Array custom_effects;
437
438 void _invalidate_current_line(ItemFrame *p_frame);
439
440 void _thread_function(void *p_userdata);
441 void _thread_end();
442 void _stop_thread();
443 bool _validate_line_caches();
444 void _process_line_caches();
445 _FORCE_INLINE_ float _update_scroll_exceeds(float p_total_height, float p_ctrl_height, float p_width, int p_idx, float p_old_scroll, float p_text_rect_height);
446
447 void _add_item(Item *p_item, bool p_enter = false, bool p_ensure_newline = false);
448 void _remove_item(Item *p_item, const int p_line, const int p_subitem_line);
449
450 String language;
451 TextDirection text_direction = TEXT_DIRECTION_AUTO;
452 TextServer::StructuredTextParser st_parser = TextServer::STRUCTURED_TEXT_DEFAULT;
453 Array st_args;
454
455 struct Selection {
456 ItemFrame *click_frame = nullptr;
457 int click_line = 0;
458 Item *click_item = nullptr;
459 int click_char = 0;
460
461 ItemFrame *from_frame = nullptr;
462 int from_line = 0;
463 Item *from_item = nullptr;
464 int from_char = 0;
465
466 ItemFrame *to_frame = nullptr;
467 int to_line = 0;
468 Item *to_item = nullptr;
469 int to_char = 0;
470
471 bool active = false; // anything selected? i.e. from, to, etc. valid?
472 bool enabled = false; // allow selections?
473 bool drag_attempt = false;
474 };
475
476 Selection selection;
477 bool deselect_on_focus_loss_enabled = true;
478 bool drag_and_drop_selection_enabled = true;
479
480 bool context_menu_enabled = false;
481 bool shortcut_keys_enabled = true;
482
483 // Context menu.
484 PopupMenu *menu = nullptr;
485 void _generate_context_menu();
486 void _update_context_menu();
487 Key _get_menu_action_accelerator(const String &p_action);
488
489 int visible_characters = -1;
490 float visible_ratio = 1.0;
491 TextServer::VisibleCharactersBehavior visible_chars_behavior = TextServer::VC_CHARS_BEFORE_SHAPING;
492
493 bool _is_click_inside_selection() const;
494 void _find_click(ItemFrame *p_frame, const Point2i &p_click, ItemFrame **r_click_frame = nullptr, int *r_click_line = nullptr, Item **r_click_item = nullptr, int *r_click_char = nullptr, bool *r_outside = nullptr, bool p_meta = false);
495
496 String _get_line_text(ItemFrame *p_frame, int p_line, Selection p_sel) const;
497 bool _search_line(ItemFrame *p_frame, int p_line, const String &p_string, int p_char_idx, bool p_reverse_search);
498 bool _search_table(ItemTable *p_table, List<Item *>::Element *p_from, const String &p_string, bool p_reverse_search);
499
500 float _shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> &p_base_font, int p_base_font_size, int p_width, float p_h, int *r_char_offset);
501 float _resize_line(ItemFrame *p_frame, int p_line, const Ref<Font> &p_base_font, int p_base_font_size, int p_width, float p_h);
502
503 void _update_line_font(ItemFrame *p_frame, int p_line, const Ref<Font> &p_base_font, int p_base_font_size);
504 int _draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, const Color &p_base_color, int p_outline_size, const Color &p_outline_color, const Color &p_font_shadow_color, int p_shadow_outline_size, const Point2 &p_shadow_ofs, int &r_processed_glyphs);
505 float _find_click_in_line(ItemFrame *p_frame, int p_line, const Vector2 &p_ofs, int p_width, const Point2i &p_click, ItemFrame **r_click_frame = nullptr, int *r_click_line = nullptr, Item **r_click_item = nullptr, int *r_click_char = nullptr, bool p_table = false, bool p_meta = false);
506
507 String _roman(int p_num, bool p_capitalize) const;
508 String _letters(int p_num, bool p_capitalize) const;
509
510 Item *_find_indentable(Item *p_item);
511 Item *_get_item_at_pos(Item *p_item_from, Item *p_item_to, int p_position);
512 void _find_frame(Item *p_item, ItemFrame **r_frame, int *r_line);
513 ItemFontSize *_find_font_size(Item *p_item);
514 ItemFont *_find_font(Item *p_item);
515 int _find_outline_size(Item *p_item, int p_default);
516 ItemList *_find_list_item(Item *p_item);
517 ItemDropcap *_find_dc_item(Item *p_item);
518 int _find_list(Item *p_item, Vector<int> &r_index, Vector<ItemList *> &r_list);
519 int _find_margin(Item *p_item, const Ref<Font> &p_base_font, int p_base_font_size);
520 PackedFloat32Array _find_tab_stops(Item *p_item);
521 HorizontalAlignment _find_alignment(Item *p_item);
522 BitField<TextServer::JustificationFlag> _find_jst_flags(Item *p_item);
523 TextServer::Direction _find_direction(Item *p_item);
524 TextServer::StructuredTextParser _find_stt(Item *p_item);
525 String _find_language(Item *p_item);
526 Color _find_color(Item *p_item, const Color &p_default_color);
527 Color _find_outline_color(Item *p_item, const Color &p_default_color);
528 bool _find_underline(Item *p_item);
529 bool _find_strikethrough(Item *p_item);
530 bool _find_meta(Item *p_item, Variant *r_meta, ItemMeta **r_item = nullptr);
531 bool _find_hint(Item *p_item, String *r_description);
532 Color _find_bgcolor(Item *p_item);
533 Color _find_fgcolor(Item *p_item);
534 bool _find_layout_subitem(Item *from, Item *to);
535 void _fetch_item_fx_stack(Item *p_item, Vector<ItemFX *> &r_stack);
536 void _normalize_subtags(Vector<String> &subtags);
537
538 void _update_fx(ItemFrame *p_frame, double p_delta_time);
539 void _scroll_changed(double);
540 int _find_first_line(int p_from, int p_to, int p_vofs) const;
541
542 _FORCE_INLINE_ float _calculate_line_vertical_offset(const Line &line) const;
543
544 virtual void gui_input(const Ref<InputEvent> &p_event) override;
545 virtual String get_tooltip(const Point2 &p_pos) const override;
546 Item *_get_next_item(Item *p_item, bool p_free = false) const;
547 Item *_get_prev_item(Item *p_item, bool p_free = false) const;
548
549 Rect2 _get_text_rect();
550 Ref<RichTextEffect> _get_custom_effect_by_code(String p_bbcode_identifier);
551 virtual Dictionary parse_expressions_for_values(Vector<String> p_expressions);
552
553 void _draw_fbg_boxes(RID p_ci, RID p_rid, Vector2 line_off, Item *it_from, Item *it_to, int start, int end, int fbg_flag);
554#ifndef DISABLE_DEPRECATED
555 // Kept for compatibility from 3.x to 4.0.
556 bool _set(const StringName &p_name, const Variant &p_value);
557#endif
558 bool use_bbcode = false;
559 String text;
560 void _apply_translation();
561
562 bool fit_content = false;
563
564 struct ThemeCache {
565 Ref<StyleBox> normal_style;
566 Ref<StyleBox> focus_style;
567 Ref<StyleBox> progress_bg_style;
568 Ref<StyleBox> progress_fg_style;
569
570 int line_separation;
571
572 Ref<Font> normal_font;
573 int normal_font_size;
574
575 Color default_color;
576 Color font_selected_color;
577 Color selection_color;
578 Color font_outline_color;
579 Color font_shadow_color;
580 int shadow_outline_size;
581 int shadow_offset_x;
582 int shadow_offset_y;
583 int outline_size;
584 Color outline_color;
585
586 Ref<Font> bold_font;
587 int bold_font_size;
588 Ref<Font> bold_italics_font;
589 int bold_italics_font_size;
590 Ref<Font> italics_font;
591 int italics_font_size;
592 Ref<Font> mono_font;
593 int mono_font_size;
594
595 int text_highlight_h_padding;
596 int text_highlight_v_padding;
597
598 int table_h_separation;
599 int table_v_separation;
600 Color table_odd_row_bg;
601 Color table_even_row_bg;
602 Color table_border;
603
604 float base_scale = 1.0;
605 } theme_cache;
606
607public:
608 String get_parsed_text() const;
609 void add_text(const String &p_text);
610 void add_image(const Ref<Texture2D> &p_image, const int p_width = 0, const int p_height = 0, const Color &p_color = Color(1.0, 1.0, 1.0), InlineAlignment p_alignment = INLINE_ALIGNMENT_CENTER, const Rect2 &p_region = Rect2(0, 0, 0, 0));
611 void add_newline();
612 bool remove_paragraph(const int p_paragraph);
613 void push_dropcap(const String &p_string, const Ref<Font> &p_font, int p_size, const Rect2 &p_dropcap_margins = Rect2(), const Color &p_color = Color(1, 1, 1), int p_ol_size = 0, const Color &p_ol_color = Color(0, 0, 0, 0));
614 void _push_def_font(DefaultFont p_def_font);
615 void _push_def_font_var(DefaultFont p_def_font, const Ref<Font> &p_font, int p_size = -1);
616 void push_font(const Ref<Font> &p_font, int p_size = 0);
617 void push_font_size(int p_font_size);
618 void push_outline_size(int p_font_size);
619 void push_normal();
620 void push_bold();
621 void push_bold_italics();
622 void push_italics();
623 void push_mono();
624 void push_color(const Color &p_color);
625 void push_outline_color(const Color &p_color);
626 void push_underline();
627 void push_strikethrough();
628 void push_language(const String &p_language);
629 void push_paragraph(HorizontalAlignment p_alignment, Control::TextDirection p_direction = Control::TEXT_DIRECTION_INHERITED, const String &p_language = "", TextServer::StructuredTextParser p_st_parser = TextServer::STRUCTURED_TEXT_DEFAULT, BitField<TextServer::JustificationFlag> p_jst_flags = TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_SKIP_LAST_LINE | TextServer::JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE, const PackedFloat32Array &p_tab_stops = PackedFloat32Array());
630 void push_indent(int p_level);
631 void push_list(int p_level, ListType p_list, bool p_capitalize, const String &p_bullet = String::utf8("•"));
632 void push_meta(const Variant &p_meta);
633 void push_hint(const String &p_string);
634 void push_table(int p_columns, InlineAlignment p_alignment = INLINE_ALIGNMENT_TOP, int p_align_to_row = -1);
635 void push_fade(int p_start_index, int p_length);
636 void push_shake(int p_strength, float p_rate, bool p_connected);
637 void push_wave(float p_frequency, float p_amplitude, bool p_connected);
638 void push_tornado(float p_frequency, float p_radius, bool p_connected);
639 void push_rainbow(float p_saturation, float p_value, float p_frequency);
640 void push_pulse(const Color &p_color, float p_frequency, float p_ease);
641 void push_bgcolor(const Color &p_color);
642 void push_fgcolor(const Color &p_color);
643 void push_customfx(Ref<RichTextEffect> p_custom_effect, Dictionary p_environment);
644 void push_context();
645 void set_table_column_expand(int p_column, bool p_expand, int p_ratio = 1);
646 void set_cell_row_background_color(const Color &p_odd_row_bg, const Color &p_even_row_bg);
647 void set_cell_border_color(const Color &p_color);
648 void set_cell_size_override(const Size2 &p_min_size, const Size2 &p_max_size);
649 void set_cell_padding(const Rect2 &p_padding);
650 int get_current_table_column() const;
651 void push_cell();
652 void pop();
653 void pop_context();
654 void pop_all();
655
656 void clear();
657
658 void set_offset(int p_pixel);
659
660 void set_meta_underline(bool p_underline);
661 bool is_meta_underlined() const;
662
663 void set_hint_underline(bool p_underline);
664 bool is_hint_underlined() const;
665
666 void set_scroll_active(bool p_active);
667 bool is_scroll_active() const;
668
669 void set_scroll_follow(bool p_follow);
670 bool is_scroll_following() const;
671
672 void set_tab_size(int p_spaces);
673 int get_tab_size() const;
674
675 void set_context_menu_enabled(bool p_enabled);
676 bool is_context_menu_enabled() const;
677
678 void set_shortcut_keys_enabled(bool p_enabled);
679 bool is_shortcut_keys_enabled() const;
680
681 void set_fit_content(bool p_enabled);
682 bool is_fit_content_enabled() const;
683
684 bool search(const String &p_string, bool p_from_selection = false, bool p_search_previous = false);
685
686 void scroll_to_paragraph(int p_paragraph);
687 int get_paragraph_count() const;
688 int get_visible_paragraph_count() const;
689
690 float get_line_offset(int p_line);
691 float get_paragraph_offset(int p_paragraph);
692
693 void scroll_to_line(int p_line);
694 int get_line_count() const;
695 int get_visible_line_count() const;
696
697 int get_content_height() const;
698 int get_content_width() const;
699
700 void scroll_to_selection();
701
702 VScrollBar *get_v_scroll_bar() { return vscroll; }
703
704 virtual CursorShape get_cursor_shape(const Point2 &p_pos) const override;
705 virtual Variant get_drag_data(const Point2 &p_point) override;
706
707 void set_selection_enabled(bool p_enabled);
708 bool is_selection_enabled() const;
709 int get_selection_from() const;
710 int get_selection_to() const;
711 String get_selected_text() const;
712 void select_all();
713 void selection_copy();
714
715 void set_deselect_on_focus_loss_enabled(const bool p_enabled);
716 bool is_deselect_on_focus_loss_enabled() const;
717
718 void set_drag_and_drop_selection_enabled(const bool p_enabled);
719 bool is_drag_and_drop_selection_enabled() const;
720
721 void deselect();
722
723 int get_pending_paragraphs() const;
724 bool is_ready() const;
725 bool is_updating() const;
726
727 void set_threaded(bool p_threaded);
728 bool is_threaded() const;
729
730 void set_progress_bar_delay(int p_delay_ms);
731 int get_progress_bar_delay() const;
732
733 // Context menu.
734 PopupMenu *get_menu() const;
735 bool is_menu_visible() const;
736 void menu_option(int p_option);
737
738 void parse_bbcode(const String &p_bbcode);
739 void append_text(const String &p_bbcode);
740
741 void set_use_bbcode(bool p_enable);
742 bool is_using_bbcode() const;
743
744 void set_text(const String &p_bbcode);
745 String get_text() const;
746
747 void set_text_direction(TextDirection p_text_direction);
748 TextDirection get_text_direction() const;
749
750 void set_language(const String &p_language);
751 String get_language() const;
752
753 void set_autowrap_mode(TextServer::AutowrapMode p_mode);
754 TextServer::AutowrapMode get_autowrap_mode() const;
755
756 void set_structured_text_bidi_override(TextServer::StructuredTextParser p_parser);
757 TextServer::StructuredTextParser get_structured_text_bidi_override() const;
758
759 void set_structured_text_bidi_override_options(Array p_args);
760 Array get_structured_text_bidi_override_options() const;
761
762 void set_visible_characters(int p_visible);
763 int get_visible_characters() const;
764 int get_character_line(int p_char);
765 int get_character_paragraph(int p_char);
766 int get_total_character_count() const;
767 int get_total_glyph_count() const;
768
769 void set_visible_ratio(float p_ratio);
770 float get_visible_ratio() const;
771
772 TextServer::VisibleCharactersBehavior get_visible_characters_behavior() const;
773 void set_visible_characters_behavior(TextServer::VisibleCharactersBehavior p_behavior);
774
775 void set_effects(Array p_effects);
776 Array get_effects();
777
778 void install_effect(const Variant effect);
779
780 virtual Size2 get_minimum_size() const override;
781
782 RichTextLabel(const String &p_text = String());
783 ~RichTextLabel();
784};
785
786VARIANT_ENUM_CAST(RichTextLabel::ListType);
787VARIANT_ENUM_CAST(RichTextLabel::MenuItems);
788
789#endif // RICH_TEXT_LABEL_H
790