From 8b5d3c7bac60736e10e83dab63f71ddeca855311 Mon Sep 17 00:00:00 2001 From: kobewi Date: Mon, 23 Feb 2026 19:32:45 +0100 Subject: [PATCH] Improve get_tab_control() in TabContainer --- scene/gui/tab_container.cpp | 61 ++++++++++++++++++++++++++----------- scene/gui/tab_container.h | 1 + 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index baa2abe374..5d94610fba 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -51,6 +51,14 @@ int TabContainer::_get_tab_height() const { return height; } +Control *TabContainer::_as_tab_control(Node *p_child) const { + Control *control = as_sortable_control(p_child, SortableVisibilityMode::IGNORE); + if (!control || control == internal_container || children_removing.has(control)) { + return nullptr; + } + return control; +} + void TabContainer::_get_property_list(List *p_list) const { List properties; property_helper.get_property_list(&properties); @@ -104,8 +112,8 @@ void TabContainer::_notification(int p_what) { if (child_node->is_part_of_edited_scene()) { continue; } - Control *control = as_sortable_control(child_node, SortableVisibilityMode::IGNORE); - if (!control || control == internal_container || children_removing.has(control)) { + Control *control = _as_tab_control(child_node); + if (!control) { DisplayServer::get_singleton()->accessibility_update_add_child(ae, child_node->get_accessibility_element()); } else { if (!tab_panels.has(child_node)) { @@ -361,15 +369,14 @@ void TabContainer::_update_margins() { Vector TabContainer::_get_tab_controls() const { Vector controls; - for (int i = 0; i < get_child_count(); i++) { - Control *control = as_sortable_control(get_child(i), SortableVisibilityMode::IGNORE); - if (!control || control == internal_container || children_removing.has(control)) { - continue; + ERR_THREAD_GUARD_V(controls); + + for (Node *child : iterate_children()) { + Control *control = _as_tab_control(child); + if (control) { + controls.push_back(control); } - - controls.push_back(control); } - return controls; } @@ -694,12 +701,24 @@ bool TabContainer::get_deselect_enabled() const { } Control *TabContainer::get_tab_control(int p_idx) const { - Vector controls = _get_tab_controls(); - if (p_idx >= 0 && p_idx < controls.size()) { - return controls[p_idx]; - } else { + if (p_idx < 0) { return nullptr; } + ERR_THREAD_GUARD_V(nullptr); + + for (Node *child : iterate_children()) { + Control *control = _as_tab_control(child); + if (!control) { + continue; + } + + if (p_idx > 0) { + p_idx--; + } else { + return control; + } + } + return nullptr; } Control *TabContainer::get_current_tab_control() const { @@ -713,14 +732,20 @@ int TabContainer::get_tab_idx_at_point(const Point2 &p_point) const { int TabContainer::get_tab_idx_from_control(Control *p_child) const { ERR_FAIL_NULL_V(p_child, -1); ERR_FAIL_COND_V(p_child->get_parent() != this, -1); + ERR_THREAD_GUARD_V(-1); - Vector controls = _get_tab_controls(); - for (int i = 0; i < controls.size(); i++) { - if (controls[i] == p_child) { - return i; + int idx = 0; + for (Node *child : iterate_children()) { + Control *control = _as_tab_control(child); + if (!control) { + continue; } - } + if (control == p_child) { + return idx; + } + idx++; + } return -1; } diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h index 85bb945d3c..16780ec4ae 100644 --- a/scene/gui/tab_container.h +++ b/scene/gui/tab_container.h @@ -124,6 +124,7 @@ private: HashMap tab_panels; int _get_tab_height() const; + Control *_as_tab_control(Node *p_child) const; Vector _get_tab_controls() const; void _on_theme_changed(); void _repaint();