Fix implementation of property_can_revert() in various classes

This commit is contained in:
kobewi 2024-08-06 00:11:02 +02:00
parent db66bd35af
commit b9d25580ce
6 changed files with 32 additions and 65 deletions

View File

@ -1167,23 +1167,17 @@ bool ProjectSettings::is_project_loaded() const {
}
bool ProjectSettings::_property_can_revert(const StringName &p_name) const {
if (!props.has(p_name)) {
return false;
}
return props[p_name].initial != props[p_name].variant;
return props.has(p_name);
}
bool ProjectSettings::_property_get_revert(const StringName &p_name, Variant &r_property) const {
if (!props.has(p_name)) {
return false;
}
// Duplicate so that if value is array or dictionary, changing the setting will not change the stored initial value.
r_property = props[p_name].initial.duplicate();
const RBMap<StringName, ProjectSettings::VariantContainer>::Element *value = props.find(p_name);
if (value) {
r_property = value->value().initial.duplicate();
return true;
}
return false;
}
void ProjectSettings::set_setting(const String &p_setting, const Variant &p_value) {
set(p_setting, p_value);

View File

@ -1424,25 +1424,21 @@ Variant _EDITOR_GET(const String &p_setting) {
}
bool EditorSettings::_property_can_revert(const StringName &p_name) const {
if (!props.has(p_name)) {
return false;
const VariantContainer *property = props.getptr(p_name);
if (property) {
return property->has_default_value;
}
if (!props[p_name].has_default_value) {
return false;
}
return props[p_name].initial != props[p_name].variant;
}
bool EditorSettings::_property_get_revert(const StringName &p_name, Variant &r_property) const {
if (!props.has(p_name) || !props[p_name].has_default_value) {
return false;
}
r_property = props[p_name].initial;
const VariantContainer *value = props.getptr(p_name);
if (value && value->has_default_value) {
r_property = value->initial;
return true;
}
return false;
}
void EditorSettings::add_property_hint(const PropertyInfo &p_hint) {
_THREAD_SAFE_METHOD_

View File

@ -186,25 +186,9 @@ bool MultiNodeEdit::_property_can_revert(const StringName &p_name) const {
}
if (ClassDB::has_property(get_edited_class_name(), p_name)) {
StringName class_name;
for (const NodePath &E : nodes) {
Node *node = es->get_node_or_null(E);
if (!node) {
continue;
}
class_name = node->get_class_name();
}
Variant default_value = ClassDB::class_get_default_property_value(class_name, p_name);
for (const NodePath &E : nodes) {
Node *node = es->get_node_or_null(E);
if (!node) {
continue;
}
if (node->get(p_name) != default_value) {
// A node that doesn't have the default value has been found, so show the revert button.
if (node) {
return true;
}
}

View File

@ -121,13 +121,8 @@ bool EditorPropertyFontOTObject::_property_can_revert(const StringName &p_name)
if (name.begins_with("keys")) {
int key = name.get_slicec('/', 1).to_int();
if (defaults_dict.has(key) && dict.has(key)) {
int value = dict[key];
Vector3i range = defaults_dict[key];
return range.z != value;
return defaults_dict.has(key) && dict.has(key);
}
}
return false;
}
@ -142,7 +137,6 @@ bool EditorPropertyFontOTObject::_property_get_revert(const StringName &p_name,
return true;
}
}
return false;
}

View File

@ -1181,15 +1181,16 @@ void Node3D::_validate_property(PropertyInfo &p_property) const {
}
bool Node3D::_property_can_revert(const StringName &p_name) const {
if (p_name == "basis") {
const String sname = p_name;
if (sname == "basis") {
return true;
} else if (p_name == "scale") {
} else if (sname == "scale") {
return true;
} else if (p_name == "quaternion") {
} else if (sname == "quaternion") {
return true;
} else if (p_name == "rotation") {
} else if (sname == "rotation") {
return true;
} else if (p_name == "position") {
} else if (sname == "position") {
return true;
}
return false;
@ -1198,35 +1199,36 @@ bool Node3D::_property_can_revert(const StringName &p_name) const {
bool Node3D::_property_get_revert(const StringName &p_name, Variant &r_property) const {
bool valid = false;
if (p_name == "basis") {
const String sname = p_name;
if (sname == "basis") {
Variant variant = PropertyUtils::get_property_default_value(this, "transform", &valid);
if (valid && variant.get_type() == Variant::Type::TRANSFORM3D) {
r_property = Transform3D(variant).get_basis();
} else {
r_property = Basis();
}
} else if (p_name == "scale") {
} else if (sname == "scale") {
Variant variant = PropertyUtils::get_property_default_value(this, "transform", &valid);
if (valid && variant.get_type() == Variant::Type::TRANSFORM3D) {
r_property = Transform3D(variant).get_basis().get_scale();
} else {
r_property = Vector3(1.0, 1.0, 1.0);
}
} else if (p_name == "quaternion") {
} else if (sname == "quaternion") {
Variant variant = PropertyUtils::get_property_default_value(this, "transform", &valid);
if (valid && variant.get_type() == Variant::Type::TRANSFORM3D) {
r_property = Quaternion(Transform3D(variant).get_basis().get_rotation_quaternion());
} else {
r_property = Quaternion();
}
} else if (p_name == "rotation") {
} else if (sname == "rotation") {
Variant variant = PropertyUtils::get_property_default_value(this, "transform", &valid);
if (valid && variant.get_type() == Variant::Type::TRANSFORM3D) {
r_property = Transform3D(variant).get_basis().get_euler_normalized(data.euler_rotation_order);
} else {
r_property = Vector3();
}
} else if (p_name == "position") {
} else if (sname == "position") {
Variant variant = PropertyUtils::get_property_default_value(this, "transform", &valid);
if (valid) {
r_property = Transform3D(variant).get_origin();

View File

@ -382,14 +382,11 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const {
bool ShaderMaterial::_property_can_revert(const StringName &p_name) const {
if (shader.is_valid()) {
const StringName *pr = remap_cache.getptr(p_name);
if (pr) {
Variant default_value = RenderingServer::get_singleton()->shader_get_parameter_default(shader->get_rid(), *pr);
Variant current_value = get_shader_parameter(*pr);
return default_value.get_type() != Variant::NIL && default_value != current_value;
} else if (p_name == "render_priority" || p_name == "next_pass") {
if (remap_cache.has(p_name)) {
return true;
}
const String sname = p_name;
return sname == "render_priority" || sname == "next_pass";
}
return false;
}