From 18f69e9ee15c6ec90e06478e003ecf57a5e43cad Mon Sep 17 00:00:00 2001 From: Danil Alexeev Date: Tue, 27 Jun 2023 18:22:10 +0300 Subject: [PATCH] GUI: Fix text overlapping icon in `Tree` (cherry picked from commit 07d23489f48dbc3c64ebf7c90b991a70b3418554) --- doc/classes/TreeItem.xml | 15 +++++++++++++++ scene/gui/tree.cpp | 29 +++++++++++++++++++++++++++-- scene/gui/tree.h | 4 ++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml index 559d38e5cca..ddef2d8d478 100644 --- a/doc/classes/TreeItem.xml +++ b/doc/classes/TreeItem.xml @@ -339,6 +339,13 @@ Returns item's text base writing direction. + + + + + Returns the clipping behavior when the text exceeds the item's bounding rectangle in the given [param column]. By default it is [constant TextServer.OVERRUN_TRIM_ELLIPSIS]. + + @@ -719,6 +726,14 @@ Sets item's text base writing direction. + + + + + + Sets the clipping behavior when the text exceeds the item's bounding rectangle in the given [param column]. + + diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 9fa54742b19..51462a7c02f 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -351,6 +351,24 @@ TextServer::AutowrapMode TreeItem::get_autowrap_mode(int p_column) const { return cells[p_column].autowrap_mode; } +void TreeItem::set_text_overrun_behavior(int p_column, TextServer::OverrunBehavior p_behavior) { + ERR_FAIL_INDEX(p_column, cells.size()); + + if (cells[p_column].text_buf->get_text_overrun_behavior() == p_behavior) { + return; + } + + cells.write[p_column].text_buf->set_text_overrun_behavior(p_behavior); + cells.write[p_column].dirty = true; + _changed_notify(p_column); + cells.write[p_column].cached_minimum_size_dirty = true; +} + +TextServer::OverrunBehavior TreeItem::get_text_overrun_behavior(int p_column) const { + ERR_FAIL_INDEX_V(p_column, cells.size(), TextServer::OVERRUN_TRIM_ELLIPSIS); + return cells[p_column].text_buf->get_text_overrun_behavior(); +} + void TreeItem::set_structured_text_bidi_override(int p_column, TextServer::StructuredTextParser p_parser) { ERR_FAIL_INDEX(p_column, cells.size()); @@ -1505,6 +1523,9 @@ void TreeItem::_bind_methods() { ClassDB::bind_method(D_METHOD("set_autowrap_mode", "column", "autowrap_mode"), &TreeItem::set_autowrap_mode); ClassDB::bind_method(D_METHOD("get_autowrap_mode", "column"), &TreeItem::get_autowrap_mode); + ClassDB::bind_method(D_METHOD("set_text_overrun_behavior", "column", "overrun_behavior"), &TreeItem::set_text_overrun_behavior); + ClassDB::bind_method(D_METHOD("get_text_overrun_behavior", "column"), &TreeItem::get_text_overrun_behavior); + ClassDB::bind_method(D_METHOD("set_structured_text_bidi_override", "column", "parser"), &TreeItem::set_structured_text_bidi_override); ClassDB::bind_method(D_METHOD("get_structured_text_bidi_override", "column"), &TreeItem::get_structured_text_bidi_override); @@ -2085,7 +2106,12 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 buttons_width += button_size.width + theme_cache.button_margin; } - p_item->cells.write[i].text_buf->set_width(item_width); + int text_width = item_width; + if (p_item->cells[i].icon.is_valid()) { + text_width -= p_item->cells[i].get_icon_size().x + theme_cache.h_separation; + } + + p_item->cells.write[i].text_buf->set_width(text_width); r_self_height = compute_item_height(p_item); label_h = r_self_height + theme_cache.v_separation; @@ -2213,7 +2239,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 Point2i text_pos = item_rect.position; text_pos.y += Math::floor(p_draw_ofs.y) - _get_title_button_height(); - int text_width = p_item->cells[i].text_buf->get_size().x; switch (p_item->cells[i].mode) { case TreeItem::CELL_MODE_STRING: { diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 1789470f830..f2b743cb052 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -117,6 +117,7 @@ private: Cell() { text_buf.instantiate(); + text_buf->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); } Size2 get_icon_size() const; @@ -231,6 +232,9 @@ public: void set_autowrap_mode(int p_column, TextServer::AutowrapMode p_mode); TextServer::AutowrapMode get_autowrap_mode(int p_column) const; + void set_text_overrun_behavior(int p_column, TextServer::OverrunBehavior p_behavior); + TextServer::OverrunBehavior get_text_overrun_behavior(int p_column) const; + void set_structured_text_bidi_override(int p_column, TextServer::StructuredTextParser p_parser); TextServer::StructuredTextParser get_structured_text_bidi_override(int p_column) const;