From 775b235f45673e9098a28edf441ba8cf7f4e19db Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 12 Feb 2018 13:28:37 +0100 Subject: [PATCH] Core: register documentation asynchronously Change-Id: I946ce394bc4e21a1c5746fb38dcc81acc1106ba4 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/helpmanager.cpp | 50 ++++++++++++++++++++------ src/plugins/coreplugin/helpmanager.h | 3 ++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/plugins/coreplugin/helpmanager.cpp b/src/plugins/coreplugin/helpmanager.cpp index 3d6780b9097..a9d7556c182 100644 --- a/src/plugins/coreplugin/helpmanager.cpp +++ b/src/plugins/coreplugin/helpmanager.cpp @@ -26,14 +26,17 @@ #include "helpmanager.h" #include +#include #include #include #include +#include #include #include #include #include +#include #include #include @@ -41,12 +44,14 @@ #include +#include #include #include #include #include static const char kUserDocumentationKey[] = "Help/UserDocumentation"; +static const char kUpdateDocumentationTask[] = "UpdateDocumentationTask"; namespace Core { @@ -73,6 +78,8 @@ struct HelpManagerPrivate QHash m_customValues; QSet m_userRegisteredFiles; + + QMutex helpengineMutex; }; static HelpManager *m_instance = nullptr; @@ -128,34 +135,54 @@ void HelpManager::registerDocumentation(const QStringList &files) return; } + QFuture future = Utils::runAsync(&HelpManager::registerDocumentationNow, files); + Utils::onResultReady(future, m_instance, [](bool docsChanged){ + if (docsChanged) { + d->m_helpEngine->setupData(); + emit m_instance->documentationChanged(); + } + }); + ProgressManager::addTask(future, tr("Update Documentation"), + kUpdateDocumentationTask); +} + +void HelpManager::registerDocumentationNow(QFutureInterface &futureInterface, + const QStringList &files) +{ + QMutexLocker locker(&d->helpengineMutex); + + futureInterface.setProgressRange(0, files.count()); + futureInterface.setProgressValue(0); + + QHelpEngineCore helpEngine(collectionFilePath()); bool docsChanged = false; for (const QString &file : files) { - const QString &nameSpace = d->m_helpEngine->namespaceName(file); + futureInterface.setProgressValue(futureInterface.progressValue() + 1); + const QString &nameSpace = helpEngine.namespaceName(file); if (nameSpace.isEmpty()) continue; - if (!d->m_helpEngine->registeredDocumentations().contains(nameSpace)) { - if (d->m_helpEngine->registerDocumentation(file)) { + if (!helpEngine.registeredDocumentations().contains(nameSpace)) { + if (helpEngine.registerDocumentation(file)) { docsChanged = true; } else { qWarning() << "Error registering namespace '" << nameSpace - << "' from file '" << file << "':" << d->m_helpEngine->error(); + << "' from file '" << file << "':" << helpEngine.error(); } } else { const QLatin1String key("CreationDate"); - const QString &newDate = d->m_helpEngine->metaData(file, key).toString(); - const QString &oldDate = d->m_helpEngine->metaData( + const QString &newDate = helpEngine.metaData(file, key).toString(); + const QString &oldDate = helpEngine.metaData( d->m_helpEngine->documentationFileName(nameSpace), key).toString(); if (QDateTime::fromString(newDate, Qt::ISODate) > QDateTime::fromString(oldDate, Qt::ISODate)) { - if (d->m_helpEngine->unregisterDocumentation(nameSpace)) { + if (helpEngine.unregisterDocumentation(nameSpace)) { docsChanged = true; - d->m_helpEngine->registerDocumentation(file); + helpEngine.registerDocumentation(file); } } } } - if (docsChanged) - emit m_instance->documentationChanged(); + futureInterface.reportResult(docsChanged); } void HelpManager::unregisterDocumentation(const QStringList &nameSpaces) @@ -166,6 +193,7 @@ void HelpManager::unregisterDocumentation(const QStringList &nameSpaces) return; } + QMutexLocker locker(&d->helpengineMutex); bool docsChanged = false; for (const QString &nameSpace : nameSpaces) { const QString filePath = d->m_helpEngine->documentationFileName(nameSpace); @@ -178,6 +206,7 @@ void HelpManager::unregisterDocumentation(const QStringList &nameSpaces) << "': " << d->m_helpEngine->error(); } } + locker.unlock(); if (docsChanged) emit m_instance->documentationChanged(); } @@ -468,6 +497,7 @@ HelpManager *HelpManager::instance() { return 0; } QString HelpManager::collectionFilePath() { return QString(); } void HelpManager::registerDocumentation(const QStringList &) {} +void HelpManager::registerDocumentationNow(const QStringList &fileNames) {} void HelpManager::unregisterDocumentation(const QStringList &) {} void HelpManager::registerUserDocumentation(const QStringList &) {} diff --git a/src/plugins/coreplugin/helpmanager.h b/src/plugins/coreplugin/helpmanager.h index d2205444962..fcb62ba937b 100644 --- a/src/plugins/coreplugin/helpmanager.h +++ b/src/plugins/coreplugin/helpmanager.h @@ -32,6 +32,7 @@ #include #include #include +#include QT_FORWARD_DECLARE_CLASS(QUrl) @@ -103,6 +104,8 @@ private: ~HelpManager(); static void setupHelpManager(); + static void registerDocumentationNow(QFutureInterface &futureInterface, + const QStringList &fileNames); friend class Core::Internal::CorePlugin; // setupHelpManager friend class Core::Internal::MainWindow; // constructor/destructor };