diff options
Diffstat (limited to 'scene/gui/tab_container.cpp')
| -rw-r--r-- | scene/gui/tab_container.cpp | 49 | 
1 files changed, 46 insertions, 3 deletions
diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 212efa4976..6997c2809c 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -86,8 +86,8 @@ void TabContainer::_gui_input(const Ref<InputEvent> &p_event) {  			emit_signal("pre_popup_pressed");  			Vector2 popup_pos = get_global_position(); -			popup_pos.x += size.width - popup->get_size().width; -			popup_pos.y += menu->get_height(); +			popup_pos.x += size.width * get_global_transform().get_scale().x - popup->get_size().width * popup->get_global_transform().get_scale().x; +			popup_pos.y += menu->get_height() * get_global_transform().get_scale().y;  			popup->set_global_position(popup_pos);  			popup->popup(); @@ -127,6 +127,9 @@ void TabContainer::_gui_input(const Ref<InputEvent> &p_event) {  		// Activate the clicked tab.  		pos.x -= tabs_ofs_cache;  		for (int i = first_tab_cache; i <= last_tab_cache; i++) { +			if (get_tab_hidden(i)) { +				continue; +			}  			int tab_width = _get_tab_width(i);  			if (pos.x < tab_width) {  				if (!get_tab_disabled(i)) { @@ -216,6 +219,9 @@ void TabContainer::_notification(int p_what) {  			// Check if all tabs would fit into the header area.  			int all_tabs_width = 0;  			for (int i = 0; i < tabs.size(); i++) { +				if (get_tab_hidden(i)) { +					continue; +				}  				int tab_width = _get_tab_width(i);  				all_tabs_width += tab_width; @@ -241,6 +247,9 @@ void TabContainer::_notification(int p_what) {  			all_tabs_width = 0;  			Vector<int> tab_widths;  			for (int i = first_tab_cache; i < tabs.size(); i++) { +				if (get_tab_hidden(i)) { +					continue; +				}  				int tab_width = _get_tab_width(i);  				if (all_tabs_width + tab_width > header_width && tab_widths.size() > 0)  					break; @@ -267,6 +276,9 @@ void TabContainer::_notification(int p_what) {  			// Draw all visible tabs.  			int x = 0;  			for (int i = 0; i < tab_widths.size(); i++) { +				if (get_tab_hidden(i)) { +					continue; +				}  				Ref<StyleBox> tab_style;  				Color font_color;  				if (get_tab_disabled(i + first_tab_cache)) { @@ -338,6 +350,7 @@ void TabContainer::_notification(int p_what) {  			}  		} break;  		case NOTIFICATION_THEME_CHANGED: { +  			minimum_size_changed();  			call_deferred("_on_theme_changed"); //wait until all changed theme  		} break; @@ -354,7 +367,7 @@ int TabContainer::_get_tab_width(int p_index) const {  	ERR_FAIL_INDEX_V(p_index, get_tab_count(), 0);  	Control *control = Object::cast_to<Control>(_get_tabs()[p_index]); -	if (!control || control->is_set_as_toplevel()) +	if (!control || control->is_set_as_toplevel() || get_tab_hidden(p_index))  		return 0;  	// Get the width of the text displayed on the tab. @@ -765,6 +778,36 @@ bool TabContainer::get_tab_disabled(int p_tab) const {  		return false;  } +void TabContainer::set_tab_hidden(int p_tab, bool p_hidden) { + +	Control *child = _get_tab(p_tab); +	ERR_FAIL_COND(!child); +	child->set_meta("_tab_hidden", p_hidden); +	update(); +	for (int i = 0; i < get_tab_count(); i++) { +		int try_tab = (p_tab + 1 + i) % get_tab_count(); +		if (get_tab_disabled(try_tab) || get_tab_hidden(try_tab)) { +			continue; +		} + +		set_current_tab(try_tab); +		return; +	} + +	//assumed no other tab can be switched to, just hide +	child->hide(); +} + +bool TabContainer::get_tab_hidden(int p_tab) const { + +	Control *child = _get_tab(p_tab); +	ERR_FAIL_COND_V(!child, false); +	if (child->has_meta("_tab_hidden")) +		return child->get_meta("_tab_hidden"); +	else +		return false; +} +  void TabContainer::get_translatable_strings(List<String> *p_strings) const {  	Vector<Control *> tabs = _get_tabs();  |