From ba273c6c5f1f3ae5601afcb7071d73a2f9d1628f Mon Sep 17 00:00:00 2001 From: Yuri Sizov Date: Wed, 1 Jun 2022 04:20:00 +0300 Subject: [PATCH] Fix theme propagation for children of top level controls and windows --- scene/gui/control.cpp | 27 ++++++++++++++++++--------- scene/main/window.cpp | 16 ++++++++++++++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index db78b4adb69..ba4dbe18742 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -719,8 +719,20 @@ void Control::_notification(int p_notification) { data.parent_window = Object::cast_to(get_parent()); data.is_rtl_dirty = true; + if (data.theme.is_null()) { + if (data.parent && (data.parent->data.theme_owner || data.parent->data.theme_owner_window)) { + data.theme_owner = data.parent->data.theme_owner; + data.theme_owner_window = data.parent->data.theme_owner_window; + notification(NOTIFICATION_THEME_CHANGED); + } else if (data.parent_window && (data.parent_window->theme_owner || data.parent_window->theme_owner_window)) { + data.theme_owner = data.parent_window->theme_owner; + data.theme_owner_window = data.parent_window->theme_owner_window; + notification(NOTIFICATION_THEME_CHANGED); + } + } + CanvasItem *node = this; - Control *parent_control = nullptr; + bool has_parent_control = false; while (!node->is_set_as_top_level()) { CanvasItem *parent = Object::cast_to(node->get_parent()); @@ -728,22 +740,19 @@ void Control::_notification(int p_notification) { break; } - parent_control = Object::cast_to(parent); + Control *parent_control = Object::cast_to(parent); if (parent_control) { + has_parent_control = true; break; } node = parent; } - if (parent_control) { + if (has_parent_control) { // Do nothing, has a parent control. - if (data.theme.is_null() && parent_control->data.theme_owner) { - data.theme_owner = parent_control->data.theme_owner; - notification(NOTIFICATION_THEME_CHANGED); - } } else { - //is a regular root control or top_level + // Is a regular root control or top_level. Viewport *viewport = get_viewport(); ERR_FAIL_COND(!viewport); data.RI = viewport->_gui_add_root_control(this); @@ -754,7 +763,7 @@ void Control::_notification(int p_notification) { if (data.parent_canvas_item) { data.parent_canvas_item->connect("item_rect_changed", callable_mp(this, &Control::_size_changed)); } else { - //connect viewport + // Connect viewport. Viewport *viewport = get_viewport(); ERR_FAIL_COND(!viewport); viewport->connect("size_changed", callable_mp(this, &Control::_size_changed)); diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 193f18c0758..b680c7c6dfa 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -791,6 +791,22 @@ void Window::_notification(int p_what) { emit_signal(SceneStringNames::get_singleton()->visibility_changed); RS::get_singleton()->viewport_set_active(get_viewport_rid(), true); } + + if (theme.is_null()) { + Control *parent_c = cast_to(get_parent()); + if (parent_c && (parent_c->data.theme_owner || parent_c->data.theme_owner_window)) { + theme_owner = parent_c->data.theme_owner; + theme_owner_window = parent_c->data.theme_owner_window; + notification(NOTIFICATION_THEME_CHANGED); + } else { + Window *parent_w = cast_to(get_parent()); + if (parent_w && (parent_w->theme_owner || parent_w->theme_owner_window)) { + theme_owner = parent_w->theme_owner; + theme_owner_window = parent_w->theme_owner_window; + notification(NOTIFICATION_THEME_CHANGED); + } + } + } } break; case NOTIFICATION_READY: {