Merge pull request #39404 from rcorre/proposal-106-copy-prop-path

Allow copying property path from inspector.
This commit is contained in:
Tomek 2021-08-27 00:39:42 +02:00 committed by GitHub
commit f6f5e0f934
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 83 additions and 0 deletions

View file

@ -31,11 +31,13 @@
#include "editor_inspector.h" #include "editor_inspector.h"
#include "array_property_edit.h" #include "array_property_edit.h"
#include "core/os/keyboard.h"
#include "dictionary_property_edit.h" #include "dictionary_property_edit.h"
#include "editor/doc_tools.h" #include "editor/doc_tools.h"
#include "editor_feature_profile.h" #include "editor_feature_profile.h"
#include "editor_node.h" #include "editor_node.h"
#include "editor_scale.h" #include "editor_scale.h"
#include "editor_settings.h"
#include "multi_node_edit.h" #include "multi_node_edit.h"
#include "scene/resources/packed_scene.h" #include "scene/resources/packed_scene.h"
@ -782,6 +784,30 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
update(); update();
emit_signal(SNAME("property_checked"), property, checked); emit_signal(SNAME("property_checked"), property, checked);
} }
} else if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) {
_ensure_popup();
menu->set_position(get_screen_position() + get_local_mouse_position());
menu->set_size(Vector2(1, 1));
menu->popup();
select();
return;
}
}
void EditorProperty::unhandled_key_input(const Ref<InputEvent> &p_event) {
if (!selected) {
return;
}
if (ED_IS_SHORTCUT("property_editor/copy_property", p_event)) {
menu_option(MENU_COPY_PROPERTY);
accept_event();
} else if (ED_IS_SHORTCUT("property_editor/paste_property", p_event) && !is_read_only()) {
menu_option(MENU_PASTE_PROPERTY);
accept_event();
} else if (ED_IS_SHORTCUT("property_editor/copy_property_path", p_event)) {
menu_option(MENU_COPY_PROPERTY_PATH);
accept_event();
} }
} }
@ -895,6 +921,20 @@ String EditorProperty::get_tooltip_text() const {
return tooltip_text; return tooltip_text;
} }
void EditorProperty::menu_option(int p_option) {
switch (p_option) {
case MENU_COPY_PROPERTY: {
EditorNode::get_singleton()->get_inspector()->set_property_clipboard(object->get(property));
} break;
case MENU_PASTE_PROPERTY: {
emit_changed(property, EditorNode::get_singleton()->get_inspector()->get_property_clipboard());
} break;
case MENU_COPY_PROPERTY_PATH: {
DisplayServer::get_singleton()->clipboard_set(property);
} break;
}
}
void EditorProperty::_bind_methods() { void EditorProperty::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_label", "text"), &EditorProperty::set_label); ClassDB::bind_method(D_METHOD("set_label", "text"), &EditorProperty::set_label);
ClassDB::bind_method(D_METHOD("get_label"), &EditorProperty::get_label); ClassDB::bind_method(D_METHOD("get_label"), &EditorProperty::get_label);
@ -971,6 +1011,21 @@ EditorProperty::EditorProperty() {
label_reference = nullptr; label_reference = nullptr;
bottom_editor = nullptr; bottom_editor = nullptr;
delete_hover = false; delete_hover = false;
menu = nullptr;
set_process_unhandled_key_input(true);
}
void EditorProperty::_ensure_popup() {
if (menu) {
return;
}
menu = memnew(PopupMenu);
menu->add_shortcut(ED_GET_SHORTCUT("property_editor/copy_property"), MENU_COPY_PROPERTY);
menu->add_shortcut(ED_GET_SHORTCUT("property_editor/paste_property"), MENU_PASTE_PROPERTY);
menu->add_shortcut(ED_GET_SHORTCUT("property_editor/copy_property_path"), MENU_COPY_PROPERTY_PATH);
menu->connect("id_pressed", callable_mp(this, &EditorProperty::menu_option));
menu->set_item_disabled(MENU_PASTE_PROPERTY, is_read_only());
add_child(menu);
} }
//////////////////////////////////////////////// ////////////////////////////////////////////////
@ -2615,6 +2670,14 @@ void EditorInspector::set_restrict_to_basic_settings(bool p_restrict) {
update_tree(); update_tree();
} }
void EditorInspector::set_property_clipboard(const Variant &p_value) {
property_clipboard = p_value;
}
Variant EditorInspector::get_property_clipboard() const {
return property_clipboard;
}
void EditorInspector::_bind_methods() { void EditorInspector::_bind_methods() {
ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change); ClassDB::bind_method("_edit_request_change", &EditorInspector::_edit_request_change);
@ -2657,6 +2720,7 @@ EditorInspector::EditorInspector() {
property_focusable = -1; property_focusable = -1;
sub_inspector = false; sub_inspector = false;
deletable_properties = false; deletable_properties = false;
property_clipboard = Variant();
get_v_scrollbar()->connect("value_changed", callable_mp(this, &EditorInspector::_vscroll_changed)); get_v_scrollbar()->connect("value_changed", callable_mp(this, &EditorInspector::_vscroll_changed));
update_scroll_request = -1; update_scroll_request = -1;
@ -2666,4 +2730,8 @@ EditorInspector::EditorInspector() {
//used when class is created by the docgen to dump default values of everything bindable, editorsettings may not be created //used when class is created by the docgen to dump default values of everything bindable, editorsettings may not be created
refresh_countdown = 0.33; refresh_countdown = 0.33;
} }
ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KEY_MASK_CMD | KEY_C);
ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KEY_MASK_CMD | KEY_V);
ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C);
} }

View file

@ -51,6 +51,13 @@ public:
class EditorProperty : public Container { class EditorProperty : public Container {
GDCLASS(EditorProperty, Container); GDCLASS(EditorProperty, Container);
public:
enum MenuItems {
MENU_COPY_PROPERTY,
MENU_PASTE_PROPERTY,
MENU_COPY_PROPERTY_PATH,
};
private: private:
String label; String label;
int text_size; int text_size;
@ -84,6 +91,7 @@ private:
bool use_folding; bool use_folding;
bool draw_top_bg; bool draw_top_bg;
void _ensure_popup();
bool _is_property_different(const Variant &p_current, const Variant &p_orig); bool _is_property_different(const Variant &p_current, const Variant &p_orig);
bool _get_instantiated_node_original_property(const StringName &p_prop, Variant &value); bool _get_instantiated_node_original_property(const StringName &p_prop, Variant &value);
void _focusable_focused(int p_index); void _focusable_focused(int p_index);
@ -97,6 +105,7 @@ private:
Vector<Control *> focusables; Vector<Control *> focusables;
Control *label_reference; Control *label_reference;
Control *bottom_editor; Control *bottom_editor;
PopupMenu *menu;
mutable String tooltip_text; mutable String tooltip_text;
@ -108,6 +117,7 @@ protected:
static void _bind_methods(); static void _bind_methods();
virtual void gui_input(const Ref<InputEvent> &p_event) override; virtual void gui_input(const Ref<InputEvent> &p_event) override;
virtual void unhandled_key_input(const Ref<InputEvent> &p_event) override;
public: public:
void emit_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field = StringName(), bool p_changing = false); void emit_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field = StringName(), bool p_changing = false);
@ -175,6 +185,8 @@ public:
bool can_revert_to_default() const { return can_revert; } bool can_revert_to_default() const { return can_revert; }
void menu_option(int p_option);
EditorProperty(); EditorProperty();
}; };
@ -321,6 +333,7 @@ class EditorInspector : public ScrollContainer {
String property_prefix; //used for sectioned inspector String property_prefix; //used for sectioned inspector
String object_class; String object_class;
Variant property_clipboard;
bool restrict_to_basic = false; bool restrict_to_basic = false;
@ -412,6 +425,8 @@ public:
void set_use_deletable_properties(bool p_enabled); void set_use_deletable_properties(bool p_enabled);
void set_restrict_to_basic_settings(bool p_restrict); void set_restrict_to_basic_settings(bool p_restrict);
void set_property_clipboard(const Variant &p_value);
Variant get_property_clipboard() const;
EditorInspector(); EditorInspector();
}; };