diff options
| author | Michael Alexsander <michaelalexsander@protonmail.com> | 2023-10-25 16:26:03 -0300 |
|---|---|---|
| committer | Michael Alexsander <michaelalexsander@protonmail.com> | 2023-10-25 16:46:54 -0300 |
| commit | c3fc87964f534d5064a5d94dac7c7dc623867aa0 (patch) | |
| tree | 8950d10372e041797cc9084cca80615094fd7564 | |
| parent | 06d51891678e3abf360d6fcd2e8bd1ba96704fcc (diff) | |
| download | redot-engine-c3fc87964f534d5064a5d94dac7c7dc623867aa0.tar.gz | |
Fix disabled tabs being selected when removing the current one
| -rw-r--r-- | doc/classes/TabBar.xml | 2 | ||||
| -rw-r--r-- | doc/classes/TabContainer.xml | 2 | ||||
| -rw-r--r-- | scene/gui/tab_bar.cpp | 21 |
3 files changed, 21 insertions, 4 deletions
diff --git a/doc/classes/TabBar.xml b/doc/classes/TabBar.xml index 9b462b9f50..165b187710 100644 --- a/doc/classes/TabBar.xml +++ b/doc/classes/TabBar.xml @@ -317,7 +317,7 @@ <signal name="tab_selected"> <param index="0" name="tab" type="int" /> <description> - Emitted when a tab is selected via click or script, even if it is the current tab. + Emitted when a tab is selected via click, directional input, or script, even if it is the current tab. </description> </signal> </signals> diff --git a/doc/classes/TabContainer.xml b/doc/classes/TabContainer.xml index 1b0054ef25..b3a9264569 100644 --- a/doc/classes/TabContainer.xml +++ b/doc/classes/TabContainer.xml @@ -243,7 +243,7 @@ <signal name="tab_selected"> <param index="0" name="tab" type="int" /> <description> - Emitted when a tab is selected via click or script, even if it is the current tab. + Emitted when a tab is selected via click, directional input, or script, even if it is the current tab. </description> </signal> </signals> diff --git a/scene/gui/tab_bar.cpp b/scene/gui/tab_bar.cpp index 29e6d3d10d..bc776facaf 100644 --- a/scene/gui/tab_bar.cpp +++ b/scene/gui/tab_bar.cpp @@ -669,7 +669,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 +681,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 +1094,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); |
