Merge pull request #33235 from nekomatata/rich-text-label-fit-height
Option in RichTextLabel for height to fit content
This commit is contained in:
commit
a8132b2fab
|
@ -294,6 +294,10 @@
|
||||||
The currently installed custom effects. This is an array of [RichTextEffect]s.
|
The currently installed custom effects. This is an array of [RichTextEffect]s.
|
||||||
To add a custom effect, it's more convenient to use [method install_effect].
|
To add a custom effect, it's more convenient to use [method install_effect].
|
||||||
</member>
|
</member>
|
||||||
|
<member name="fit_content_height" type="bool" setter="set_fit_content_height" getter="is_fit_content_height_enabled" default="false">
|
||||||
|
If [code]true[/code], the label's height will be automatically updated to fit its content.
|
||||||
|
[b]Note:[/b] This property is used as a workaround to fix issues with [RichTextLabel] in [Container]s, but it's unreliable in some cases and will be removed in future versions.
|
||||||
|
</member>
|
||||||
<member name="meta_underlined" type="bool" setter="set_meta_underline" getter="is_meta_underlined" default="true">
|
<member name="meta_underlined" type="bool" setter="set_meta_underline" getter="is_meta_underlined" default="true">
|
||||||
If [code]true[/code], the label underlines meta tags such as [code][url]{text}[/url][/code].
|
If [code]true[/code], the label underlines meta tags such as [code][url]{text}[/url][/code].
|
||||||
</member>
|
</member>
|
||||||
|
|
|
@ -1570,6 +1570,10 @@ void RichTextLabel::_validate_line_caches(ItemFrame *p_frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
updating_scroll = false;
|
updating_scroll = false;
|
||||||
|
|
||||||
|
if (fit_content_height) {
|
||||||
|
minimum_size_changed();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RichTextLabel::_invalidate_current_line(ItemFrame *p_frame) {
|
void RichTextLabel::_invalidate_current_line(ItemFrame *p_frame) {
|
||||||
|
@ -1989,6 +1993,17 @@ int RichTextLabel::get_tab_size() const {
|
||||||
return tab_size;
|
return tab_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RichTextLabel::set_fit_content_height(bool p_enabled) {
|
||||||
|
if (p_enabled != fit_content_height) {
|
||||||
|
fit_content_height = p_enabled;
|
||||||
|
minimum_size_changed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RichTextLabel::is_fit_content_height_enabled() const {
|
||||||
|
return fit_content_height;
|
||||||
|
}
|
||||||
|
|
||||||
void RichTextLabel::set_meta_underline(bool p_underline) {
|
void RichTextLabel::set_meta_underline(bool p_underline) {
|
||||||
underline_meta = p_underline;
|
underline_meta = p_underline;
|
||||||
update();
|
update();
|
||||||
|
@ -2646,7 +2661,7 @@ void RichTextLabel::install_effect(const Variant effect) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int RichTextLabel::get_content_height() {
|
int RichTextLabel::get_content_height() const {
|
||||||
int total_height = 0;
|
int total_height = 0;
|
||||||
if (main->lines.size()) {
|
if (main->lines.size()) {
|
||||||
total_height = main->lines[main->lines.size() - 1].height_accum_cache + get_theme_stylebox("normal")->get_minimum_size().height;
|
total_height = main->lines[main->lines.size() - 1].height_accum_cache + get_theme_stylebox("normal")->get_minimum_size().height;
|
||||||
|
@ -2701,6 +2716,9 @@ void RichTextLabel::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("set_tab_size", "spaces"), &RichTextLabel::set_tab_size);
|
ClassDB::bind_method(D_METHOD("set_tab_size", "spaces"), &RichTextLabel::set_tab_size);
|
||||||
ClassDB::bind_method(D_METHOD("get_tab_size"), &RichTextLabel::get_tab_size);
|
ClassDB::bind_method(D_METHOD("get_tab_size"), &RichTextLabel::get_tab_size);
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("set_fit_content_height", "enabled"), &RichTextLabel::set_fit_content_height);
|
||||||
|
ClassDB::bind_method(D_METHOD("is_fit_content_height_enabled"), &RichTextLabel::is_fit_content_height_enabled);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("set_selection_enabled", "enabled"), &RichTextLabel::set_selection_enabled);
|
ClassDB::bind_method(D_METHOD("set_selection_enabled", "enabled"), &RichTextLabel::set_selection_enabled);
|
||||||
ClassDB::bind_method(D_METHOD("is_selection_enabled"), &RichTextLabel::is_selection_enabled);
|
ClassDB::bind_method(D_METHOD("is_selection_enabled"), &RichTextLabel::is_selection_enabled);
|
||||||
|
|
||||||
|
@ -2743,6 +2761,8 @@ void RichTextLabel::_bind_methods() {
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "tab_size", PROPERTY_HINT_RANGE, "0,24,1"), "set_tab_size", "get_tab_size");
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "tab_size", PROPERTY_HINT_RANGE, "0,24,1"), "set_tab_size", "get_tab_size");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT), "set_text", "get_text");
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT), "set_text", "get_text");
|
||||||
|
|
||||||
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fit_content_height"), "set_fit_content_height", "is_fit_content_height_enabled");
|
||||||
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_active"), "set_scroll_active", "is_scroll_active");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_active"), "set_scroll_active", "is_scroll_active");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_following"), "set_scroll_follow", "is_scroll_following");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_following"), "set_scroll_follow", "is_scroll_following");
|
||||||
|
|
||||||
|
@ -2809,12 +2829,17 @@ void RichTextLabel::set_fixed_size_to_width(int p_width) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Size2 RichTextLabel::get_minimum_size() const {
|
Size2 RichTextLabel::get_minimum_size() const {
|
||||||
|
Size2 size(0, 0);
|
||||||
if (fixed_width != -1) {
|
if (fixed_width != -1) {
|
||||||
const_cast<RichTextLabel *>(this)->_validate_line_caches(main);
|
size.x = fixed_width;
|
||||||
return Size2(fixed_width, const_cast<RichTextLabel *>(this)->get_content_height());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Size2();
|
if (fixed_width != -1 || fit_content_height) {
|
||||||
|
const_cast<RichTextLabel *>(this)->_validate_line_caches(main);
|
||||||
|
size.y = get_content_height();
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<RichTextEffect> RichTextLabel::_get_custom_effect_by_code(String p_bbcode_identifier) {
|
Ref<RichTextEffect> RichTextLabel::_get_custom_effect_by_code(String p_bbcode_identifier) {
|
||||||
|
@ -2934,6 +2959,8 @@ RichTextLabel::RichTextLabel() {
|
||||||
visible_line_count = 0;
|
visible_line_count = 0;
|
||||||
|
|
||||||
fixed_width = -1;
|
fixed_width = -1;
|
||||||
|
fit_content_height = false;
|
||||||
|
|
||||||
set_clip_contents(true);
|
set_clip_contents(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -403,6 +403,8 @@ private:
|
||||||
|
|
||||||
int fixed_width;
|
int fixed_width;
|
||||||
|
|
||||||
|
bool fit_content_height;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
|
|
||||||
|
@ -456,13 +458,16 @@ public:
|
||||||
void set_tab_size(int p_spaces);
|
void set_tab_size(int p_spaces);
|
||||||
int get_tab_size() const;
|
int get_tab_size() const;
|
||||||
|
|
||||||
|
void set_fit_content_height(bool p_enabled);
|
||||||
|
bool is_fit_content_height_enabled() const;
|
||||||
|
|
||||||
bool search(const String &p_string, bool p_from_selection = false, bool p_search_previous = false);
|
bool search(const String &p_string, bool p_from_selection = false, bool p_search_previous = false);
|
||||||
|
|
||||||
void scroll_to_line(int p_line);
|
void scroll_to_line(int p_line);
|
||||||
int get_line_count() const;
|
int get_line_count() const;
|
||||||
int get_visible_line_count() const;
|
int get_visible_line_count() const;
|
||||||
|
|
||||||
int get_content_height();
|
int get_content_height() const;
|
||||||
|
|
||||||
VScrollBar *get_v_scroll() { return vscroll; }
|
VScrollBar *get_v_scroll() { return vscroll; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue