diff options
Diffstat (limited to 'scene/gui/tab_container.cpp')
| -rw-r--r-- | scene/gui/tab_container.cpp | 40 | 
1 files changed, 40 insertions, 0 deletions
diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 0363dd44c2..4f72b5c6ed 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -143,6 +143,42 @@ void TabContainer::_notification(int p_what) {  	switch (p_what) { +		case NOTIFICATION_RESIZED: { + +			Vector<Control *> tabs = _get_tabs(); +			int side_margin = get_constant("side_margin"); +			Ref<Texture> menu = get_icon("menu"); +			Ref<Texture> increment = get_icon("increment"); +			Ref<Texture> decrement = get_icon("decrement"); +			int header_width = get_size().width - side_margin * 2; + +			// Find the width of the header area. +			if (popup) +				header_width -= menu->get_width(); +			if (buttons_visible_cache) +				header_width -= increment->get_width() + decrement->get_width(); +			if (popup || buttons_visible_cache) +				header_width += side_margin; + +			// Find the width of all tabs after first_tab_cache. +			int all_tabs_width = 0; +			for (int i = first_tab_cache; i < tabs.size(); i++) { +				int tab_width = _get_tab_width(i); +				all_tabs_width += tab_width; +			} + +			// Check if tabs before first_tab_cache would fit into the header area. +			for (int i = first_tab_cache - 1; i >= 0; i--) { +				int tab_width = _get_tab_width(i); + +				if (all_tabs_width + tab_width > header_width) +					break; + +				all_tabs_width += tab_width; +				first_tab_cache--; +			} +		} break; +  		case NOTIFICATION_DRAW: {  			RID canvas = get_canvas_item(); @@ -197,6 +233,10 @@ void TabContainer::_notification(int p_what) {  				header_width += side_margin;  			} +			if (!buttons_visible_cache) { +				first_tab_cache = 0; +			} +  			// Go through the visible tabs to find the width they occupy.  			all_tabs_width = 0;  			Vector<int> tab_widths;  |