diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 4e2e445740..feabedda44 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -3536,13 +3536,6 @@ void EditorInspector::update_tree() { } } - ep->set_draw_warning(draw_warning); - ep->set_use_folding(use_folding); - ep->set_favoritable(can_favorite && !disable_favorite); - ep->set_checkable(checkable); - ep->set_checked(checked); - ep->set_keying(keying); - ep->set_read_only(property_read_only || all_read_only); if (p.name.begins_with("metadata/")) { Variant _default = Variant(); if (node != nullptr) { @@ -3552,6 +3545,14 @@ void EditorInspector::update_tree() { } else { ep->set_deletable(deletable_properties); } + + ep->set_draw_warning(draw_warning); + ep->set_use_folding(use_folding); + ep->set_favoritable(can_favorite && !disable_favorite && !ep->is_deletable()); + ep->set_checkable(checkable); + ep->set_checked(checked); + ep->set_keying(keying); + ep->set_read_only(property_read_only || all_read_only); } if (ep && ep->is_favoritable() && current_favorites.has(p.name)) { @@ -4351,17 +4352,46 @@ void EditorInspector::_set_property_favorited(const String &p_path, bool p_favor return; } - StringName class_name = object->get_class_name(); - while (!class_name.is_empty()) { - bool has_prop = ClassDB::has_property(class_name, p_path, true); - if (has_prop) { + StringName validate_name = object->get_class_name(); + StringName class_name; + + String theme_property; + if (p_path.begins_with("theme_override_")) { + theme_property = p_path.get_slice("/", 1); + } + + while (!validate_name.is_empty()) { + class_name = validate_name; + + if (!theme_property.is_empty()) { // Deal with theme properties. + bool found = false; + HashMap::ConstIterator F = EditorHelp::get_doc_data()->class_list.find(class_name); + if (F) { + for (const DocData::ThemeItemDoc &prop : F->value.theme_properties) { + if (prop.name == theme_property) { + found = true; + break; + } + } + } + + if (found) { + break; + } + } else if (ClassDB::has_property(class_name, p_path, true)) { // Check if the property is built-in. break; } - class_name = ClassDB::get_parent_class_nocheck(class_name); + validate_name = ClassDB::get_parent_class_nocheck(class_name); + } + + // "script" isn't a real property, so a hack is necessary. + if (validate_name.is_empty() && p_path != "script") { + class_name = ""; } if (class_name.is_empty()) { + // Check if it's part of a script. Ref