Merge pull request #57589 from bruvzg/rtl_autowrap
This commit is contained in:
commit
c0daec389d
3 changed files with 67 additions and 1 deletions
|
@ -372,6 +372,9 @@
|
|||
</method>
|
||||
</methods>
|
||||
<members>
|
||||
<member name="autowrap_mode" type="int" setter="set_autowrap_mode" getter="get_autowrap_mode" enum="RichTextLabel.AutowrapMode" default="3">
|
||||
If set to something other than [constant AUTOWRAP_OFF], the text gets wrapped inside the node's bounding rectangle. To see how each mode behaves, see [enum AutowrapMode].
|
||||
</member>
|
||||
<member name="bbcode_enabled" type="bool" setter="set_use_bbcode" getter="is_using_bbcode" default="false">
|
||||
If [code]true[/code], the label uses BBCode formatting.
|
||||
</member>
|
||||
|
@ -454,6 +457,18 @@
|
|||
</signal>
|
||||
</signals>
|
||||
<constants>
|
||||
<constant name="AUTOWRAP_OFF" value="0" enum="AutowrapMode">
|
||||
Autowrap is disabled.
|
||||
</constant>
|
||||
<constant name="AUTOWRAP_ARBITRARY" value="1" enum="AutowrapMode">
|
||||
Wraps the text inside the node's bounding rectangle by allowing to break lines at arbitrary positions, which is useful when very limited space is available.
|
||||
</constant>
|
||||
<constant name="AUTOWRAP_WORD" value="2" enum="AutowrapMode">
|
||||
Wraps the text inside the node's bounding rectangle by soft-breaking between words.
|
||||
</constant>
|
||||
<constant name="AUTOWRAP_WORD_SMART" value="3" enum="AutowrapMode">
|
||||
Behaves similarly to [constant AUTOWRAP_WORD], but force-breaks a word if that single word does not fit in one line.
|
||||
</constant>
|
||||
<constant name="LIST_NUMBERS" value="0" enum="ListType">
|
||||
Each list item has a number marker.
|
||||
</constant>
|
||||
|
|
|
@ -421,9 +421,24 @@ void RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
|
|||
|
||||
Line &l = p_frame->lines.write[p_line];
|
||||
|
||||
uint16_t autowrap_flags = TextServer::BREAK_MANDATORY;
|
||||
switch (autowrap_mode) {
|
||||
case AUTOWRAP_WORD_SMART:
|
||||
autowrap_flags = TextServer::BREAK_WORD_BOUND_ADAPTIVE | TextServer::BREAK_MANDATORY;
|
||||
break;
|
||||
case AUTOWRAP_WORD:
|
||||
autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY;
|
||||
break;
|
||||
case AUTOWRAP_ARBITRARY:
|
||||
autowrap_flags = TextServer::BREAK_GRAPHEME_BOUND | TextServer::BREAK_MANDATORY;
|
||||
break;
|
||||
case AUTOWRAP_OFF:
|
||||
break;
|
||||
}
|
||||
|
||||
// Clear cache.
|
||||
l.text_buf->clear();
|
||||
l.text_buf->set_flags(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_TRIM_EDGE_SPACES);
|
||||
l.text_buf->set_flags(autowrap_flags | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_TRIM_EDGE_SPACES);
|
||||
l.char_offset = *r_char_offset;
|
||||
l.char_count = 0;
|
||||
|
||||
|
@ -4077,6 +4092,19 @@ String RichTextLabel::get_language() const {
|
|||
return language;
|
||||
}
|
||||
|
||||
void RichTextLabel::set_autowrap_mode(RichTextLabel::AutowrapMode p_mode) {
|
||||
if (autowrap_mode != p_mode) {
|
||||
autowrap_mode = p_mode;
|
||||
main->first_invalid_line = 0; //invalidate ALL
|
||||
_validate_line_caches(main);
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
RichTextLabel::AutowrapMode RichTextLabel::get_autowrap_mode() const {
|
||||
return autowrap_mode;
|
||||
}
|
||||
|
||||
void RichTextLabel::set_percent_visible(float p_percent) {
|
||||
if (percent_visible != p_percent) {
|
||||
if (p_percent < 0 || p_percent >= 1) {
|
||||
|
@ -4188,6 +4216,9 @@ void RichTextLabel::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_language", "language"), &RichTextLabel::set_language);
|
||||
ClassDB::bind_method(D_METHOD("get_language"), &RichTextLabel::get_language);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_autowrap_mode", "autowrap_mode"), &RichTextLabel::set_autowrap_mode);
|
||||
ClassDB::bind_method(D_METHOD("get_autowrap_mode"), &RichTextLabel::get_autowrap_mode);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_meta_underline", "enable"), &RichTextLabel::set_meta_underline);
|
||||
ClassDB::bind_method(D_METHOD("is_meta_underlined"), &RichTextLabel::is_meta_underlined);
|
||||
|
||||
|
@ -4280,6 +4311,8 @@ void RichTextLabel::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::STRING, "language", PROPERTY_HINT_LOCALE_ID, ""), "set_language", "get_language");
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "autowrap_mode", PROPERTY_HINT_ENUM, "Off,Arbitrary,Word,Word (Smart)"), "set_autowrap_mode", "get_autowrap_mode");
|
||||
|
||||
ADD_GROUP("Structured Text", "structured_text_");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "structured_text_bidi_override", PROPERTY_HINT_ENUM, "Default,URI,File,Email,List,None,Custom"), "set_structured_text_bidi_override", "get_structured_text_bidi_override");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "structured_text_bidi_override_options"), "set_structured_text_bidi_override_options", "get_structured_text_bidi_override_options");
|
||||
|
@ -4288,6 +4321,11 @@ void RichTextLabel::_bind_methods() {
|
|||
ADD_SIGNAL(MethodInfo("meta_hover_started", PropertyInfo(Variant::NIL, "meta", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT)));
|
||||
ADD_SIGNAL(MethodInfo("meta_hover_ended", PropertyInfo(Variant::NIL, "meta", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT)));
|
||||
|
||||
BIND_ENUM_CONSTANT(AUTOWRAP_OFF);
|
||||
BIND_ENUM_CONSTANT(AUTOWRAP_ARBITRARY);
|
||||
BIND_ENUM_CONSTANT(AUTOWRAP_WORD);
|
||||
BIND_ENUM_CONSTANT(AUTOWRAP_WORD_SMART);
|
||||
|
||||
BIND_ENUM_CONSTANT(LIST_NUMBERS);
|
||||
BIND_ENUM_CONSTANT(LIST_LETTERS);
|
||||
BIND_ENUM_CONSTANT(LIST_ROMAN);
|
||||
|
|
|
@ -39,6 +39,13 @@ class RichTextLabel : public Control {
|
|||
GDCLASS(RichTextLabel, Control);
|
||||
|
||||
public:
|
||||
enum AutowrapMode {
|
||||
AUTOWRAP_OFF,
|
||||
AUTOWRAP_ARBITRARY,
|
||||
AUTOWRAP_WORD,
|
||||
AUTOWRAP_WORD_SMART
|
||||
};
|
||||
|
||||
enum ListType {
|
||||
LIST_NUMBERS,
|
||||
LIST_LETTERS,
|
||||
|
@ -346,6 +353,8 @@ private:
|
|||
|
||||
VScrollBar *vscroll = nullptr;
|
||||
|
||||
AutowrapMode autowrap_mode = AUTOWRAP_WORD_SMART;
|
||||
|
||||
bool scroll_visible = false;
|
||||
bool scroll_follow = false;
|
||||
bool scroll_following = false;
|
||||
|
@ -574,6 +583,9 @@ public:
|
|||
void set_language(const String &p_language);
|
||||
String get_language() const;
|
||||
|
||||
void set_autowrap_mode(AutowrapMode p_mode);
|
||||
AutowrapMode get_autowrap_mode() const;
|
||||
|
||||
void set_structured_text_bidi_override(Control::StructuredTextParser p_parser);
|
||||
Control::StructuredTextParser get_structured_text_bidi_override() const;
|
||||
|
||||
|
@ -603,6 +615,7 @@ public:
|
|||
~RichTextLabel();
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(RichTextLabel::AutowrapMode);
|
||||
VARIANT_ENUM_CAST(RichTextLabel::ListType);
|
||||
VARIANT_ENUM_CAST(RichTextLabel::ItemType);
|
||||
VARIANT_ENUM_CAST(RichTextLabel::VisibleCharactersBehavior);
|
||||
|
|
Loading…
Reference in a new issue