瀏覽代碼

Add right click option to create folders.

MillionOstrich 8 年之前
父節點
當前提交
0939c0a9ce
共有 2 個文件被更改,包括 58 次插入0 次删除
  1. 53 0
      editor/filesystem_dock.cpp
  2. 5 0
      editor/filesystem_dock.h

+ 53 - 0
editor/filesystem_dock.cpp

@@ -808,6 +808,33 @@ void FileSystemDock::_update_dependencies_after_move(const Map<String, String> &
 	}
 }
 
+void FileSystemDock::_make_dir_confirm() {
+	String dir_name = make_dir_dialog_text->get_text().strip_edges();
+
+	if (dir_name.length() == 0) {
+		EditorNode::get_singleton()->show_warning(TTR("No name provided"));
+		return;
+	} else if (dir_name.find("/") != -1 || dir_name.find("\\") != -1 || dir_name.find(":") != -1) {
+		EditorNode::get_singleton()->show_warning(TTR("Provided name contains invalid characters"));
+		return;
+	}
+
+	print_line("Making folder " + dir_name + " in " + path);
+	DirAccess *da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+	Error err = da->change_dir(path);
+	if (err == OK) {
+		err = da->make_dir(dir_name);
+	}
+	memdelete(da);
+
+	if (err == OK) {
+		print_line("call rescan!");
+		_rescan();
+	} else {
+		EditorNode::get_singleton()->show_warning(TTR("Could not create folder."));
+	}
+}
+
 void FileSystemDock::_rename_operation_confirm() {
 
 	String new_name = rename_dialog_text->get_text().strip_edges();
@@ -993,6 +1020,12 @@ void FileSystemDock::_file_option(int p_option) {
 			}
 			*/
 		} break;
+		case FILE_NEW_FOLDER: {
+			make_dir_dialog_text->set_text("new folder");
+			make_dir_dialog_text->select_all();
+			make_dir_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+			make_dir_dialog_text->grab_focus();
+		} break;
 		case FILE_COPY_PATH: {
 			int idx = files->get_current();
 			if (idx < 0 || idx >= files->get_item_count())
@@ -1052,6 +1085,12 @@ void FileSystemDock::_folder_option(int p_option) {
 				remove_dialog->show(remove_folders, remove_files);
 			}
 		} break;
+		case FOLDER_NEW_FOLDER: {
+			make_dir_dialog_text->set_text("new folder");
+			make_dir_dialog_text->select_all();
+			make_dir_dialog->popup_centered_minsize(Size2(250, 80) * EDSCALE);
+			make_dir_dialog_text->grab_focus();
+		} break;
 		case FOLDER_COPY_PATH: {
 			String path = item->get_metadata(tree->get_selected_column());
 			OS::get_singleton()->set_clipboard(path);
@@ -1110,6 +1149,7 @@ void FileSystemDock::_dir_rmb_pressed(const Vector2 &p_pos) {
 			folder_options->add_item(TTR("Delete"), FOLDER_REMOVE);
 		}
 		folder_options->add_separator();
+		folder_options->add_item(TTR("New Folder.."), FOLDER_NEW_FOLDER);
 		folder_options->add_item(TTR("Show In File Manager"), FOLDER_SHOW_IN_EXPLORER);
 	}
 	folder_options->set_position(tree->get_global_position() + p_pos);
@@ -1496,6 +1536,7 @@ void FileSystemDock::_files_list_rmb_select(int p_item, const Vector2 &p_pos) {
 		file_options->add_separator();
 	}
 
+	file_options->add_item(TTR("New Folder.."), FILE_NEW_FOLDER);
 	file_options->add_item(TTR("Show In File Manager"), FILE_SHOW_IN_EXPLORER);
 
 	file_options->set_position(files->get_global_position() + p_pos);
@@ -1582,6 +1623,7 @@ void FileSystemDock::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_dir_selected"), &FileSystemDock::_dir_selected);
 	ClassDB::bind_method(D_METHOD("_file_option"), &FileSystemDock::_file_option);
 	ClassDB::bind_method(D_METHOD("_folder_option"), &FileSystemDock::_folder_option);
+	ClassDB::bind_method(D_METHOD("_make_dir_confirm"), &FileSystemDock::_make_dir_confirm);
 	ClassDB::bind_method(D_METHOD("_move_operation_confirm"), &FileSystemDock::_move_operation_confirm);
 	ClassDB::bind_method(D_METHOD("_rename_operation_confirm"), &FileSystemDock::_rename_operation_confirm);
 
@@ -1752,6 +1794,17 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
 	rename_dialog->register_text_enter(rename_dialog_text);
 	rename_dialog->connect("confirmed", this, "_rename_operation_confirm");
 
+	make_dir_dialog = memnew(ConfirmationDialog);
+	make_dir_dialog->set_title(TTR("Create Folder"));
+	VBoxContainer *make_folder_dialog_vb = memnew(VBoxContainer);
+	make_dir_dialog->add_child(make_folder_dialog_vb);
+
+	make_dir_dialog_text = memnew(LineEdit);
+	make_folder_dialog_vb->add_margin_child(TTR("Name:"), make_dir_dialog_text);
+	add_child(make_dir_dialog);
+	make_dir_dialog->register_text_enter(make_dir_dialog_text);
+	make_dir_dialog->connect("confirmed", this, "_make_dir_confirm");
+
 	updating_tree = false;
 	initialized = false;
 

+ 5 - 0
editor/filesystem_dock.h

@@ -72,6 +72,7 @@ private:
 		FILE_REMOVE,
 		FILE_REIMPORT,
 		FILE_INFO,
+		FILE_NEW_FOLDER,
 		FILE_SHOW_IN_EXPLORER,
 		FILE_COPY_PATH
 	};
@@ -82,6 +83,7 @@ private:
 		FOLDER_MOVE,
 		FOLDER_RENAME,
 		FOLDER_REMOVE,
+		FOLDER_NEW_FOLDER,
 		FOLDER_SHOW_IN_EXPLORER,
 		FOLDER_COPY_PATH
 	};
@@ -118,6 +120,8 @@ private:
 	EditorDirDialog *move_dialog;
 	ConfirmationDialog *rename_dialog;
 	LineEdit *rename_dialog_text;
+	ConfirmationDialog *make_dir_dialog;
+	LineEdit *make_dir_dialog_text;
 
 	class FileOrFolder {
 	public:
@@ -158,6 +162,7 @@ private:
 	void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_renames) const;
 	void _update_dependencies_after_move(const Map<String, String> &p_renames) const;
 
+	void _make_dir_confirm();
 	void _rename_operation_confirm();
 	void _move_operation_confirm(const String &p_to_path);