Update checked based on the variant type of the value
In `EditorProperty::update_revert_and_pin_status`, if `checkable` is `true`, update `checked` based on the variant type of the value, and rename the function as `EditorProperty::update_editor_property_status`. **Known problems:** 1. Unable to check Checkbox for properties of type `Object` when it is unchecked. This is probably because during value store/fetch, the `nullptr` (variant type is `Variant::OBJECT`) eventually becomes `Variant()` (variant type is `Variant::NIL`). 2. For theme overrides, click the revert icon will uncheck the Checkbox. This is probably because `EditorPropertyRevert::get_property_revert_value` returns `Variant()`.
This commit is contained in:
parent
c2babb6558
commit
9066d55763
2 changed files with 26 additions and 14 deletions
|
@ -458,7 +458,7 @@ StringName EditorProperty::_get_revert_property() const {
|
|||
return property;
|
||||
}
|
||||
|
||||
void EditorProperty::update_revert_and_pin_status() {
|
||||
void EditorProperty::update_editor_property_status() {
|
||||
if (property == StringName()) {
|
||||
return; //no property, so nothing to do
|
||||
}
|
||||
|
@ -469,15 +469,26 @@ void EditorProperty::update_revert_and_pin_status() {
|
|||
CRASH_COND(!node);
|
||||
new_pinned = node->is_property_pinned(property);
|
||||
}
|
||||
|
||||
Variant current = object->get(_get_revert_property());
|
||||
bool new_can_revert = EditorPropertyRevert::can_property_revert(object, property, ¤t) && !is_read_only();
|
||||
|
||||
if (new_can_revert != can_revert || new_pinned != pinned) {
|
||||
bool new_checked = checked;
|
||||
if (checkable) { // for properties like theme overrides.
|
||||
bool valid = false;
|
||||
Variant value = object->get(property, &valid);
|
||||
if (valid) {
|
||||
new_checked = value.get_type() != Variant::NIL;
|
||||
}
|
||||
}
|
||||
|
||||
if (new_can_revert != can_revert || new_pinned != pinned || new_checked != checked) {
|
||||
if (new_can_revert != can_revert) {
|
||||
emit_signal(SNAME("property_can_revert_changed"), property, new_can_revert);
|
||||
}
|
||||
can_revert = new_can_revert;
|
||||
pinned = new_pinned;
|
||||
checked = new_checked;
|
||||
queue_redraw();
|
||||
}
|
||||
}
|
||||
|
@ -974,7 +985,7 @@ void EditorProperty::_bind_methods() {
|
|||
ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::INT, "focusable_idx")));
|
||||
|
||||
GDVIRTUAL_BIND(_update_property)
|
||||
ClassDB::bind_method(D_METHOD("_update_revert_and_pin_status"), &EditorProperty::update_revert_and_pin_status);
|
||||
ClassDB::bind_method(D_METHOD("_update_editor_property_status"), &EditorProperty::update_editor_property_status);
|
||||
}
|
||||
|
||||
EditorProperty::EditorProperty() {
|
||||
|
@ -2552,7 +2563,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, EditorIn
|
|||
ep->set_read_only(read_only);
|
||||
ep->update_property();
|
||||
ep->_update_pin_flags();
|
||||
ep->update_revert_and_pin_status();
|
||||
ep->update_editor_property_status();
|
||||
ep->set_deletable(deletable_properties);
|
||||
ep->update_cache();
|
||||
}
|
||||
|
@ -3211,6 +3222,7 @@ void EditorInspector::update_tree() {
|
|||
// Use the existing one.
|
||||
ep->set_label(property_label_string);
|
||||
}
|
||||
|
||||
for (int j = 0; j < properties.size(); j++) {
|
||||
String prop = properties[j];
|
||||
|
||||
|
@ -3258,7 +3270,7 @@ void EditorInspector::update_tree() {
|
|||
ep->set_doc_path(doc_info.path);
|
||||
ep->update_property();
|
||||
ep->_update_pin_flags();
|
||||
ep->update_revert_and_pin_status();
|
||||
ep->update_editor_property_status();
|
||||
ep->update_cache();
|
||||
|
||||
if (current_selected && ep->property == current_selected) {
|
||||
|
@ -3297,7 +3309,7 @@ void EditorInspector::update_property(const String &p_prop) {
|
|||
|
||||
for (EditorProperty *E : editor_property_map[p_prop]) {
|
||||
E->update_property();
|
||||
E->update_revert_and_pin_status();
|
||||
E->update_editor_property_status();
|
||||
E->update_cache();
|
||||
}
|
||||
}
|
||||
|
@ -3640,7 +3652,7 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo
|
|||
|
||||
if (editor_property_map.has(p_name)) {
|
||||
for (EditorProperty *E : editor_property_map[p_name]) {
|
||||
E->update_revert_and_pin_status();
|
||||
E->update_editor_property_status();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3754,7 +3766,7 @@ void EditorInspector::_property_checked(const String &p_path, bool p_checked) {
|
|||
for (EditorProperty *E : editor_property_map[p_path]) {
|
||||
E->set_checked(p_checked);
|
||||
E->update_property();
|
||||
E->update_revert_and_pin_status();
|
||||
E->update_editor_property_status();
|
||||
E->update_cache();
|
||||
}
|
||||
}
|
||||
|
@ -3778,8 +3790,8 @@ void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) {
|
|||
undo_redo->add_undo_method(node, "_set_property_pinned", p_path, !p_pinned);
|
||||
if (editor_property_map.has(p_path)) {
|
||||
for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) {
|
||||
undo_redo->add_do_method(E->get(), "_update_revert_and_pin_status");
|
||||
undo_redo->add_undo_method(E->get(), "_update_revert_and_pin_status");
|
||||
undo_redo->add_do_method(E->get(), "_update_editor_property_status");
|
||||
undo_redo->add_undo_method(E->get(), "_update_editor_property_status");
|
||||
}
|
||||
}
|
||||
undo_redo->commit_action();
|
||||
|
@ -3787,7 +3799,7 @@ void EditorInspector::_property_pinned(const String &p_path, bool p_pinned) {
|
|||
node->set_property_pinned(p_path, p_pinned);
|
||||
if (editor_property_map.has(p_path)) {
|
||||
for (List<EditorProperty *>::Element *E = editor_property_map[p_path].front(); E; E = E->next()) {
|
||||
E->get()->update_revert_and_pin_status();
|
||||
E->get()->update_editor_property_status();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3868,7 +3880,7 @@ void EditorInspector::_notification(int p_what) {
|
|||
for (EditorProperty *E : F.value) {
|
||||
if (E && !E->is_cache_valid()) {
|
||||
E->update_property();
|
||||
E->update_revert_and_pin_status();
|
||||
E->update_editor_property_status();
|
||||
E->update_cache();
|
||||
}
|
||||
}
|
||||
|
@ -3890,7 +3902,7 @@ void EditorInspector::_notification(int p_what) {
|
|||
if (editor_property_map.has(prop)) {
|
||||
for (EditorProperty *E : editor_property_map[prop]) {
|
||||
E->update_property();
|
||||
E->update_revert_and_pin_status();
|
||||
E->update_editor_property_status();
|
||||
E->update_cache();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@ public:
|
|||
void set_doc_path(const String &p_doc_path);
|
||||
|
||||
virtual void update_property();
|
||||
void update_revert_and_pin_status();
|
||||
void update_editor_property_status();
|
||||
|
||||
virtual bool use_keying_next() const;
|
||||
|
||||
|
|
Loading…
Reference in a new issue