use progressdialog and QtConcurrent in order to create documentProxies structure (improving performances in a network-storage context)

preferencesAboutTextFull
Clément Fauconnier 3 years ago
parent cb7538aacd
commit 6994400e71
  1. 1
      OpenBoard.pro
  2. 84
      src/core/UBPersistenceManager.cpp
  3. 5
      src/core/UBPersistenceManager.h

@ -40,6 +40,7 @@ QT += webkitwidgets
QT += multimediawidgets QT += multimediawidgets
QT += printsupport QT += printsupport
QT += core QT += core
QT += concurrent
INCLUDEPATH += src INCLUDEPATH += src

@ -34,6 +34,7 @@
#include <QDomDocument> #include <QDomDocument>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
#include <QModelIndex> #include <QModelIndex>
#include <QtConcurrent>
#include "frameworks/UBPlatformUtils.h" #include "frameworks/UBPlatformUtils.h"
#include "frameworks/UBFileSystemUtils.h" #include "frameworks/UBFileSystemUtils.h"
@ -98,7 +99,6 @@ UBPersistenceManager::UBPersistenceManager(QObject *pParent)
mDocumentTreeStructureModel = new UBDocumentTreeModel(this); mDocumentTreeStructureModel = new UBDocumentTreeModel(this);
createDocumentProxiesStructure(); createDocumentProxiesStructure();
emit proxyListChanged(); emit proxyListChanged();
} }
@ -131,7 +131,27 @@ void UBPersistenceManager::createDocumentProxiesStructure(bool interactive)
rootDir.mkpath(rootDir.path()); rootDir.mkpath(rootDir.path());
QFileInfoList contentList = rootDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time | QDir::Reversed); QFileInfoList contentList = rootDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time | QDir::Reversed);
createDocumentProxiesStructure(contentList, interactive);
mProgress.setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint);
mProgress.setLabelText(QString("retrieving all your documents (found %1)").arg(contentList.size()));
mProgress.setCancelButton(nullptr);
// Create a QFutureWatcher and connect signals and slots.
QFutureWatcher<void> futureWatcher;
QObject::connect(&futureWatcher, &QFutureWatcher<void>::finished, &mProgress, &QProgressDialog::reset);
QObject::connect(&futureWatcher, &QFutureWatcher<void>::progressRangeChanged, &mProgress, &QProgressDialog::setRange);
QObject::connect(&futureWatcher, &QFutureWatcher<void>::progressValueChanged, &mProgress, &QProgressDialog::setValue);
// Start the computation.
futureWatcher.setFuture(QtConcurrent::map(contentList, [=] (QFileInfo& contentInfo)
{
createDocumentProxyStructure(contentInfo);
}));
// Display the dialog and start the event loop.
mProgress.exec();
futureWatcher.waitForFinished();
if (QFileInfo(mFoldersXmlStorageName).exists()) { if (QFileInfo(mFoldersXmlStorageName).exists()) {
QDomDocument xmlDom; QDomDocument xmlDom;
@ -158,44 +178,48 @@ void UBPersistenceManager::createDocumentProxiesStructure(bool interactive)
} }
} }
void UBPersistenceManager::createDocumentProxiesStructure(const QFileInfoList &contentInfo, bool interactive) void UBPersistenceManager::createDocumentProxiesStructure(const QFileInfoList &contentInfoList, bool interactive)
{ {
foreach(QFileInfo path, contentInfo) foreach(QFileInfo contentInfo, contentInfoList)
{ {
QString fullPath = path.absoluteFilePath(); createDocumentProxyStructure(contentInfo, interactive);
}
}
QDir dir(fullPath); void UBPersistenceManager::createDocumentProxyStructure(const QFileInfo &contentInfo, bool interactive)
{
QString fullPath = contentInfo.absoluteFilePath();
QDir dir(fullPath);
if (dir.entryList(QDir::Files | QDir::NoDotAndDotDot).size() > 0) if (dir.entryList(QDir::Files | QDir::NoDotAndDotDot).size() > 0)
{ {
QMap<QString, QVariant> metadatas = UBMetadataDcSubsetAdaptor::load(fullPath); QMap<QString, QVariant> metadatas = UBMetadataDcSubsetAdaptor::load(fullPath);
QString docGroupName = metadatas.value(UBSettings::documentGroupName, QString()).toString(); QString docGroupName = metadatas.value(UBSettings::documentGroupName, QString()).toString();
QString docName = metadatas.value(UBSettings::documentName, QString()).toString(); QString docName = metadatas.value(UBSettings::documentName, QString()).toString();
if (docName.isEmpty()) { if (docName.isEmpty()) {
qDebug() << "Group name and document name are empty in UBPersistenceManager::createDocumentProxiesStructure()"; qDebug() << "Group name and document name are empty in UBPersistenceManager::createDocumentProxiesStructure()";
continue; return;
} }
QModelIndex parentIndex = mDocumentTreeStructureModel->goTo(docGroupName); QModelIndex parentIndex = mDocumentTreeStructureModel->goTo(docGroupName);
if (!parentIndex.isValid()) { if (!parentIndex.isValid()) {
return; return;
} }
UBDocumentProxy* docProxy = new UBDocumentProxy(fullPath); // managed in UBDocumentTreeNode UBDocumentProxy* docProxy = new UBDocumentProxy(fullPath); // managed in UBDocumentTreeNode
foreach(QString key, metadatas.keys()) { foreach(QString key, metadatas.keys()) {
docProxy->setMetaData(key, metadatas.value(key)); docProxy->setMetaData(key, metadatas.value(key));
} }
docProxy->setPageCount(sceneCount(docProxy)); docProxy->setPageCount(sceneCount(docProxy));
if (!interactive) if (!interactive)
mDocumentTreeStructureModel->addDocument(docProxy, parentIndex); mDocumentTreeStructureModel->addDocument(docProxy, parentIndex);
else else
processInteractiveReplacementDialog(docProxy); processInteractiveReplacementDialog(docProxy);
}
} }
} };
QDialog::DialogCode UBPersistenceManager::processInteractiveReplacementDialog(UBDocumentProxy *pProxy) QDialog::DialogCode UBPersistenceManager::processInteractiveReplacementDialog(UBDocumentProxy *pProxy)
{ {

@ -131,7 +131,8 @@ class UBPersistenceManager : public QObject
bool addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument); bool addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument);
void createDocumentProxiesStructure(bool interactive = false); void createDocumentProxiesStructure(bool interactive = false);
void createDocumentProxiesStructure(const QFileInfoList &contentInfo, bool interactive = false); void createDocumentProxiesStructure(const QFileInfoList &contentInfoList, bool interactive = false);
void createDocumentProxyStructure(const QFileInfo& contentInfo, bool interactive = false);
QDialog::DialogCode processInteractiveReplacementDialog(UBDocumentProxy *pProxy); QDialog::DialogCode processInteractiveReplacementDialog(UBDocumentProxy *pProxy);
QStringList documentSubDirectories() QStringList documentSubDirectories()
@ -187,6 +188,8 @@ private:
bool mHasPurgedDocuments; bool mHasPurgedDocuments;
QString mDocumentRepositoryPath; QString mDocumentRepositoryPath;
QString mFoldersXmlStorageName; QString mFoldersXmlStorageName;
QProgressDialog mProgress;
QFutureWatcher<void> futureWatcher;
private slots: private slots:
void documentRepositoryChanged(const QString& path); void documentRepositoryChanged(const QString& path);

Loading…
Cancel
Save