mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-03 23:21:15 +00:00 
			
		
		
		
	Merge pull request #83963 from YeldhamDev/try_active_tabs_first
Fix disabled tabs being selected when removing the current one
This commit is contained in:
		
						commit
						17da2c5b53
					
				
					 3 changed files with 21 additions and 4 deletions
				
			
		| 
						 | 
					@ -317,7 +317,7 @@
 | 
				
			||||||
		<signal name="tab_selected">
 | 
							<signal name="tab_selected">
 | 
				
			||||||
			<param index="0" name="tab" type="int" />
 | 
								<param index="0" name="tab" type="int" />
 | 
				
			||||||
			<description>
 | 
								<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>
 | 
								</description>
 | 
				
			||||||
		</signal>
 | 
							</signal>
 | 
				
			||||||
	</signals>
 | 
						</signals>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -243,7 +243,7 @@
 | 
				
			||||||
		<signal name="tab_selected">
 | 
							<signal name="tab_selected">
 | 
				
			||||||
			<param index="0" name="tab" type="int" />
 | 
								<param index="0" name="tab" type="int" />
 | 
				
			||||||
			<description>
 | 
								<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>
 | 
								</description>
 | 
				
			||||||
		</signal>
 | 
							</signal>
 | 
				
			||||||
	</signals>
 | 
						</signals>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -675,7 +675,7 @@ bool TabBar::select_previous_available() {
 | 
				
			||||||
		if (target_tab < 0) {
 | 
							if (target_tab < 0) {
 | 
				
			||||||
			target_tab += get_tab_count();
 | 
								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);
 | 
								set_current_tab(target_tab);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -687,7 +687,7 @@ bool TabBar::select_next_available() {
 | 
				
			||||||
	const int offset_end = (get_tab_count() - get_current_tab());
 | 
						const int offset_end = (get_tab_count() - get_current_tab());
 | 
				
			||||||
	for (int i = 1; i < offset_end; i++) {
 | 
						for (int i = 1; i < offset_end; i++) {
 | 
				
			||||||
		int target_tab = (get_current_tab() + i) % get_tab_count();
 | 
							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);
 | 
								set_current_tab(target_tab);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1100,6 +1100,23 @@ void TabBar::remove_tab(int p_idx) {
 | 
				
			||||||
		max_drawn_tab = 0;
 | 
							max_drawn_tab = 0;
 | 
				
			||||||
		previous = 0;
 | 
							previous = 0;
 | 
				
			||||||
	} else {
 | 
						} 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);
 | 
							offset = MIN(offset, tabs.size() - 1);
 | 
				
			||||||
		max_drawn_tab = MIN(max_drawn_tab, tabs.size() - 1);
 | 
							max_drawn_tab = MIN(max_drawn_tab, tabs.size() - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue