Browse Source

Added drag and drop to the tileset plugin.

dankan1890 6 years ago
parent
commit
1f560c4679

+ 85 - 0
editor/plugins/tile_set_editor_plugin.cpp

@@ -176,6 +176,86 @@ Error TileSetEditor::update_library_file(Node *p_base_scene, Ref<TileSet> ml, bo
 	return OK;
 	return OK;
 }
 }
 
 
+Variant TileSetEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
+
+	return false;
+}
+
+bool TileSetEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const {
+
+	Dictionary d = p_data;
+
+	if (!d.has("type"))
+		return false;
+
+	if (d.has("from") && (Object *)(d["from"]) == texture_list)
+		return false;
+
+	if (String(d["type"]) == "resource" && d.has("resource")) {
+		RES r = d["resource"];
+
+		Ref<Texture> texture = r;
+
+		if (texture.is_valid()) {
+
+			return true;
+		}
+	}
+
+	if (String(d["type"]) == "files") {
+
+		Vector<String> files = d["files"];
+
+		if (files.size() == 0)
+			return false;
+
+		for (int i = 0; i < files.size(); i++) {
+			String file = files[i];
+			String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
+
+			if (!ClassDB::is_parent_class(ftype, "Texture")) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+	return false;
+}
+
+void TileSetEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
+
+	if (!can_drop_data_fw(p_point, p_data, p_from))
+		return;
+
+	Dictionary d = p_data;
+
+	if (!d.has("type"))
+		return;
+
+	if (String(d["type"]) == "resource" && d.has("resource")) {
+		RES r = d["resource"];
+
+		Ref<Texture> texture = r;
+
+		if (texture.is_valid())
+			add_texture(texture);
+
+		if (texture_list->get_item_count() > 0) {
+			update_texture_list_icon();
+			texture_list->select(texture_list->get_item_count() - 1);
+			_on_texture_list_selected(texture_list->get_item_count() - 1);
+		}
+	}
+
+	if (String(d["type"]) == "files") {
+
+		PoolVector<String> files = d["files"];
+
+		_on_textures_added(files);
+	}
+}
+
 void TileSetEditor::_bind_methods() {
 void TileSetEditor::_bind_methods() {
 
 
 	ClassDB::bind_method("_undo_redo_import_scene", &TileSetEditor::_undo_redo_import_scene);
 	ClassDB::bind_method("_undo_redo_import_scene", &TileSetEditor::_undo_redo_import_scene);
@@ -203,6 +283,10 @@ void TileSetEditor::_bind_methods() {
 	ClassDB::bind_method("_select_edited_shape_coord", &TileSetEditor::_select_edited_shape_coord);
 	ClassDB::bind_method("_select_edited_shape_coord", &TileSetEditor::_select_edited_shape_coord);
 	ClassDB::bind_method("_sort_tiles", &TileSetEditor::_sort_tiles);
 	ClassDB::bind_method("_sort_tiles", &TileSetEditor::_sort_tiles);
 
 
+	ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &TileSetEditor::get_drag_data_fw);
+	ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &TileSetEditor::can_drop_data_fw);
+	ClassDB::bind_method(D_METHOD("drop_data_fw"), &TileSetEditor::drop_data_fw);
+
 	ClassDB::bind_method("edit", &TileSetEditor::edit);
 	ClassDB::bind_method("edit", &TileSetEditor::edit);
 	ClassDB::bind_method("add_texture", &TileSetEditor::add_texture);
 	ClassDB::bind_method("add_texture", &TileSetEditor::add_texture);
 	ClassDB::bind_method("remove_texture", &TileSetEditor::remove_texture);
 	ClassDB::bind_method("remove_texture", &TileSetEditor::remove_texture);
@@ -274,6 +358,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
 	texture_list->set_v_size_flags(SIZE_EXPAND_FILL);
 	texture_list->set_v_size_flags(SIZE_EXPAND_FILL);
 	texture_list->set_custom_minimum_size(Size2(200, 0));
 	texture_list->set_custom_minimum_size(Size2(200, 0));
 	texture_list->connect("item_selected", this, "_on_texture_list_selected");
 	texture_list->connect("item_selected", this, "_on_texture_list_selected");
+	texture_list->set_drag_forwarding(this);
 
 
 	HBoxContainer *tileset_toolbar_container = memnew(HBoxContainer);
 	HBoxContainer *tileset_toolbar_container = memnew(HBoxContainer);
 	left_container->add_child(tileset_toolbar_container);
 	left_container->add_child(tileset_toolbar_container);

+ 6 - 0
editor/plugins/tile_set_editor_plugin.h

@@ -173,6 +173,12 @@ class TileSetEditor : public HSplitContainer {
 	static void _import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_merge);
 	static void _import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_merge);
 	void _undo_redo_import_scene(Node *p_scene, bool p_merge);
 	void _undo_redo_import_scene(Node *p_scene, bool p_merge);
 
 
+	bool _is_drop_valid(const Dictionary &p_drag_data, const Dictionary &p_item_data) const;
+	Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
+	bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
+	void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
+	void _file_load_request(const PoolVector<String> &p_path, int p_at_pos = -1);
+
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
 	void _notification(int p_what);
 	void _notification(int p_what);