diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index d5fbb333a3c..169b75a4c36 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -461,9 +461,30 @@ void Control::_validate_property(PropertyInfo &p_property) const { if (p_property.name == "theme_type_variation") { List names; - // Only the default theme and the project theme are used for the list of options. - // This is an imposed limitation to simplify the logic needed to leverage those options. ThemeDB::get_singleton()->get_default_theme()->get_type_variation_list(get_class_name(), &names); + + // Iterate to find all themes. + Control *tmp_control = Object::cast_to(get_parent()); + Window *tmp_window = Object::cast_to(get_parent()); + while (tmp_control || tmp_window) { + // We go up and any non Control/Window will break the chain. + if (tmp_control) { + if (tmp_control->get_theme().is_valid()) { + tmp_control->get_theme()->get_type_variation_list(get_class_name(), &names); + } + tmp_window = Object::cast_to(tmp_control->get_parent()); + tmp_control = Object::cast_to(tmp_control->get_parent()); + } else { // Window. + if (tmp_window->get_theme().is_valid()) { + tmp_window->get_theme()->get_type_variation_list(get_class_name(), &names); + } + tmp_control = Object::cast_to(tmp_window->get_parent()); + tmp_window = Object::cast_to(tmp_window->get_parent()); + } + } + if (get_theme().is_valid()) { + get_theme()->get_type_variation_list(get_class_name(), &names); + } if (ThemeDB::get_singleton()->get_project_theme().is_valid()) { ThemeDB::get_singleton()->get_project_theme()->get_type_variation_list(get_class_name(), &names); } diff --git a/scene/main/window.cpp b/scene/main/window.cpp index a3a1c4df726..6e90ac0f9fb 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -247,9 +247,30 @@ void Window::_validate_property(PropertyInfo &p_property) const { } else if (p_property.name == "theme_type_variation") { List names; - // Only the default theme and the project theme are used for the list of options. - // This is an imposed limitation to simplify the logic needed to leverage those options. ThemeDB::get_singleton()->get_default_theme()->get_type_variation_list(get_class_name(), &names); + + // Iterate to find all themes. + Control *tmp_control = Object::cast_to(get_parent()); + Window *tmp_window = Object::cast_to(get_parent()); + while (tmp_control || tmp_window) { + // We go up and any non Control/Window will break the chain. + if (tmp_control) { + if (tmp_control->get_theme().is_valid()) { + tmp_control->get_theme()->get_type_variation_list(get_class_name(), &names); + } + tmp_window = Object::cast_to(tmp_control->get_parent()); + tmp_control = Object::cast_to(tmp_control->get_parent()); + } else { // Window. + if (tmp_window->get_theme().is_valid()) { + tmp_window->get_theme()->get_type_variation_list(get_class_name(), &names); + } + tmp_control = Object::cast_to(tmp_window->get_parent()); + tmp_window = Object::cast_to(tmp_window->get_parent()); + } + } + if (get_theme().is_valid()) { + get_theme()->get_type_variation_list(get_class_name(), &names); + } if (ThemeDB::get_singleton()->get_project_theme().is_valid()) { ThemeDB::get_singleton()->get_project_theme()->get_type_variation_list(get_class_name(), &names); }