summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgroud <gilles.roudiere@gmail.com>2018-09-13 21:49:56 +0200
committergroud <gilles.roudiere@gmail.com>2018-09-14 10:22:13 +0200
commit4731745deb479a2fc08d9da6f38161b5ad2902b8 (patch)
tree58e8ae514a0b6c3fd173a97a1a3ba1ec6e669bad
parentd7b638ed328e3fbd27fbe255278d7687a815b389 (diff)
Adds a filter in the tree view
-rw-r--r--editor/filesystem_dock.cpp145
-rw-r--r--editor/filesystem_dock.h7
2 files changed, 114 insertions, 38 deletions
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index 50ce31e266..022ddd015a 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -53,6 +53,8 @@ Ref<Texture> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_di
bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths) {
+ bool parent_should_expand = false;
+
// Create a tree item for the subdirectory
TreeItem *subdirectory_item = tree->create_item(p_parent);
String dname = p_dir->get_name();
@@ -80,16 +82,29 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
}
subdirectory_item->set_collapsed(is_collapsed);
}
+ if (searched_string.length() > 0 && dname.to_lower().find(searched_string) >= 0) {
+ parent_should_expand = true;
+ }
// Create items for all subdirectories
for (int i = 0; i < p_dir->get_subdir_count(); i++)
- _create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths);
+ parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths) || parent_should_expand);
// Create all items for the files in the subdirectory
if (display_mode_setting == DISPLAY_MODE_SETTING_TREE_ONLY) {
for (int i = 0; i < p_dir->get_file_count(); i++) {
String file_name = p_dir->get_file(i);
+ if (searched_string.length() > 0) {
+ if (file_name.to_lower().find(searched_string) < 0) {
+ // The seached string is not in the file name, we skip it
+ continue;
+ } else {
+ // We expand all parents
+ parent_should_expand = true;
+ }
+ }
+
TreeItem *file_item = tree->create_item(subdirectory_item);
file_item->set_text(0, file_name);
file_item->set_icon(0, _get_tree_item_icon(p_dir, i));
@@ -106,17 +121,27 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
}
}
- return true;
+ if (searched_string.length() > 0) {
+ if (parent_should_expand) {
+ subdirectory_item->set_collapsed(false);
+ } else {
+ subdirectory_item->get_parent()->remove_child(subdirectory_item);
+ }
+ }
+
+ return parent_should_expand;
}
void FileSystemDock::_update_tree(bool keep_collapse_state, bool p_uncollapse_root) {
// Register currently collapsed paths
Vector<String> uncollapsed_paths;
- if (keep_collapse_state) {
+ if (searched_string.length() == 0 && keep_collapse_state) {
TreeItem *root = tree->get_root();
if (root) {
- TreeItem *resTree = root->get_children()->get_next();
+ TreeItem *resTree = root->get_children();
+ if (resTree != NULL)
+ resTree = resTree->get_next();
if (resTree) {
Vector<TreeItem *> needs_check;
needs_check.push_back(resTree);
@@ -156,27 +181,37 @@ void FileSystemDock::_update_tree(bool keep_collapse_state, bool p_uncollapse_ro
Ref<Texture> folder_icon = get_icon("Folder", "EditorIcons");
- TreeItem *ti = tree->create_item(favorites);
+ String text;
+ Ref<Texture> icon;
if (fave == "res://") {
- ti->set_text(0, "/");
- ti->set_icon(0, folder_icon);
+ text = "/";
+ icon = folder_icon;
} else if (fave.ends_with("/")) {
- ti->set_text(0, fave.substr(0, fave.length() - 1).get_file());
- ti->set_icon(0, folder_icon);
+ text = fave.substr(0, fave.length() - 1).get_file();
+ icon = folder_icon;
} else {
- ti->set_text(0, fave.get_file());
+ text = fave.get_file();
int index;
EditorFileSystemDirectory *dir = EditorFileSystem::get_singleton()->find_file(fave, &index);
if (dir) {
- ti->set_icon(0, _get_tree_item_icon(dir, index));
+ icon = _get_tree_item_icon(dir, index);
} else {
- ti->set_icon(0, get_icon("File", "EditorIcons"));
+ icon = get_icon("File", "EditorIcons");
}
}
- ti->set_tooltip(0, fave);
- ti->set_selectable(0, true);
- ti->set_metadata(0, fave);
+ if (searched_string.length() == 0 || text.to_lower().find(searched_string) >= 0) {
+ TreeItem *ti = tree->create_item(favorites);
+ ti->set_text(0, text);
+ ti->set_icon(0, icon);
+ ti->set_tooltip(0, fave);
+ ti->set_selectable(0, true);
+ ti->set_metadata(0, fave);
+ }
+ }
+
+ if (searched_string.length() > 0 && favorites->get_children() == NULL) {
+ root->remove_child(favorites);
}
if (p_uncollapse_root) {
@@ -204,13 +239,19 @@ void FileSystemDock::_update_display_mode() {
case DISPLAY_MODE_TREE_ONLY:
tree->show();
tree->set_v_size_flags(SIZE_EXPAND_FILL);
- _update_tree(true);
+ if (display_mode_setting == DISPLAY_MODE_SETTING_TREE_ONLY) {
+ tree_search_box->show();
+ } else {
+ tree_search_box->hide();
+ }
+ _update_tree(true);
file_list_vb->hide();
break;
case DISPLAY_MODE_FILE_LIST_ONLY:
tree->hide();
+ tree_search_box->hide();
button_tree->show();
file_list_vb->show();
@@ -222,6 +263,7 @@ void FileSystemDock::_update_display_mode() {
tree->set_v_size_flags(SIZE_EXPAND_FILL);
button_tree->hide();
tree->ensure_cursor_is_visible();
+ tree_search_box->hide();
_update_tree(true);
file_list_vb->show();
@@ -259,8 +301,10 @@ void FileSystemDock::_notification(int p_what) {
files->connect("item_activated", this, "_file_list_activate_file");
button_hist_next->connect("pressed", this, "_fw_history");
button_hist_prev->connect("pressed", this, "_bw_history");
- search_box->set_right_icon(get_icon("Search", ei));
- search_box->set_clear_button_enabled(true);
+ tree_search_box->set_right_icon(get_icon("Search", ei));
+ tree_search_box->set_clear_button_enabled(true);
+ file_list_search_box->set_right_icon(get_icon("Search", ei));
+ file_list_search_box->set_clear_button_enabled(true);
button_hist_next->set_icon(get_icon("Forward", ei));
button_hist_prev->set_icon(get_icon("Back", ei));
@@ -314,8 +358,10 @@ void FileSystemDock::_notification(int p_what) {
button_hist_next->set_icon(get_icon("Forward", ei));
button_hist_prev->set_icon(get_icon("Back", ei));
- search_box->set_right_icon(get_icon("Search", ei));
- search_box->set_clear_button_enabled(true);
+ tree_search_box->set_right_icon(get_icon("Search", ei));
+ tree_search_box->set_clear_button_enabled(true);
+ file_list_search_box->set_right_icon(get_icon("Search", ei));
+ file_list_search_box->set_clear_button_enabled(true);
// Update file list display mode
int new_file_list_mode = int(EditorSettings::get_singleton()->get("docks/filesystem/files_display_mode"));
@@ -479,12 +525,10 @@ void FileSystemDock::_search(EditorFileSystemDirectory *p_path, List<FileInfo> *
_search(p_path->get_subdir(i), matches, p_max_items);
}
- String match = search_box->get_text().to_lower();
-
for (int i = 0; i < p_path->get_file_count(); i++) {
String file = p_path->get_file(i);
- if (file.to_lower().find(match) != -1) {
+ if (file.to_lower().find(searched_string) != -1) {
FileInfo fi;
fi.name = file;
@@ -537,7 +581,7 @@ void FileSystemDock::_update_files(bool p_keep_selection) {
Ref<Texture> file_thumbnail_broken;
bool use_thumbnails = (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS);
- bool use_folders = search_box->get_text().length() == 0 && ((display_mode == DISPLAY_MODE_FILE_LIST_ONLY || display_mode == DISPLAY_MODE_TREE_ONLY) || always_show_folders);
+ bool use_folders = searched_string.length() == 0 && ((display_mode == DISPLAY_MODE_FILE_LIST_ONLY || display_mode == DISPLAY_MODE_TREE_ONLY) || always_show_folders);
if (use_thumbnails) {
@@ -594,7 +638,7 @@ void FileSystemDock::_update_files(bool p_keep_selection) {
List<FileInfo> filelist;
- if (search_box->get_text().length() > 0) {
+ if (searched_string.length() > 0) {
_search(EditorFileSystem::get_singleton()->get_filesystem(), &filelist, 128);
filelist.sort();
@@ -722,7 +766,7 @@ void FileSystemDock::_go_to_tree() {
void FileSystemDock::_preview_invalidated(const String &p_path) {
- if (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS && p_path.get_base_dir() == path && search_box->get_text() == String() && file_list_vb->is_visible_in_tree()) {
+ if (file_list_display_mode == FILE_LIST_DISPLAY_THUMBNAILS && p_path.get_base_dir() == path && searched_string.length() == 0 && file_list_vb->is_visible_in_tree()) {
for (int i = 0; i < files->get_item_count(); i++) {
@@ -1519,10 +1563,26 @@ void FileSystemDock::_resource_created() const {
editor->save_resource_as(current_res, fpath);
}
-void FileSystemDock::_search_changed(const String &p_text) {
+void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) {
+ searched_string = p_text.to_lower();
- if (file_list_vb->is_visible())
- _update_files(false);
+ if (p_from == tree_search_box)
+ file_list_search_box->set_text(searched_string);
+ else // file_list_search_box
+ tree_search_box->set_text(searched_string);
+
+ switch (display_mode) {
+ case DISPLAY_MODE_FILE_LIST_ONLY: {
+ _update_files(false);
+ } break;
+ case DISPLAY_MODE_TREE_ONLY: {
+ _update_tree(false);
+ } break;
+ case DISPLAY_MODE_SPLIT: {
+ _update_files(false);
+ _update_tree(false);
+ } break;
+ }
}
void FileSystemDock::_rescan() {
@@ -1543,7 +1603,7 @@ void FileSystemDock::focus_on_filter() {
file_list_vb->show();
}
- search_box->grab_focus();
+ file_list_search_box->grab_focus();
}
void FileSystemDock::set_file_list_display_mode(int p_mode) {
@@ -2105,9 +2165,12 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
ED_SHORTCUT("filesystem_dock/delete", TTR("Delete"), KEY_DELETE);
ED_SHORTCUT("filesystem_dock/rename", TTR("Rename"));
+ VBoxContainer *top_vbc = memnew(VBoxContainer);
+ add_child(top_vbc);
+
HBoxContainer *toolbar_hbc = memnew(HBoxContainer);
toolbar_hbc->add_constant_override("separation", 0);
- add_child(toolbar_hbc);
+ top_vbc->add_child(toolbar_hbc);
button_hist_prev = memnew(ToolButton);
button_hist_prev->set_disabled(true);
@@ -2133,6 +2196,16 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
button_reload->hide();
toolbar_hbc->add_child(button_reload);
+ HBoxContainer *toolbar2_hbc = memnew(HBoxContainer);
+ toolbar2_hbc->add_constant_override("separation", 0);
+ top_vbc->add_child(toolbar2_hbc);
+
+ tree_search_box = memnew(LineEdit);
+ tree_search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ tree_search_box->set_placeholder(TTR("Search files"));
+ tree_search_box->connect("text_changed", this, "_search_changed", varray(tree_search_box));
+ toolbar2_hbc->add_child(tree_search_box);
+
//toolbar_hbc->add_spacer();
//Control *spacer = memnew( Control);
@@ -2195,11 +2268,11 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
button_tree->hide();
path_hb->add_child(button_tree);
- search_box = memnew(LineEdit);
- search_box->set_h_size_flags(SIZE_EXPAND_FILL);
- search_box->set_placeholder(TTR("Search files"));
- search_box->connect("text_changed", this, "_search_changed");
- path_hb->add_child(search_box);
+ file_list_search_box = memnew(LineEdit);
+ file_list_search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ file_list_search_box->set_placeholder(TTR("Search files"));
+ file_list_search_box->connect("text_changed", this, "_search_changed", varray(file_list_search_box));
+ path_hb->add_child(file_list_search_box);
button_file_list_display_mode = memnew(ToolButton);
button_file_list_display_mode->set_toggle_mode(true);
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index cefdea1628..3c26e192aa 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -113,7 +113,10 @@ private:
Button *button_hist_next;
Button *button_hist_prev;
LineEdit *current_path;
- LineEdit *search_box;
+ LineEdit *tree_search_box;
+ LineEdit *file_list_search_box;
+ String searched_string;
+
TextureRect *search_icon;
HBoxContainer *path_hb;
@@ -226,7 +229,7 @@ private:
void _set_scanning_mode();
void _rescan();
- void _search_changed(const String &p_text);
+ void _search_changed(const String &p_text, const Control *p_from);
void _file_and_folders_fill_popup(PopupMenu *p_popup, Vector<String> p_paths);
void _tree_rmb_select(const Vector2 &p_pos);