浏览代码

Merge pull request #20400 from OliPerraul/oliperraul/20332/fix_defects_with_editor_export_dict

Fixed a number of issues related to the Dictionary export property for the editor
Rémi Verschelde 7 年之前
父节点
当前提交
bbdb6cf16e
共有 3 个文件被更改,包括 55 次插入15 次删除
  1. 17 3
      editor/editor_properties.cpp
  2. 1 0
      editor/editor_properties.h
  3. 37 12
      editor/editor_properties_array_dict.cpp

+ 17 - 3
editor/editor_properties.cpp

@@ -46,11 +46,22 @@ EditorPropertyNil::EditorPropertyNil() {
 }
 
 ///////////////////// TEXT /////////////////////////
+
+void EditorPropertyText::_text_entered(const String &p_string) {
+	if (updating)
+		return;
+
+	if (text->has_focus()) {
+		text->release_focus();
+		_text_changed(p_string);
+	}
+}
+
 void EditorPropertyText::_text_changed(const String &p_string) {
 	if (updating)
 		return;
 
-	emit_signal("property_changed", get_edited_property(), p_string, true);
+	emit_signal("property_changed", get_edited_property(), p_string);
 }
 
 void EditorPropertyText::update_property() {
@@ -64,6 +75,7 @@ void EditorPropertyText::update_property() {
 void EditorPropertyText::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("_text_changed", "txt"), &EditorPropertyText::_text_changed);
+	ClassDB::bind_method(D_METHOD("_text_entered", "txt"), &EditorPropertyText::_text_entered);
 }
 
 EditorPropertyText::EditorPropertyText() {
@@ -71,6 +83,8 @@ EditorPropertyText::EditorPropertyText() {
 	add_child(text);
 	add_focusable(text);
 	text->connect("text_changed", this, "_text_changed");
+	text->connect("text_entered", this, "_text_entered");
+
 	updating = false;
 }
 
@@ -78,12 +92,12 @@ EditorPropertyText::EditorPropertyText() {
 
 void EditorPropertyMultilineText::_big_text_changed() {
 	text->set_text(big_text->get_text());
-	emit_signal("property_changed", get_edited_property(), big_text->get_text(), true);
+	emit_signal("property_changed", get_edited_property(), big_text->get_text());
 }
 
 void EditorPropertyMultilineText::_text_changed() {
 
-	emit_signal("property_changed", get_edited_property(), text->get_text(), true);
+	emit_signal("property_changed", get_edited_property(), text->get_text());
 }
 
 void EditorPropertyMultilineText::_open_big_text() {

+ 1 - 0
editor/editor_properties.h

@@ -54,6 +54,7 @@ class EditorPropertyText : public EditorProperty {
 
 	bool updating;
 	void _text_changed(const String &p_string);
+	void _text_entered(const String &p_string);
 
 protected:
 	static void _bind_methods();

+ 37 - 12
editor/editor_properties_array_dict.cpp

@@ -210,8 +210,8 @@ void EditorPropertyArray::update_property() {
 		default: {}
 	}
 
-	if (!array.is_array()) {
-		edit->set_text(arrtype + "[" + Variant::get_type_name(array.get_type()) + "]");
+	if (array.get_type() == Variant::NIL) {
+		edit->set_text(String("(Nil) ") + arrtype);
 		edit->set_pressed(false);
 		if (vbox) {
 			memdelete(vbox);
@@ -219,7 +219,7 @@ void EditorPropertyArray::update_property() {
 		return;
 	}
 
-	edit->set_text(arrtype + "[" + itos(array.call("size")) + "]");
+	edit->set_text(arrtype + "(size " + itos(array.call("size")) + ")");
 
 #ifdef TOOLS_ENABLED
 
@@ -613,7 +613,13 @@ void EditorPropertyDictionary::_change_type(Object *p_button, int p_index) {
 
 void EditorPropertyDictionary::_add_key_value() {
 
+	// Do not allow nil as valid key. I experienced errors with this
+	if (object->get_new_item_key().get_type() == Variant::NIL) {
+		return;
+	}
+
 	Dictionary dict = object->get_dict();
+
 	dict[object->get_new_item_key()] = object->get_new_item_value();
 	object->set_new_item_key(Variant());
 	object->set_new_item_value(Variant());
@@ -663,9 +669,20 @@ void EditorPropertyDictionary::_change_type_menu(int p_index) {
 
 void EditorPropertyDictionary::update_property() {
 
-	Dictionary dict = get_edited_object()->get(get_edited_property());
+	Variant updated_val = get_edited_object()->get(get_edited_property());
+
+	if (updated_val.get_type() == Variant::NIL) {
+		edit->set_text("Dictionary (Nil)"); //This provides symmetry with the array property.
+		edit->set_pressed(false);
+		if (vbox) {
+			memdelete(vbox);
+		}
+		return;
+	}
+
+	Dictionary dict = updated_val;
 
-	edit->set_text("Dict[" + itos(dict.size()) + "]");
+	edit->set_text("Dictionary (size " + itos(dict.size()) + ")");
 
 #ifdef TOOLS_ENABLED
 
@@ -695,9 +712,9 @@ void EditorPropertyDictionary::update_property() {
 			page->set_h_size_flags(SIZE_EXPAND_FILL);
 			page->connect("value_changed", this, "_page_changed");
 		} else {
-			//bye bye children of the box
-			while (vbox->get_child_count() > 1) {
-				memdelete(vbox->get_child(1));
+			// Queue childs for deletion, delete immediately might cause errors.
+			for (size_t i = 1; i < vbox->get_child_count(); i++) {
+				vbox->get_child(i)->queue_delete();
 			}
 		}
 
@@ -941,10 +958,10 @@ void EditorPropertyDictionary::update_property() {
 			prop->update_property();
 
 			if (i == amount + 1) {
-				Button *add_item = memnew(Button);
-				add_item->set_text(TTR("Add Key/Value Pair"));
-				add_vbox->add_child(add_item);
-				add_item->connect("pressed", this, "_add_key_value");
+				Button *butt_add_item = memnew(Button);
+				butt_add_item->set_text(TTR("Add Key/Value Pair"));
+				butt_add_item->connect("pressed", this, "_add_key_value");
+				add_vbox->add_child(butt_add_item);
 			}
 		}
 
@@ -965,8 +982,16 @@ void EditorPropertyDictionary::_notification(int p_what) {
 	if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
 	}
 }
+
 void EditorPropertyDictionary::_edit_pressed() {
 
+	Variant prop_val = get_edited_object()->get(get_edited_property());
+	if (prop_val.get_type() == Variant::NIL) {
+		Variant::CallError ce;
+		prop_val = Variant::construct(Variant::DICTIONARY, NULL, 0, ce);
+		get_edited_object()->set(get_edited_property(), prop_val);
+	}
+
 	get_edited_object()->editor_set_section_unfold(get_edited_property(), edit->is_pressed());
 	update_property();
 }