summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
Diffstat (limited to 'editor')
-rw-r--r--editor/editor_inspector.cpp104
-rw-r--r--editor/editor_inspector.h12
-rw-r--r--editor/inspector_dock.cpp1
3 files changed, 114 insertions, 3 deletions
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index 9601eaf5f5..18c9a9f495 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -40,6 +40,7 @@
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "multi_node_edit.h"
+#include "scene/gui/center_container.h"
#include "scene/property_utils.h"
#include "scene/resources/packed_scene.h"
@@ -2506,7 +2507,7 @@ void EditorInspector::update_tree() {
List<PropertyInfo>::Element *N = E_property->next();
bool valid = true;
while (N) {
- if (N->get().usage & PROPERTY_USAGE_EDITOR && (!restrict_to_basic || (N->get().usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) {
+ if (!N->get().name.begins_with("metadata/_") && N->get().usage & PROPERTY_USAGE_EDITOR && (!restrict_to_basic || (N->get().usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) {
break;
}
if (N->get().usage & PROPERTY_USAGE_CATEGORY) {
@@ -2580,7 +2581,7 @@ void EditorInspector::update_tree() {
continue;
- } else if (!(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name) || (restrict_to_basic && !(p.usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) {
+ } else if (p.name.begins_with("metadata/_") || !(p.usage & PROPERTY_USAGE_EDITOR) || _is_property_disabled_by_feature_profile(p.name) || (restrict_to_basic && !(p.usage & PROPERTY_USAGE_EDITOR_BASIC_SETTING))) {
// Ignore properties that are not supposed to be in the inspector.
continue;
}
@@ -2915,7 +2916,7 @@ void EditorInspector::update_tree() {
ep->set_checked(checked);
ep->set_keying(keying);
ep->set_read_only(property_read_only);
- ep->set_deletable(deletable_properties);
+ ep->set_deletable(deletable_properties || p.name.begins_with("metadata/"));
}
current_vbox->add_child(F.property_editor);
@@ -2956,6 +2957,15 @@ void EditorInspector::update_tree() {
}
}
+ if (!hide_metadata) {
+ Button *add_md = memnew(Button);
+ add_md->set_text(TTR("Add Metadata"));
+ add_md->set_focus_mode(Control::FOCUS_NONE);
+ add_md->set_icon(get_theme_icon("Add", "EditorIcons"));
+ add_md->connect("pressed", callable_mp(this, &EditorInspector::_show_add_meta_dialog));
+ main_vbox->add_child(add_md);
+ }
+
// Get the lists of to add at the end.
for (Ref<EditorInspectorPlugin> &ped : valid_plugins) {
ped->parse_end(object);
@@ -3055,6 +3065,11 @@ void EditorInspector::set_hide_script(bool p_hide) {
update_tree();
}
+void EditorInspector::set_hide_metadata(bool p_hide) {
+ hide_metadata = p_hide;
+ update_tree();
+}
+
void EditorInspector::set_use_filter(bool p_use) {
use_filter = p_use;
update_tree();
@@ -3323,6 +3338,14 @@ void EditorInspector::_property_deleted(const String &p_path) {
return;
}
+ if (p_path.begins_with("metadata/")) {
+ String name = p_path.replace_first("metadata/", "");
+ undo_redo->create_action(vformat(TTR("Remove metadata %s"), name));
+ undo_redo->add_do_method(object, "remove_meta", name);
+ undo_redo->add_undo_method(object, "set_meta", name, object->get_meta(name));
+ undo_redo->commit_action();
+ }
+
emit_signal(SNAME("property_deleted"), p_path);
}
@@ -3650,6 +3673,81 @@ Variant EditorInspector::get_property_clipboard() const {
return property_clipboard;
}
+void EditorInspector::_add_meta_confirm() {
+ String name = add_meta_name->get_text();
+
+ object->editor_set_section_unfold("metadata", true); // Ensure metadata is unfolded when adding a new metadata.
+
+ Variant defval;
+ Callable::CallError ce;
+ Variant::construct(Variant::Type(add_meta_type->get_selected_id()), defval, nullptr, 0, ce);
+ undo_redo->create_action(vformat(TTR("Add metadata %s"), name));
+ undo_redo->add_do_method(object, "set_meta", name, defval);
+ undo_redo->add_undo_method(object, "remove_meta", name);
+ undo_redo->commit_action();
+}
+
+void EditorInspector::_check_meta_name(String name) {
+ String error;
+
+ if (name == "") {
+ error = TTR("Metadata can't be empty.");
+ } else if (!name.is_valid_identifier()) {
+ error = TTR("Invalid metadata identifier.");
+ } else if (object->has_meta(name)) {
+ error = TTR("Metadata already exists.");
+ }
+
+ if (error != "") {
+ add_meta_error->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor")));
+ add_meta_error->set_text(error);
+ add_meta_dialog->get_ok_button()->set_disabled(true);
+ } else {
+ add_meta_error->add_theme_color_override("font_color", get_theme_color(SNAME("success_color"), SNAME("Editor")));
+ add_meta_error->set_text(TTR("Metadata name is valid."));
+ add_meta_dialog->get_ok_button()->set_disabled(false);
+ }
+}
+
+void EditorInspector::_show_add_meta_dialog() {
+ if (!add_meta_dialog) {
+ add_meta_dialog = memnew(ConfirmationDialog);
+ add_meta_dialog->set_title(TTR("Add Metadata Property"));
+ VBoxContainer *vbc = memnew(VBoxContainer);
+ add_meta_dialog->add_child(vbc);
+ HBoxContainer *hbc = memnew(HBoxContainer);
+ vbc->add_child(hbc);
+ hbc->add_child(memnew(Label(TTR("Name:"))));
+ add_meta_name = memnew(LineEdit);
+ add_meta_name->set_custom_minimum_size(Size2(200 * EDSCALE, 1));
+ hbc->add_child(add_meta_name);
+ hbc->add_child(memnew(Label(TTR("Type:"))));
+ add_meta_type = memnew(OptionButton);
+ for (int i = 0; i < Variant::VARIANT_MAX; i++) {
+ if (i == Variant::NIL || i == Variant::RID || i == Variant::CALLABLE || i == Variant::SIGNAL) {
+ continue; //not editable by inspector.
+ }
+ String type = i == Variant::OBJECT ? String("Resource") : Variant::get_type_name(Variant::Type(i));
+
+ add_meta_type->add_icon_item(get_theme_icon(type, "EditorIcons"), type, i);
+ }
+ hbc->add_child(add_meta_type);
+ add_meta_dialog->get_ok_button()->set_text(TTR("Add"));
+ add_child(add_meta_dialog);
+ add_meta_dialog->register_text_enter(add_meta_name);
+ add_meta_dialog->connect("confirmed", callable_mp(this, &EditorInspector::_add_meta_confirm));
+ add_meta_error = memnew(Label);
+ vbc->add_child(add_meta_error);
+
+ add_meta_name->connect("text_changed", callable_mp(this, &EditorInspector::_check_meta_name));
+ }
+
+ add_meta_dialog->popup_centered();
+ add_meta_name->set_text("");
+ _check_meta_name("");
+ add_meta_name->grab_focus();
+}
+
void EditorInspector::_bind_methods() {
ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change);
diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h
index 3c482a07e7..d625a8043c 100644
--- a/editor/editor_inspector.h
+++ b/editor/editor_inspector.h
@@ -35,6 +35,7 @@
#include "scene/gui/button.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/line_edit.h"
+#include "scene/gui/option_button.h"
#include "scene/gui/panel_container.h"
#include "scene/gui/scroll_container.h"
#include "scene/gui/texture_rect.h"
@@ -445,6 +446,7 @@ class EditorInspector : public ScrollContainer {
LineEdit *search_box;
bool show_categories = false;
bool hide_script = true;
+ bool hide_metadata = true;
bool use_doc_hints = false;
bool capitalize_paths = true;
bool use_filter = false;
@@ -511,6 +513,15 @@ class EditorInspector : public ScrollContainer {
void _update_inspector_bg();
+ ConfirmationDialog *add_meta_dialog = nullptr;
+ LineEdit *add_meta_name = nullptr;
+ OptionButton *add_meta_type = nullptr;
+ Label *add_meta_error = nullptr;
+
+ void _add_meta_confirm();
+ void _show_add_meta_dialog();
+ void _check_meta_name(String name);
+
protected:
static void _bind_methods();
void _notification(int p_what);
@@ -541,6 +552,7 @@ public:
void set_show_categories(bool p_show);
void set_use_doc_hints(bool p_enable);
void set_hide_script(bool p_hide);
+ void set_hide_metadata(bool p_hide);
void set_use_filter(bool p_use);
void register_text_enter(Node *p_line_edit);
diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp
index 087e51b0cb..9ebea79435 100644
--- a/editor/inspector_dock.cpp
+++ b/editor/inspector_dock.cpp
@@ -679,6 +679,7 @@ InspectorDock::InspectorDock(EditorData &p_editor_data) {
inspector->set_v_size_flags(Control::SIZE_EXPAND_FILL);
inspector->set_use_doc_hints(true);
inspector->set_hide_script(false);
+ inspector->set_hide_metadata(false);
inspector->set_enable_capitalize_paths(bool(EDITOR_GET("interface/inspector/capitalize_properties")));
inspector->set_use_folding(!bool(EDITOR_GET("interface/inspector/disable_folding")));
inspector->register_text_enter(search);