浏览代码

Added autocomplete for file paths in the script editor

mbalint12 8 年之前
父节点
当前提交
71978685f9
共有 4 个文件被更改,包括 33 次插入0 次删除
  1. 1 0
      editor/editor_settings.cpp
  2. 24 0
      modules/gdscript/gd_editor.cpp
  3. 7 0
      modules/gdscript/gd_parser.cpp
  4. 1 0
      modules/gdscript/gd_parser.h

+ 1 - 0
editor/editor_settings.cpp

@@ -554,6 +554,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 	hints["text_editor/theme/font"] = PropertyInfo(Variant::STRING, "text_editor/theme/font", PROPERTY_HINT_GLOBAL_FILE, "*.fnt");
 	set("text_editor/completion/auto_brace_complete", false);
 	set("text_editor/files/restore_scripts_on_load", true);
+	set("text_editor/completion/complete_file_paths", true);
 
 	//set("docks/scene_tree/display_old_action_buttons",false);
 	set("docks/scene_tree/start_create_dialog_fully_expanded", false);

+ 24 - 0
modules/gdscript/gd_editor.cpp

@@ -31,6 +31,10 @@
 #include "gd_script.h"
 #include "global_config.h"
 #include "os/file_access.h"
+#ifdef TOOLS_ENABLED
+#include "editor/editor_file_system.h"
+#include "editor/editor_settings.h"
+#endif
 
 void GDScriptLanguage::get_comment_delimiters(List<String> *p_delimiters) const {
 
@@ -1405,6 +1409,17 @@ static void _make_function_hint(const GDParser::FunctionNode *p_func, int p_argi
 	arghint += ")";
 }
 
+void get_directory_contents(EditorFileSystemDirectory *p_dir, Set<String> &r_list) {
+
+	for (int i = 0; i < p_dir->get_subdir_count(); i++) {
+		get_directory_contents(p_dir->get_subdir(i), r_list);
+	}
+
+	for (int i = 0; i < p_dir->get_file_count(); i++) {
+		r_list.insert("\"" + p_dir->get_file_path(i) + "\"");
+	}
+}
+
 static void _find_type_arguments(GDCompletionContext &context, const GDParser::Node *p_node, int p_line, const StringName &p_method, const GDCompletionIdentifier &id, int p_argidx, Set<String> &result, String &arghint) {
 
 	//print_line("find type arguments?");
@@ -1753,6 +1768,10 @@ static void _find_call_arguments(GDCompletionContext &context, const GDParser::N
 		const GDParser::BuiltInFunctionNode *fn = static_cast<const GDParser::BuiltInFunctionNode *>(op->arguments[0]);
 		MethodInfo mi = GDFunctions::get_info(fn->function);
 
+		if (mi.name == "load" && bool(EditorSettings::get_singleton()->get("text_editor/completion/complete_file_paths"))) {
+			get_directory_contents(EditorFileSystem::get_singleton()->get_filesystem(), result);
+		}
+
 		arghint = _get_visual_datatype(mi.return_val, false) + " " + GDFunctions::get_func_name(fn->function) + String("(");
 		for (int i = 0; i < mi.arguments.size(); i++) {
 			if (i > 0)
@@ -2374,6 +2393,11 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_base
 			}
 
 		} break;
+		case GDParser::COMPLETION_PRELOAD: {
+
+			if (EditorSettings::get_singleton()->get("text_editor/completion/complete_file_paths"))
+				get_directory_contents(EditorFileSystem::get_singleton()->get_filesystem(), options);
+		} break;
 	}
 
 	for (Set<String>::Element *E = options.front(); E; E = E->next()) {

+ 7 - 0
modules/gdscript/gd_parser.cpp

@@ -387,6 +387,13 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool
 				_set_error("Expected '(' after 'preload'");
 				return NULL;
 			}
+			completion_cursor = StringName();
+			completion_type = COMPLETION_PRELOAD;
+			completion_class = current_class;
+			completion_function = current_function;
+			completion_line = tokenizer->get_token_line();
+			completion_block = current_block;
+			completion_found = true;
 			tokenizer->advance();
 
 			String path;

+ 1 - 0
modules/gdscript/gd_parser.h

@@ -437,6 +437,7 @@ public:
 		COMPLETION_PARENT_FUNCTION,
 		COMPLETION_METHOD,
 		COMPLETION_CALL_ARGUMENTS,
+		COMPLETION_PRELOAD,
 		COMPLETION_INDEX,
 		COMPLETION_VIRTUAL_FUNC,
 		COMPLETION_YIELD,