void DirectoryFilter::refresh(QFutureInterface<void> &future) { QStringList directories; { QMutexLocker locker(&m_lock); if (m_directories.count() < 1) { files().clear(); generateFileNames(); future.setProgressRange(0, 1); future.setProgressValueAndText(1, tr("%1 filter update: 0 files").arg(displayName())); return; } directories = m_directories; } Utils::SubDirFileIterator it(directories, m_filters); future.setProgressRange(0, it.maxProgress()); QStringList filesFound; while (!future.isCanceled() && it.hasNext()) { filesFound << it.next(); if (future.isProgressUpdateNeeded() || future.progressValue() == 0 /*workaround for regression in Qt*/) { future.setProgressValueAndText(it.currentProgress(), tr("%1 filter update: %n files", 0, filesFound.size()).arg(displayName())); } } if (!future.isCanceled()) { QMutexLocker locker(&m_lock); files() = filesFound; generateFileNames(); future.setProgressValue(it.maxProgress()); } else { future.setProgressValueAndText(it.currentProgress(), tr("%1 filter update: canceled").arg(displayName())); } }
void DirectoryFilter::refresh(QFutureInterface<void> &future) { QStringList directories; { QMutexLocker locker(&m_lock); if (m_directories.count() < 1) { m_files.clear(); QTimer::singleShot(0, this, SLOT(updateFileIterator())); future.setProgressRange(0, 1); future.setProgressValueAndText(1, tr("%1 filter update: 0 files").arg(displayName())); return; } directories = m_directories; } Utils::SubDirFileIterator subDirIterator(directories, m_filters); future.setProgressRange(0, subDirIterator.maxProgress()); QStringList filesFound; auto end = subDirIterator.end(); for (auto it = subDirIterator.begin(); it != end; ++it) { if (future.isCanceled()) break; filesFound << (*it).filePath; if (future.isProgressUpdateNeeded() || future.progressValue() == 0 /*workaround for regression in Qt*/) { future.setProgressValueAndText(subDirIterator.currentProgress(), tr("%1 filter update: %n files", 0, filesFound.size()).arg(displayName())); } } if (!future.isCanceled()) { QMutexLocker locker(&m_lock); m_files = filesFound; QTimer::singleShot(0, this, SLOT(updateFileIterator())); future.setProgressValue(subDirIterator.maxProgress()); } else { future.setProgressValueAndText(subDirIterator.currentProgress(), tr("%1 filter update: canceled").arg(displayName())); } }