summaryrefslogtreecommitdiffstats
path: root/scene/gui/tab_bar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui/tab_bar.cpp')
-rw-r--r--scene/gui/tab_bar.cpp34
1 files changed, 29 insertions, 5 deletions
diff --git a/scene/gui/tab_bar.cpp b/scene/gui/tab_bar.cpp
index 29e6d3d10d..777ca96cc4 100644
--- a/scene/gui/tab_bar.cpp
+++ b/scene/gui/tab_bar.cpp
@@ -334,6 +334,12 @@ void TabBar::_shape(int p_tab) {
void TabBar::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_ENTER_TREE: {
+ if (scroll_to_selected) {
+ ensure_tab_visible(current);
+ }
+ } break;
+
case NOTIFICATION_INTERNAL_PROCESS: {
Input *input = Input::get_singleton();
@@ -669,7 +675,7 @@ bool TabBar::select_previous_available() {
if (target_tab < 0) {
target_tab += get_tab_count();
}
- if (!is_tab_disabled(target_tab)) {
+ if (!is_tab_disabled(target_tab) && !is_tab_hidden(target_tab)) {
set_current_tab(target_tab);
return true;
}
@@ -681,7 +687,7 @@ bool TabBar::select_next_available() {
const int offset_end = (get_tab_count() - get_current_tab());
for (int i = 1; i < offset_end; i++) {
int target_tab = (get_current_tab() + i) % get_tab_count();
- if (!is_tab_disabled(target_tab)) {
+ if (!is_tab_disabled(target_tab) && !is_tab_hidden(target_tab)) {
set_current_tab(target_tab);
return true;
}
@@ -1094,6 +1100,23 @@ void TabBar::remove_tab(int p_idx) {
max_drawn_tab = 0;
previous = 0;
} else {
+ // Try to change to a valid tab if possible (without firing the `tab_selected` signal).
+ for (int i = current; i < tabs.size(); i++) {
+ if (!is_tab_disabled(i) && !is_tab_hidden(i)) {
+ current = i;
+ break;
+ }
+ }
+ // If nothing, try backwards.
+ if (is_tab_disabled(current) || is_tab_hidden(current)) {
+ for (int i = current - 1; i >= 0; i--) {
+ if (!is_tab_disabled(i) && !is_tab_hidden(i)) {
+ current = i;
+ break;
+ }
+ }
+ }
+
offset = MIN(offset, tabs.size() - 1);
max_drawn_tab = MIN(max_drawn_tab, tabs.size() - 1);
@@ -1745,7 +1768,10 @@ void TabBar::_bind_methods() {
ADD_SIGNAL(MethodInfo("tab_hovered", PropertyInfo(Variant::INT, "tab")));
ADD_SIGNAL(MethodInfo("active_tab_rearranged", PropertyInfo(Variant::INT, "idx_to")));
- ADD_PROPERTY(PropertyInfo(Variant::INT, "current_tab", PROPERTY_HINT_RANGE, "-1,4096,1", PROPERTY_USAGE_EDITOR), "set_current_tab", "get_current_tab");
+ // "current_tab" property must come after "tab_count", otherwise the property isn't loaded correctly.
+ ADD_ARRAY_COUNT("Tabs", "tab_count", "set_tab_count", "get_tab_count", "tab_");
+
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "current_tab", PROPERTY_HINT_RANGE, "-1,4096,1"), "set_current_tab", "get_current_tab");
ADD_PROPERTY(PropertyInfo(Variant::INT, "tab_alignment", PROPERTY_HINT_ENUM, "Left,Center,Right"), "set_tab_alignment", "get_tab_alignment");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_tabs"), "set_clip_tabs", "get_clip_tabs");
ADD_PROPERTY(PropertyInfo(Variant::INT, "tab_close_display_policy", PROPERTY_HINT_ENUM, "Show Never,Show Active Only,Show Always"), "set_tab_close_display_policy", "get_tab_close_display_policy");
@@ -1756,8 +1782,6 @@ void TabBar::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_to_selected"), "set_scroll_to_selected", "get_scroll_to_selected");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "select_with_rmb"), "set_select_with_rmb", "get_select_with_rmb");
- ADD_ARRAY_COUNT("Tabs", "tab_count", "set_tab_count", "get_tab_count", "tab_");
-
BIND_ENUM_CONSTANT(ALIGNMENT_LEFT);
BIND_ENUM_CONSTANT(ALIGNMENT_CENTER);
BIND_ENUM_CONSTANT(ALIGNMENT_RIGHT);