Browse Source

Add autocomplete support for change_scene()

Tomasz Chabora 6 years ago
parent
commit
892318f5c7
2 changed files with 34 additions and 0 deletions
  1. 33 0
      scene/main/scene_tree.cpp
  2. 1 0
      scene/main/scene_tree.h

+ 33 - 0
scene/main/scene_tree.cpp

@@ -33,6 +33,7 @@
 #include "core/io/marshalls.h"
 #include "core/io/marshalls.h"
 #include "core/io/resource_loader.h"
 #include "core/io/resource_loader.h"
 #include "core/message_queue.h"
 #include "core/message_queue.h"
+#include "core/os/dir_access.h"
 #include "core/os/keyboard.h"
 #include "core/os/keyboard.h"
 #include "core/os/os.h"
 #include "core/os/os.h"
 #include "core/print_string.h"
 #include "core/print_string.h"
@@ -1953,6 +1954,38 @@ bool SceneTree::is_using_font_oversampling() const {
 	return use_font_oversampling;
 	return use_font_oversampling;
 }
 }
 
 
+void SceneTree::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const {
+
+	if (p_function == "change_scene") {
+		DirAccessRef dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+		List<String> directories;
+		directories.push_back(dir_access->get_current_dir());
+
+		while (!directories.empty()) {
+			dir_access->change_dir(directories.back()->get());
+			directories.pop_back();
+
+			dir_access->list_dir_begin();
+			String filename = dir_access->get_next();
+
+			while (filename != "") {
+				if (filename == "." || filename == "..") {
+					filename = dir_access->get_next();
+					continue;
+				}
+
+				if (dir_access->dir_exists(filename)) {
+					directories.push_back(dir_access->get_current_dir().plus_file(filename));
+				} else if (filename.ends_with(".tscn") || filename.ends_with(".scn")) {
+					r_options->push_back("\"" + dir_access->get_current_dir().plus_file(filename) + "\"");
+				}
+
+				filename = dir_access->get_next();
+			}
+		}
+	}
+}
+
 SceneTree::SceneTree() {
 SceneTree::SceneTree() {
 
 
 	if (singleton == NULL) singleton = this;
 	if (singleton == NULL) singleton = this;

+ 1 - 0
scene/main/scene_tree.h

@@ -408,6 +408,7 @@ public:
 
 
 	void drop_files(const Vector<String> &p_files, int p_from_screen = 0);
 	void drop_files(const Vector<String> &p_files, int p_from_screen = 0);
 	void global_menu_action(const Variant &p_id, const Variant &p_meta);
 	void global_menu_action(const Variant &p_id, const Variant &p_meta);
+	void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const;
 
 
 	//network API
 	//network API