diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2022-02-08 13:43:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-08 13:43:19 +0100 |
commit | e26598b4a1b6bc4e5fa9eb4c9413b0d4aff6129d (patch) | |
tree | 20641664f3117655e04bda2cb68c765e160b33bf /scene/gui | |
parent | 561fbe21751806ddec84311e4fed7943e241cd25 (diff) | |
parent | 31824420e4cf3a30eb35334c43cb8393af585346 (diff) |
Merge pull request #40140 from hinlopen/tree-scroll-center
Diffstat (limited to 'scene/gui')
-rw-r--r-- | scene/gui/tree.cpp | 28 | ||||
-rw-r--r-- | scene/gui/tree.h | 2 |
2 files changed, 19 insertions, 11 deletions
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index e33ce0b017..9a6c87276f 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -4409,21 +4409,29 @@ Point2 Tree::get_scroll() const { return ofs; } -void Tree::scroll_to_item(TreeItem *p_item) { +void Tree::scroll_to_item(TreeItem *p_item, bool p_center_on_item) { if (!is_visible_in_tree()) { - // hack to work around crash in get_item_rect() if Tree is not in tree. - return; + return; // Hack to work around crash in get_item_rect() if Tree is not in tree. } - // make sure the scrollbar min and max are up to date with latest changes. update_scrollbars(); - const Rect2 r = get_item_rect(p_item); + const real_t tree_height = get_size().y; + const Rect2 item_rect = get_item_rect(p_item); + const real_t item_y = item_rect.position.y; + const real_t item_height = item_rect.size.y + cache.vseparation; - if (r.position.y <= v_scroll->get_value()) { - v_scroll->set_value(r.position.y); - } else if (r.position.y + r.size.y + 2 * cache.vseparation > v_scroll->get_value() + get_size().y) { - v_scroll->set_value(r.position.y + r.size.y + 2 * cache.vseparation - get_size().y); + if (p_center_on_item) { + v_scroll->set_value(item_y - (tree_height - item_height) / 2.0f); + } else { + if (item_y < v_scroll->get_value()) { + v_scroll->set_value(item_y); + } else { + const real_t new_position = item_y + item_height - tree_height; + if (new_position > v_scroll->get_value()) { + v_scroll->set_value(new_position); + } + } } } @@ -4868,7 +4876,7 @@ void Tree::_bind_methods() { ClassDB::bind_method(D_METHOD("get_column_title_language", "column"), &Tree::get_column_title_language); ClassDB::bind_method(D_METHOD("get_scroll"), &Tree::get_scroll); - ClassDB::bind_method(D_METHOD("scroll_to_item", "item"), &Tree::scroll_to_item); + ClassDB::bind_method(D_METHOD("scroll_to_item", "item", "center_on_item"), &Tree::scroll_to_item, DEFVAL(false)); ClassDB::bind_method(D_METHOD("set_h_scroll_enabled", "h_scroll"), &Tree::set_h_scroll_enabled); ClassDB::bind_method(D_METHOD("is_h_scroll_enabled"), &Tree::is_h_scroll_enabled); diff --git a/scene/gui/tree.h b/scene/gui/tree.h index c24763a0e4..255a4f0576 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -682,7 +682,7 @@ public: TreeItem *get_item_with_text(const String &p_find) const; Point2 get_scroll() const; - void scroll_to_item(TreeItem *p_item); + void scroll_to_item(TreeItem *p_item, bool p_center_on_item = false); void set_h_scroll_enabled(bool p_enable); bool is_h_scroll_enabled() const; void set_v_scroll_enabled(bool p_enable); |