Răsfoiți Sursa

Merge pull request #19528 from guilhermefelipecgs/fix_tab_resize

Fix TabContainer not showing tabs on left when resizing.
Rémi Verschelde 7 ani în urmă
părinte
comite
cca0b8cb03
1 a modificat fișierele cu 40 adăugiri și 0 ștergeri
  1. 40 0
      scene/gui/tab_container.cpp

+ 40 - 0
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;