diff --git a/tools/editor/quick_open.cpp b/tools/editor/quick_open.cpp index adb08b65d68..e18dc584d5e 100644 --- a/tools/editor/quick_open.cpp +++ b/tools/editor/quick_open.cpp @@ -109,6 +109,17 @@ void EditorQuickOpen::_sbox_input(const InputEvent& p_ie) { } +float EditorQuickOpen::_path_cmp(String search, String path) const { + + if (search == path) { + return 1.2f; + } + if (path.findn(search) != -1) { + return 1.1f; + } + return path.to_lower().similarity(search.to_lower()); +} + void EditorQuickOpen::_parse_fs(EditorFileSystemDirectory *efsd, Vector< Pair< String, Ref > > &list) { if (!add_directories) { @@ -130,17 +141,18 @@ void EditorQuickOpen::_parse_fs(EditorFileSystemDirectory *efsd, Vector< Pair< S Pair< String, Ref > pair; pair.first = path; pair.second = get_icon("folder", "FileDialog"); - if (list.size() > 0) { - float this_sim = search_text.to_lower().similarity(path.to_lower()); - float other_sim = search_text.to_lower().similarity(list[0].first.to_lower()); + if (search_text != String() && list.size() > 0) { + + float this_sim = _path_cmp(search_text, path); + float other_sim = _path_cmp(list[0].first, path); int pos = 1; - while (pos < list.size() && this_sim < other_sim) { - other_sim = search_text.to_lower().similarity(list[pos++].first.to_lower()); + while (pos < list.size() && this_sim <= other_sim) { + other_sim = _path_cmp(list[pos++].first, path); } - pos = this_sim > other_sim ? pos - 1 : pos; + pos = this_sim >= other_sim ? pos - 1 : pos; list.insert(pos, pair); } else { @@ -159,17 +171,17 @@ void EditorQuickOpen::_parse_fs(EditorFileSystemDirectory *efsd, Vector< Pair< S pair.first = file; pair.second = get_icon((has_icon(efsd->get_file_type(i), ei) ? efsd->get_file_type(i) : ot), ei); - if (list.size() > 0) { + if (search_text != String() && list.size() > 0) { - float this_sim = search_text.to_lower().similarity(file.to_lower()); - float other_sim = search_text.to_lower().similarity(list[0].first.to_lower()); + float this_sim = _path_cmp(search_text, file); + float other_sim = _path_cmp(list[0].first, file); int pos = 1; - while (pos < list.size() && this_sim < other_sim) { - other_sim = search_text.to_lower().similarity(list[pos++].first.to_lower()); + while (pos < list.size() && this_sim <= other_sim) { + other_sim = _path_cmp(list[pos++].first, file); } - pos = this_sim > other_sim ? pos - 1 : pos; + pos = this_sim >= other_sim ? pos - 1 : pos; list.insert(pos, pair); } else { @@ -198,8 +210,6 @@ void EditorQuickOpen::_update_search() { _parse_fs(efsd, list); - //String best_match = list[0]; - for (int i = 0; i < list.size(); i++) { TreeItem *ti = search_options->create_item(root); ti->set_text(0, list[i].first); diff --git a/tools/editor/quick_open.h b/tools/editor/quick_open.h index 45527090b76..c253f7606ea 100644 --- a/tools/editor/quick_open.h +++ b/tools/editor/quick_open.h @@ -49,6 +49,7 @@ class EditorQuickOpen : public ConfirmationDialog { void _sbox_input(const InputEvent& p_ie); void _parse_fs(EditorFileSystemDirectory *efsd, Vector< Pair< String,Ref > > &list); + float _path_cmp(String search, String path) const; void _confirmed();