diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2022-08-07 16:00:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-07 16:00:46 +0200 |
commit | f3a76f63c6d55f696d3ee24c98c5ca511286cac5 (patch) | |
tree | e7b1d7cbb65b19098c9eca95be945fb735d73c0a | |
parent | 4d74d9fe8cc6cc5303ef923f324185359121ac5f (diff) | |
parent | 3ed980a4b71096e5e05a6314c178a3d19dff56d2 (diff) |
Merge pull request #62089 from Step-an/add_drag_and_drop_to_EditorPropertyPath
-rw-r--r-- | editor/editor_properties.cpp | 42 | ||||
-rw-r--r-- | editor/editor_properties.h | 2 |
2 files changed, 44 insertions, 0 deletions
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index c713fe3df0..5e66d436fc 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -507,13 +507,55 @@ void EditorPropertyPath::_path_focus_exited() { _path_selected(path->get_text()); } +void EditorPropertyPath::_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { + const Dictionary drag_data = p_data; + if (!drag_data.has("type")) { + return; + } + if (String(drag_data["type"]) != "files") { + return; + } + const Vector<String> filesPaths = drag_data["files"]; + if (filesPaths.size() == 0) { + return; + } + + emit_changed(get_edited_property(), filesPaths[0]); + update_property(); +} + +bool EditorPropertyPath::_can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { + const Dictionary drag_data = p_data; + if (!drag_data.has("type")) { + return false; + } + if (String(drag_data["type"]) != "files") { + return false; + } + const Vector<String> filesPaths = drag_data["files"]; + if (filesPaths.size() == 0) { + return false; + } + + for (const String &extension : extensions) { + if (filesPaths[0].ends_with(extension.substr(1, extension.size() - 1))) { + return true; + } + } + + return false; +} + void EditorPropertyPath::_bind_methods() { + ClassDB::bind_method(D_METHOD("_can_drop_data_fw", "position", "data", "from"), &EditorPropertyPath::_can_drop_data_fw); + ClassDB::bind_method(D_METHOD("_drop_data_fw", "position", "data", "from"), &EditorPropertyPath::_drop_data_fw); } EditorPropertyPath::EditorPropertyPath() { HBoxContainer *path_hb = memnew(HBoxContainer); add_child(path_hb); path = memnew(LineEdit); + path->set_drag_forwarding(this); path->set_structured_text_bidi_override(TextServer::STRUCTURED_TEXT_FILE); path_hb->add_child(path); path->connect("text_submitted", callable_mp(this, &EditorPropertyPath::_path_selected)); diff --git a/editor/editor_properties.h b/editor/editor_properties.h index 6a1360d2ca..5c73a53184 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -142,6 +142,8 @@ class EditorPropertyPath : public EditorProperty { void _path_selected(const String &p_path); void _path_pressed(); void _path_focus_exited(); + void _drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + bool _can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; protected: virtual void _set_read_only(bool p_read_only) override; |