diff options
author | Lisandro Lorea <lisandrolorea@gmail.com> | 2020-06-13 19:15:47 -0300 |
---|---|---|
committer | Lisandro Lorea <lisandrolorea@gmail.com> | 2020-06-13 20:06:19 -0300 |
commit | 5123006f06e235637b8b1d9faca92eecab476eee (patch) | |
tree | eea1ae0febb4ba71c02791a3a48fb3c36a5fddbc | |
parent | 58034f39829b8b95a3e5d4c6e8d1ab0427371548 (diff) |
Fix TabContainer emitting spurious tab_selected signals when a theme is changed
- The repaint code was moved outside of set_current_tab() and to a "_repaint()" private function
- _on_theme_changed() will now only call _repaint() and update()
This means _on_theme_changed() will do only what it needs (repainting the TabContainer to account for the new theme)
fixes #39498
-rw-r--r-- | scene/gui/tab_container.cpp | 45 | ||||
-rw-r--r-- | scene/gui/tab_container.h | 1 |
2 files changed, 26 insertions, 20 deletions
diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 8c4d9a5ece..0d48fde642 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -435,7 +435,30 @@ void TabContainer::_notification(int p_what) { void TabContainer::_on_theme_changed() { if (get_tab_count() > 0) { - set_current_tab(get_current_tab()); + _repaint(); + update(); + } +} + +void TabContainer::_repaint() { + Ref<StyleBox> sb = get_theme_stylebox("panel"); + Vector<Control *> tabs = _get_tabs(); + for (int i = 0; i < tabs.size(); i++) { + Control *c = tabs[i]; + if (i == current) { + c->show(); + c->set_anchors_and_margins_preset(Control::PRESET_WIDE); + if (tabs_visible) { + c->set_margin(MARGIN_TOP, _get_top_margin()); + } + c->set_margin(Margin(MARGIN_TOP), c->get_margin(Margin(MARGIN_TOP)) + sb->get_margin(Margin(MARGIN_TOP))); + c->set_margin(Margin(MARGIN_LEFT), c->get_margin(Margin(MARGIN_LEFT)) + sb->get_margin(Margin(MARGIN_LEFT))); + c->set_margin(Margin(MARGIN_RIGHT), c->get_margin(Margin(MARGIN_RIGHT)) - sb->get_margin(Margin(MARGIN_RIGHT))); + c->set_margin(Margin(MARGIN_BOTTOM), c->get_margin(Margin(MARGIN_BOTTOM)) - sb->get_margin(Margin(MARGIN_BOTTOM))); + + } else { + c->hide(); + } } } @@ -551,25 +574,7 @@ void TabContainer::set_current_tab(int p_current) { int pending_previous = current; current = p_current; - Ref<StyleBox> sb = get_theme_stylebox("panel"); - Vector<Control *> tabs = _get_tabs(); - for (int i = 0; i < tabs.size(); i++) { - Control *c = tabs[i]; - if (i == current) { - c->show(); - c->set_anchors_and_margins_preset(Control::PRESET_WIDE); - if (tabs_visible) { - c->set_margin(MARGIN_TOP, _get_top_margin()); - } - c->set_margin(Margin(MARGIN_TOP), c->get_margin(Margin(MARGIN_TOP)) + sb->get_margin(Margin(MARGIN_TOP))); - c->set_margin(Margin(MARGIN_LEFT), c->get_margin(Margin(MARGIN_LEFT)) + sb->get_margin(Margin(MARGIN_LEFT))); - c->set_margin(Margin(MARGIN_RIGHT), c->get_margin(Margin(MARGIN_RIGHT)) - sb->get_margin(Margin(MARGIN_RIGHT))); - c->set_margin(Margin(MARGIN_BOTTOM), c->get_margin(Margin(MARGIN_BOTTOM)) - sb->get_margin(Margin(MARGIN_BOTTOM))); - - } else { - c->hide(); - } - } + _repaint(); _change_notify("current_tab"); diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h index e8cde74c83..55a5d35b30 100644 --- a/scene/gui/tab_container.h +++ b/scene/gui/tab_container.h @@ -65,6 +65,7 @@ private: Vector<Control *> _get_tabs() const; int _get_tab_width(int p_index) const; void _on_theme_changed(); + void _repaint(); void _on_mouse_exited(); void _update_current_tab(); |