Avoid recursion in filesystem scanning, closes #3838

This commit is contained in:
Juan Linietsky 2016-06-28 08:26:07 -03:00
parent e4eb025bfe
commit 41a26528e4
1 changed files with 27 additions and 18 deletions

View File

@ -621,31 +621,40 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir,DirAccess
int total = dirs.size()+files.size(); int total = dirs.size()+files.size();
int idx=0; int idx=0;
for (List<String>::Element *E=dirs.front();E;E=E->next(),idx++) { for (List<String>::Element *E=dirs.front();E;E=E->next(),idx++) {
if (da->change_dir(E->get())==OK) { if (da->change_dir(E->get())==OK) {
EditorFileSystemDirectory *efd = memnew( EditorFileSystemDirectory ); String d = da->get_current_dir();
efd->parent=p_dir; if (d==cd || !d.begins_with(cd)) {
efd->name=E->get(); da->change_dir(cd); //avoid recursion
_scan_new_dir(efd,da,p_progress.get_sub(idx,total));
int idx=0;
for(int i=0;i<p_dir->subdirs.size();i++) {
if (efd->name<p_dir->subdirs[i]->name)
break;
idx++;
}
if (idx==p_dir->subdirs.size()) {
p_dir->subdirs.push_back(efd);
} else { } else {
p_dir->subdirs.insert(idx,efd);
}
da->change_dir("..");
EditorFileSystemDirectory *efd = memnew( EditorFileSystemDirectory );
efd->parent=p_dir;
efd->name=E->get();
_scan_new_dir(efd,da,p_progress.get_sub(idx,total));
int idx=0;
for(int i=0;i<p_dir->subdirs.size();i++) {
if (efd->name<p_dir->subdirs[i]->name)
break;
idx++;
}
if (idx==p_dir->subdirs.size()) {
p_dir->subdirs.push_back(efd);
} else {
p_dir->subdirs.insert(idx,efd);
}
da->change_dir("..");
}
} else { } else {
ERR_PRINTS(TTR("Cannot go into subdir:")+" "+E->get()); ERR_PRINTS(TTR("Cannot go into subdir:")+" "+E->get());
} }