From 1a1967f989d38467c08e461b5e4dba9193d3c08f Mon Sep 17 00:00:00 2001 From: Michael Alexsander Date: Thu, 30 Oct 2025 17:32:15 -0300 Subject: [PATCH] Make possible to change the ellipsis character in `LinkButton` --- doc/classes/LinkButton.xml | 3 +++ scene/gui/link_button.cpp | 27 +++++++++++++++++++++++++++ scene/gui/link_button.h | 4 ++++ 3 files changed, 34 insertions(+) diff --git a/doc/classes/LinkButton.xml b/doc/classes/LinkButton.xml index e42a3bccec5..1adabafcaf0 100644 --- a/doc/classes/LinkButton.xml +++ b/doc/classes/LinkButton.xml @@ -10,6 +10,9 @@ + + Ellipsis character used for text clipping. + Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead. diff --git a/scene/gui/link_button.cpp b/scene/gui/link_button.cpp index 54e5cf58ef9..534d2ba573b 100644 --- a/scene/gui/link_button.cpp +++ b/scene/gui/link_button.cpp @@ -47,6 +47,7 @@ void LinkButton::_shape() { const String &lang = language.is_empty() ? _get_locale() : language; text_buf->add_string(xl_text, font, font_size, lang); text_buf->set_text_overrun_behavior(overrun_behavior); + text_buf->set_ellipsis_char(el_char); queue_accessibility_update(); } @@ -87,6 +88,29 @@ void LinkButton::set_structured_text_bidi_override(TextServer::StructuredTextPar } } +void LinkButton::set_ellipsis_char(const String &p_char) { + String c = p_char; + if (c.length() > 1) { + WARN_PRINT("Ellipsis must be exactly one character long (" + itos(c.length()) + " characters given)."); + c = c.left(1); + } + + if (el_char == c) { + return; + } + el_char = c; + + if (overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) { + _shape(); + queue_redraw(); + update_minimum_size(); + } +} + +String LinkButton::get_ellipsis_char() const { + return el_char; +} + TextServer::StructuredTextParser LinkButton::get_structured_text_bidi_override() const { return st_parser; } @@ -292,6 +316,8 @@ void LinkButton::_bind_methods() { ClassDB::bind_method(D_METHOD("get_text"), &LinkButton::get_text); ClassDB::bind_method(D_METHOD("set_text_overrun_behavior", "overrun_behavior"), &LinkButton::set_text_overrun_behavior); ClassDB::bind_method(D_METHOD("get_text_overrun_behavior"), &LinkButton::get_text_overrun_behavior); + ClassDB::bind_method(D_METHOD("set_ellipsis_char", "char"), &LinkButton::set_ellipsis_char); + ClassDB::bind_method(D_METHOD("get_ellipsis_char"), &LinkButton::get_ellipsis_char); ClassDB::bind_method(D_METHOD("set_text_direction", "direction"), &LinkButton::set_text_direction); ClassDB::bind_method(D_METHOD("get_text_direction"), &LinkButton::get_text_direction); ClassDB::bind_method(D_METHOD("set_language", "language"), &LinkButton::set_language); @@ -315,6 +341,7 @@ void LinkButton::_bind_methods() { ADD_GROUP("Text Behavior", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "text_overrun_behavior", PROPERTY_HINT_ENUM, "Trim Nothing,Trim Characters,Trim Words,Ellipsis (6+ Characters),Word Ellipsis (6+ Characters),Ellipsis (Always),Word Ellipsis (Always)"), "set_text_overrun_behavior", "get_text_overrun_behavior"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "ellipsis_char"), "set_ellipsis_char", "get_ellipsis_char"); ADD_GROUP("BiDi", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction"); diff --git a/scene/gui/link_button.h b/scene/gui/link_button.h index 324b9ad6d28..12ea8fe25fc 100644 --- a/scene/gui/link_button.h +++ b/scene/gui/link_button.h @@ -55,6 +55,7 @@ private: TextServer::StructuredTextParser st_parser = TextServer::STRUCTURED_TEXT_DEFAULT; Array st_args; TextServer::OverrunBehavior overrun_behavior = TextServer::OVERRUN_NO_TRIMMING; + String el_char = U"…"; struct ThemeCache { Ref focus; @@ -92,6 +93,9 @@ public: void set_text_overrun_behavior(TextServer::OverrunBehavior p_behavior); TextServer::OverrunBehavior get_text_overrun_behavior() const; + void set_ellipsis_char(const String &p_char); + String get_ellipsis_char() const; + void set_structured_text_bidi_override(TextServer::StructuredTextParser p_parser); TextServer::StructuredTextParser get_structured_text_bidi_override() const;