diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2018-06-13 15:02:08 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-13 15:02:08 +0200 |
commit | cca0b8cb03f96a18e28354f22f450e0aaeb46e91 (patch) | |
tree | e385157bae8b942e1f23e49371736d448da1032f | |
parent | 9165e550f85c820a65dc97111c521ac74275ecb4 (diff) | |
parent | b904c37a5499cba6a645a2976196740027c21d15 (diff) |
Merge pull request #19528 from guilhermefelipecgs/fix_tab_resize
Fix TabContainer not showing tabs on left when resizing.
-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; |