From c56ff437aec0f0f49c0c956ee298ec28f8b6a596 Mon Sep 17 00:00:00 2001 From: Barugon Date: Sat, 25 Mar 2023 18:13:31 -0700 Subject: [PATCH] Implement column title alignment for `Tree` --- doc/classes/Tree.xml | 15 +++++++++++++++ scene/gui/tree.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++- scene/gui/tree.h | 4 ++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 95778f86c45..9dea69cd0ce 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -100,6 +100,13 @@ Returns the column's title. + + + + + Returns the column title alignment. + + @@ -288,6 +295,14 @@ Sets the title of a column. + + + + + + Sets the column title alignment. Note that [constant @GlobalScope.HORIZONTAL_ALIGNMENT_FILL] is not supported for column titles. + + diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 339d8cce19f..1994a118a0a 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -4045,7 +4045,24 @@ void Tree::_notification(int p_what) { int clip_w = tbrect.size.width - sb->get_minimum_size().width; columns.write[i].text_buf->set_width(clip_w); - Vector2 text_pos = tbrect.position + Point2i(sb->get_offset().x + (tbrect.size.width - columns[i].text_buf->get_size().x) / 2, (tbrect.size.height - columns[i].text_buf->get_size().y) / 2); + Vector2 text_pos = Point2i(tbrect.position.x, tbrect.position.y + (tbrect.size.height - columns[i].text_buf->get_size().y) / 2); + switch (columns[i].title_alignment) { + case HorizontalAlignment::HORIZONTAL_ALIGNMENT_LEFT: { + text_pos.x += cache.rtl ? tbrect.size.width - (sb->get_offset().x + columns[i].text_buf->get_size().x) : sb->get_offset().x; + break; + } + + case HorizontalAlignment::HORIZONTAL_ALIGNMENT_RIGHT: { + text_pos.x += cache.rtl ? sb->get_offset().x : tbrect.size.width - (sb->get_offset().x + columns[i].text_buf->get_size().x); + break; + } + + default: { + text_pos.x += sb->get_offset().x + (tbrect.size.width - columns[i].text_buf->get_size().x) / 2; + break; + } + } + if (theme_cache.font_outline_size > 0 && theme_cache.font_outline_color.a > 0) { columns[i].text_buf->draw_outline(ci, text_pos, theme_cache.font_outline_size, theme_cache.font_outline_color); } @@ -4681,6 +4698,27 @@ String Tree::get_column_title(int p_column) const { return columns[p_column].title; } +void Tree::set_column_title_alignment(int p_column, HorizontalAlignment p_alignment) { + ERR_FAIL_INDEX(p_column, columns.size()); + + if (p_alignment == HORIZONTAL_ALIGNMENT_FILL) { + WARN_PRINT("HORIZONTAL_ALIGNMENT_FILL is not supported for column titles."); + } + + if (columns[p_column].title_alignment == p_alignment) { + return; + } + + columns.write[p_column].title_alignment = p_alignment; + update_column(p_column); + queue_redraw(); +} + +HorizontalAlignment Tree::get_column_title_alignment(int p_column) const { + ERR_FAIL_INDEX_V(p_column, columns.size(), HorizontalAlignment::HORIZONTAL_ALIGNMENT_CENTER); + return columns[p_column].title_alignment; +} + void Tree::set_column_title_direction(int p_column, Control::TextDirection p_text_direction) { ERR_FAIL_INDEX(p_column, columns.size()); ERR_FAIL_COND((int)p_text_direction < -1 || (int)p_text_direction > 3); @@ -5211,6 +5249,9 @@ void Tree::_bind_methods() { ClassDB::bind_method(D_METHOD("set_column_title", "column", "title"), &Tree::set_column_title); ClassDB::bind_method(D_METHOD("get_column_title", "column"), &Tree::get_column_title); + ClassDB::bind_method(D_METHOD("set_column_title_alignment", "column", "title_alignment"), &Tree::set_column_title_alignment); + ClassDB::bind_method(D_METHOD("get_column_title_alignment", "column"), &Tree::get_column_title_alignment); + ClassDB::bind_method(D_METHOD("set_column_title_direction", "column", "direction"), &Tree::set_column_title_direction); ClassDB::bind_method(D_METHOD("get_column_title_direction", "column"), &Tree::get_column_title_direction); diff --git a/scene/gui/tree.h b/scene/gui/tree.h index ec639ce4394..e5d81e9b862 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -435,6 +435,7 @@ private: bool expand = true; bool clip_content = false; String title; + HorizontalAlignment title_alignment = HORIZONTAL_ALIGNMENT_CENTER; Ref text_buf; String language; Control::TextDirection text_direction = Control::TEXT_DIRECTION_INHERITED; @@ -680,6 +681,9 @@ public: void set_column_title(int p_column, const String &p_title); String get_column_title(int p_column) const; + void set_column_title_alignment(int p_column, HorizontalAlignment p_alignment); + HorizontalAlignment get_column_title_alignment(int p_column) const; + void set_column_title_direction(int p_column, Control::TextDirection p_text_direction); Control::TextDirection get_column_title_direction(int p_column) const;