Unfold directories when showing in file system

This commit is contained in:
Tomasz Chabora 2019-11-21 15:40:11 +01:00
parent 083d088de3
commit 01d77842ee
2 changed files with 16 additions and 11 deletions

View file

@ -52,7 +52,7 @@ Ref<Texture> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_di
return file_icon; return file_icon;
} }
bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites) { bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path) {
bool parent_should_expand = false; bool parent_should_expand = false;
// Create a tree item for the subdirectory. // Create a tree item for the subdirectory.
@ -71,14 +71,18 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
subdirectory_item->select(0); subdirectory_item->select(0);
} }
subdirectory_item->set_collapsed(uncollapsed_paths.find(lpath) < 0); if (p_unfold_path && path.begins_with(lpath) && path != lpath) {
subdirectory_item->set_collapsed(false);
} else {
subdirectory_item->set_collapsed(uncollapsed_paths.find(lpath) < 0);
}
if (searched_string.length() > 0 && dname.to_lower().find(searched_string) >= 0) { if (searched_string.length() > 0 && dname.to_lower().find(searched_string) >= 0) {
parent_should_expand = true; parent_should_expand = true;
} }
// Create items for all subdirectories. // Create items for all subdirectories.
for (int i = 0; i < p_dir->get_subdir_count(); i++) for (int i = 0; i < p_dir->get_subdir_count(); i++)
parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths, p_select_in_favorites) || parent_should_expand); parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths, p_select_in_favorites, p_unfold_path) || parent_should_expand);
// Create all items for the files in the subdirectory. // Create all items for the files in the subdirectory.
if (display_mode == DISPLAY_MODE_TREE_ONLY) { if (display_mode == DISPLAY_MODE_TREE_ONLY) {
@ -164,7 +168,7 @@ Vector<String> FileSystemDock::_compute_uncollapsed_paths() {
return uncollapsed_paths; return uncollapsed_paths;
} }
void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites) { void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites, bool p_unfold_path) {
// Recreate the tree. // Recreate the tree.
tree->clear(); tree->clear();
tree_update_id++; tree_update_id++;
@ -237,7 +241,7 @@ void FileSystemDock::_update_tree(const Vector<String> &p_uncollapsed_paths, boo
} }
// Create the remaining of the tree. // Create the remaining of the tree.
_create_tree(root, EditorFileSystem::get_singleton()->get_filesystem(), uncollapsed_paths, p_select_in_favorites); _create_tree(root, EditorFileSystem::get_singleton()->get_filesystem(), uncollapsed_paths, p_select_in_favorites, p_unfold_path);
tree->ensure_cursor_is_visible(); tree->ensure_cursor_is_visible();
updating_tree = false; updating_tree = false;
} }
@ -459,7 +463,7 @@ void FileSystemDock::_navigate_to_path(const String &p_path, bool p_select_in_fa
_set_current_path_text(path); _set_current_path_text(path);
_push_to_history(); _push_to_history();
_update_tree(_compute_uncollapsed_paths(), false, p_select_in_favorites); _update_tree(_compute_uncollapsed_paths(), false, p_select_in_favorites, true);
if (display_mode == DISPLAY_MODE_SPLIT) { if (display_mode == DISPLAY_MODE_SPLIT) {
_update_file_list(false); _update_file_list(false);
files->get_v_scroll()->set_value(0); files->get_v_scroll()->set_value(0);
@ -1780,7 +1784,7 @@ void FileSystemDock::_resource_created() const {
} }
void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) { void FileSystemDock::_search_changed(const String &p_text, const Control *p_from) {
if (searched_string.length() == 0 && p_text.length() > 0) { if (searched_string.length() == 0) {
// Register the uncollapsed paths before they change. // Register the uncollapsed paths before they change.
uncollapsed_paths_before_search = _compute_uncollapsed_paths(); uncollapsed_paths_before_search = _compute_uncollapsed_paths();
} }
@ -1792,13 +1796,14 @@ void FileSystemDock::_search_changed(const String &p_text, const Control *p_from
else // File_list_search_box. else // File_list_search_box.
tree_search_box->set_text(searched_string); tree_search_box->set_text(searched_string);
bool unfold_path = (p_text == String() && path != String());
switch (display_mode) { switch (display_mode) {
case DISPLAY_MODE_TREE_ONLY: { case DISPLAY_MODE_TREE_ONLY: {
_update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>()); _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path);
} break; } break;
case DISPLAY_MODE_SPLIT: { case DISPLAY_MODE_SPLIT: {
_update_file_list(false); _update_file_list(false);
_update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>()); _update_tree(searched_string.length() == 0 ? uncollapsed_paths_before_search : Vector<String>(), false, false, unfold_path);
} break; } break;
} }
} }

View file

@ -177,9 +177,9 @@ private:
bool import_dock_needs_update; bool import_dock_needs_update;
Ref<Texture> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx); Ref<Texture> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx);
bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites); bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites, bool p_unfold_path = false);
Vector<String> _compute_uncollapsed_paths(); Vector<String> _compute_uncollapsed_paths();
void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false); void _update_tree(const Vector<String> &p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false, bool p_unfold_path = false);
void _navigate_to_path(const String &p_path, bool p_select_in_favorites = false); void _navigate_to_path(const String &p_path, bool p_select_in_favorites = false);
void _file_list_gui_input(Ref<InputEvent> p_event); void _file_list_gui_input(Ref<InputEvent> p_event);