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
This commit is contained in:
parent
58034f3982
commit
5123006f06
|
@ -435,7 +435,30 @@ void TabContainer::_notification(int p_what) {
|
||||||
|
|
||||||
void TabContainer::_on_theme_changed() {
|
void TabContainer::_on_theme_changed() {
|
||||||
if (get_tab_count() > 0) {
|
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;
|
int pending_previous = current;
|
||||||
current = p_current;
|
current = p_current;
|
||||||
|
|
||||||
Ref<StyleBox> sb = get_theme_stylebox("panel");
|
_repaint();
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_change_notify("current_tab");
|
_change_notify("current_tab");
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ private:
|
||||||
Vector<Control *> _get_tabs() const;
|
Vector<Control *> _get_tabs() const;
|
||||||
int _get_tab_width(int p_index) const;
|
int _get_tab_width(int p_index) const;
|
||||||
void _on_theme_changed();
|
void _on_theme_changed();
|
||||||
|
void _repaint();
|
||||||
void _on_mouse_exited();
|
void _on_mouse_exited();
|
||||||
void _update_current_tab();
|
void _update_current_tab();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue