Browse Source

Improved speed of directory view when opening folder containing a large number of files or directories

merge-requests/399/head
eidheim 6 years ago
parent
commit
987fa174f0
  1. 54
      src/directories.cc

54
src/directories.cc

@ -687,32 +687,37 @@ void Directories::add_or_update_path(const boost::filesystem::path &dir_path, co
} }
Gtk::TreeNodeChildren children(row ? row.children() : tree_store->children()); Gtk::TreeNodeChildren children(row ? row.children() : tree_store->children());
if(children) { if(!children.empty()) {
if(children.begin()->get_value(column_record.path) == "") if(children.begin()->get_value(column_record.path) == "")
tree_store->erase(children.begin()); tree_store->erase(children.begin());
} }
std::unordered_set<std::string> not_deleted;
std::unordered_map<std::string, boost::filesystem::path> filenames;
boost::filesystem::directory_iterator end_it; boost::filesystem::directory_iterator end_it;
for(boost::filesystem::directory_iterator it(dir_path); it != end_it; it++) { for(boost::filesystem::directory_iterator it(dir_path); it != end_it; it++) {
auto filename = it->path().filename().string(); auto path = it->path();
bool already_added = false; filenames.emplace(path.filename().string(), path);
if(children) { }
for(auto &child : children) {
if(child->get_value(column_record.name) == filename) { std::unordered_set<std::string> already_added;
not_deleted.emplace(filename); for(auto it = children.begin(); it != children.end();) {
already_added = true; auto filename = it->get_value(column_record.name);
break; if(filenames.find(filename) != filenames.end()) {
} already_added.emplace(filename);
} ++it;
} }
if(!already_added) { else
it = tree_store->erase(it);
}
for(auto &filename : filenames) {
if(already_added.find(filename.first) == already_added.end()) {
auto child = tree_store->append(children); auto child = tree_store->append(children);
not_deleted.emplace(filename); auto is_directory = boost::filesystem::is_directory(filename.second);
auto is_directory = boost::filesystem::is_directory(it->path());
child->set_value(column_record.is_directory, is_directory); child->set_value(column_record.is_directory, is_directory);
child->set_value(column_record.name, filename); child->set_value(column_record.name, filename.first);
child->set_value(column_record.markup, Glib::Markup::escape_text(filename)); child->set_value(column_record.markup, Glib::Markup::escape_text(filename.first));
child->set_value(column_record.path, it->path()); child->set_value(column_record.path, filename.second);
if(is_directory) { if(is_directory) {
auto grandchild = tree_store->append(child->children()); auto grandchild = tree_store->append(child->children());
grandchild->set_value(column_record.is_directory, false); grandchild->set_value(column_record.is_directory, false);
@ -721,22 +726,13 @@ void Directories::add_or_update_path(const boost::filesystem::path &dir_path, co
grandchild->set_value(column_record.type, PathType::unknown); grandchild->set_value(column_record.type, PathType::unknown);
} }
else { else {
auto language = Source::guess_language(it->path().filename()); auto language = Source::guess_language(filename.first);
if(!language) if(!language)
child->set_value(column_record.type, PathType::unknown); child->set_value(column_record.type, PathType::unknown);
} }
} }
} }
if(children) { if(children.empty()) {
for(auto it = children.begin(); it != children.end();) {
if(not_deleted.count(it->get_value(column_record.name)) == 0) {
it = tree_store->erase(it);
}
else
it++;
}
}
if(!children) {
auto child = tree_store->append(children); auto child = tree_store->append(children);
child->set_value(column_record.is_directory, false); child->set_value(column_record.is_directory, false);
child->set_value(column_record.name, std::string("(empty)")); child->set_value(column_record.name, std::string("(empty)"));

Loading…
Cancel
Save