Skip to content

Commit 8c0511a

Browse files
committed
Merge pull request godotengine#87197 from Mickeon/autocompletion-SceneTree-change-packed-to-file
Optimize SceneTree's `change_scene_to_file` autocompletion
2 parents 072da09 + 7b3e1a5 commit 8c0511a

File tree

2 files changed

+26
-41
lines changed

2 files changed

+26
-41
lines changed

modules/gdscript/gdscript_editor.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -828,17 +828,21 @@ static String _make_arguments_hint(const GDScriptParser::FunctionNode *p_functio
828828
return arghint;
829829
}
830830

831-
static void _get_directory_contents(EditorFileSystemDirectory *p_dir, HashMap<String, ScriptLanguage::CodeCompletionOption> &r_list) {
831+
static void _get_directory_contents(EditorFileSystemDirectory *p_dir, HashMap<String, ScriptLanguage::CodeCompletionOption> &r_list, const StringName &p_required_type = StringName()) {
832832
const String quote_style = EDITOR_GET("text_editor/completion/use_single_quotes") ? "'" : "\"";
833+
const bool requires_type = p_required_type;
833834

834835
for (int i = 0; i < p_dir->get_file_count(); i++) {
836+
if (requires_type && !ClassDB::is_parent_class(p_dir->get_file_type(i), p_required_type)) {
837+
continue;
838+
}
835839
ScriptLanguage::CodeCompletionOption option(p_dir->get_file_path(i), ScriptLanguage::CODE_COMPLETION_KIND_FILE_PATH);
836840
option.insert_text = option.display.quote(quote_style);
837841
r_list.insert(option.display, option);
838842
}
839843

840844
for (int i = 0; i < p_dir->get_subdir_count(); i++) {
841-
_get_directory_contents(p_dir->get_subdir(i), r_list);
845+
_get_directory_contents(p_dir->get_subdir(i), r_list, p_required_type);
842846
}
843847
}
844848

@@ -2803,6 +2807,16 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
28032807
r_result.insert(option.display, option);
28042808
}
28052809
}
2810+
if (EDITOR_GET("text_editor/completion/complete_file_paths")) {
2811+
if (p_argidx == 0 && p_method == SNAME("change_scene_to_file") && ClassDB::is_parent_class(class_name, SNAME("SceneTree"))) {
2812+
HashMap<String, ScriptLanguage::CodeCompletionOption> list;
2813+
_get_directory_contents(EditorFileSystem::get_singleton()->get_filesystem(), list, SNAME("PackedScene"));
2814+
for (const KeyValue<String, ScriptLanguage::CodeCompletionOption> &key_value_pair : list) {
2815+
ScriptLanguage::CodeCompletionOption option = key_value_pair.value;
2816+
r_result.insert(option.display, option);
2817+
}
2818+
}
2819+
}
28062820

28072821
base_type.kind = GDScriptParser::DataType::UNRESOLVED;
28082822
} break;

scene/main/scene_tree.cpp

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,45 +1693,16 @@ void SceneTree::add_idle_callback(IdleCallback p_callback) {
16931693
#ifdef TOOLS_ENABLED
16941694
void SceneTree::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const {
16951695
const String pf = p_function;
1696-
if (pf == "change_scene_to_file") {
1697-
Ref<DirAccess> dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES);
1698-
List<String> directories;
1699-
directories.push_back(dir_access->get_current_dir());
1700-
1701-
while (!directories.is_empty()) {
1702-
dir_access->change_dir(directories.back()->get());
1703-
directories.pop_back();
1704-
1705-
dir_access->list_dir_begin();
1706-
String filename = dir_access->get_next();
1707-
1708-
while (!filename.is_empty()) {
1709-
if (filename == "." || filename == "..") {
1710-
filename = dir_access->get_next();
1711-
continue;
1712-
}
1713-
1714-
if (dir_access->dir_exists(filename)) {
1715-
directories.push_back(dir_access->get_current_dir().path_join(filename));
1716-
} else if (filename.ends_with(".tscn") || filename.ends_with(".scn")) {
1717-
r_options->push_back("\"" + dir_access->get_current_dir().path_join(filename) + "\"");
1718-
}
1719-
1720-
filename = dir_access->get_next();
1721-
}
1722-
}
1723-
} else {
1724-
bool add_options = false;
1725-
if (p_idx == 0) {
1726-
add_options = pf == "get_nodes_in_group" || pf == "has_group" || pf == "get_first_node_in_group" || pf == "set_group" || pf == "notify_group" || pf == "call_group" || pf == "add_to_group";
1727-
} else if (p_idx == 1) {
1728-
add_options = pf == "set_group_flags" || pf == "call_group_flags" || pf == "notify_group_flags";
1729-
}
1730-
if (add_options) {
1731-
HashMap<StringName, String> global_groups = ProjectSettings::get_singleton()->get_global_groups_list();
1732-
for (const KeyValue<StringName, String> &E : global_groups) {
1733-
r_options->push_back(E.key.operator String().quote());
1734-
}
1696+
bool add_options = false;
1697+
if (p_idx == 0) {
1698+
add_options = pf == "get_nodes_in_group" || pf == "has_group" || pf == "get_first_node_in_group" || pf == "set_group" || pf == "notify_group" || pf == "call_group" || pf == "add_to_group";
1699+
} else if (p_idx == 1) {
1700+
add_options = pf == "set_group_flags" || pf == "call_group_flags" || pf == "notify_group_flags";
1701+
}
1702+
if (add_options) {
1703+
HashMap<StringName, String> global_groups = ProjectSettings::get_singleton()->get_global_groups_list();
1704+
for (const KeyValue<StringName, String> &E : global_groups) {
1705+
r_options->push_back(E.key.operator String().quote());
17351706
}
17361707
}
17371708
MainLoop::get_argument_options(p_function, p_idx, r_options);

0 commit comments

Comments
 (0)