diff options
author | Zi Ye <major.mcdoom@gmail.com> | 2024-02-22 02:22:16 -0600 |
---|---|---|
committer | Zi Ye <major.mcdoom@gmail.com> | 2024-04-17 21:12:55 -0500 |
commit | fbfda46ffa485777bc83fcfcf63c5f4268396439 (patch) | |
tree | 3378f0bdee39e7f6a92dfd68d30e7b51ec6248c0 /editor/filesystem_dock.cpp | |
parent | 3b1806182a3564736ad64793b203c2c13c251f56 (diff) | |
download | redot-engine-fbfda46ffa485777bc83fcfcf63c5f4268396439.tar.gz |
Added tokenized search support to Quick Open dialog and FileSystem filter.
Diffstat (limited to 'editor/filesystem_dock.cpp')
-rw-r--r-- | editor/filesystem_dock.cpp | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 2ed547a970..026df27819 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -267,7 +267,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory } else { subdirectory_item->set_collapsed(uncollapsed_paths.find(lpath) < 0); } - if (searched_string.length() > 0 && dname.to_lower().find(searched_string) >= 0) { + if (!searched_tokens.is_empty() && _matches_all_search_tokens(dname)) { parent_should_expand = true; } @@ -293,8 +293,8 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory } String file_name = p_dir->get_file(i); - if (searched_string.length() > 0) { - if (file_name.to_lower().find(searched_string) < 0) { + if (!searched_tokens.is_empty()) { + if (!_matches_all_search_tokens(file_name)) { // The searched string is not in the file name, we skip it. continue; } else { @@ -352,7 +352,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory } } - if (searched_string.length() > 0) { + if (!searched_tokens.is_empty()) { if (parent_should_expand) { subdirectory_item->set_collapsed(false); } else if (dname != "res://") { @@ -460,7 +460,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo color = Color(1, 1, 1); } - if (searched_string.length() == 0 || text.to_lower().find(searched_string) >= 0) { + if (searched_tokens.is_empty() || _matches_all_search_tokens(text)) { TreeItem *ti = tree->create_item(favorites_item); ti->set_text(0, text); ti->set_icon(0, icon); @@ -857,7 +857,7 @@ void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> * for (int i = 0; i < p_path->get_file_count(); i++) { String file = p_path->get_file(i); - if (file.to_lower().contains(searched_string)) { + if (_matches_all_search_tokens(file)) { FileInfo fi; fi.name = file; fi.type = p_path->get_file_type(i); @@ -984,14 +984,14 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { if (favorite == "res://") { text = "/"; icon = folder_icon; - if (searched_string.length() == 0 || text.to_lower().find(searched_string) >= 0) { + if (searched_tokens.is_empty() || _matches_all_search_tokens(text)) { files->add_item(text, icon, true); files->set_item_metadata(-1, favorite); } } else if (favorite.ends_with("/")) { text = favorite.substr(0, favorite.length() - 1).get_file(); icon = folder_icon; - if (searched_string.length() == 0 || text.to_lower().find(searched_string) >= 0) { + if (searched_tokens.is_empty() || _matches_all_search_tokens(text)) { files->add_item(text, icon, true); files->set_item_metadata(-1, favorite); } @@ -1013,7 +1013,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { fi.modified_time = 0; } - if (searched_string.length() == 0 || fi.name.to_lower().find(searched_string) >= 0) { + if (searched_tokens.is_empty() || _matches_all_search_tokens(fi.name)) { file_list.push_back(fi); } } @@ -1036,7 +1036,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { return; } - if (searched_string.length() > 0) { + if (!searched_tokens.is_empty()) { // Display the search results. // Limit the number of results displayed to avoid an infinite loop. _search(EditorFileSystem::get_singleton()->get_filesystem(), &file_list, 10000); @@ -1272,7 +1272,7 @@ void FileSystemDock::_file_list_activate_file(int p_idx) { } void FileSystemDock::_preview_invalidated(const String &p_path) { - if (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS && p_path.get_base_dir() == current_path && searched_string.length() == 0 && file_list_vb->is_visible_in_tree()) { + if (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS && p_path.get_base_dir() == current_path && searched_tokens.is_empty() && file_list_vb->is_visible_in_tree()) { for (int i = 0; i < files->get_item_count(); i++) { if (files->get_item_metadata(i) == p_path) { // Re-request preview. @@ -2603,12 +2603,13 @@ void FileSystemDock::_resource_created() { } void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) { - if (searched_string.length() == 0) { + if (searched_tokens.is_empty()) { // Register the uncollapsed paths before they change. uncollapsed_paths_before_search = get_uncollapsed_paths(); } - searched_string = p_text.to_lower(); + const String searched_string = p_text.to_lower(); + searched_tokens = searched_string.split(" ", false); if (p_from == tree_search_box) { file_list_search_box->set_text(searched_string); @@ -2619,16 +2620,29 @@ void FileSystemDock::_search_changed(const String &p_text, const Control *p_from bool unfold_path = (p_text.is_empty() && !current_path.is_empty()); switch (display_mode) { case DISPLAY_MODE_TREE_ONLY: { - _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path); + _update_tree(searched_tokens.is_empty() ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path); } break; case DISPLAY_MODE_HSPLIT: case DISPLAY_MODE_VSPLIT: { _update_file_list(false); - _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path); + _update_tree(searched_tokens.is_empty() ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path); } break; } } +bool FileSystemDock::_matches_all_search_tokens(const String &p_text) { + if (searched_tokens.is_empty()) { + return false; + } + const String s = p_text.to_lower(); + for (const String &t : searched_tokens) { + if (!s.contains(t)) { + return false; + } + } + return true; +} + void FileSystemDock::_rescan() { _set_scanning_mode(); EditorFileSystem::get_singleton()->scan(); @@ -3354,7 +3368,7 @@ void FileSystemDock::_file_list_item_clicked(int p_item, const Vector2 &p_pos, M // Popup. if (!paths.is_empty()) { file_list_popup->clear(); - _file_and_folders_fill_popup(file_list_popup, paths, searched_string.length() == 0); + _file_and_folders_fill_popup(file_list_popup, paths, searched_tokens.is_empty()); file_list_popup->set_position(files->get_screen_position() + p_pos); file_list_popup->reset_size(); file_list_popup->popup(); @@ -3367,7 +3381,7 @@ void FileSystemDock::_file_list_empty_clicked(const Vector2 &p_pos, MouseButton } // Right click on empty space for file list. - if (searched_string.length() > 0) { + if (!searched_tokens.is_empty()) { return; } @@ -4113,7 +4127,6 @@ FileSystemDock::FileSystemDock() { new_resource_dialog->set_base_type("Resource"); new_resource_dialog->connect("create", callable_mp(this, &FileSystemDock::_resource_created)); - searched_string = String(); uncollapsed_paths_before_search = Vector<String>(); tree_update_id = 0; |