Merge pull request #103922 from Jesusemora/Jesusemora-patch-1

Show `theme_type_variation`s in the inspector on `Control`s that inherit a theme
This commit is contained in:
Thaddeus Crews 2025-05-13 16:22:29 -05:00
commit 22a0e81a69
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
2 changed files with 46 additions and 4 deletions

View file

@ -461,9 +461,30 @@ void Control::_validate_property(PropertyInfo &p_property) const {
if (p_property.name == "theme_type_variation") {
List<StringName> 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<Control>(get_parent());
Window *tmp_window = Object::cast_to<Window>(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<Window>(tmp_control->get_parent());
tmp_control = Object::cast_to<Control>(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<Control>(tmp_window->get_parent());
tmp_window = Object::cast_to<Window>(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);
}

View file

@ -247,9 +247,30 @@ void Window::_validate_property(PropertyInfo &p_property) const {
} else if (p_property.name == "theme_type_variation") {
List<StringName> 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<Control>(get_parent());
Window *tmp_window = Object::cast_to<Window>(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<Window>(tmp_control->get_parent());
tmp_control = Object::cast_to<Control>(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<Control>(tmp_window->get_parent());
tmp_window = Object::cast_to<Window>(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);
}