Core: register documentation asynchronously

Change-Id: I946ce394bc4e21a1c5746fb38dcc81acc1106ba4
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
David Schulz
2018-02-12 13:28:37 +01:00
parent da33f94e20
commit 775b235f45
2 changed files with 43 additions and 10 deletions

View File

@@ -26,14 +26,17 @@
#include "helpmanager.h" #include "helpmanager.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/progressmanager/progressmanager.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/filesystemwatcher.h> #include <utils/filesystemwatcher.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/runextensions.h>
#include <QDateTime> #include <QDateTime>
#include <QDebug> #include <QDebug>
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <QFutureWatcher>
#include <QStringList> #include <QStringList>
#include <QUrl> #include <QUrl>
@@ -41,12 +44,14 @@
#include <QHelpEngineCore> #include <QHelpEngineCore>
#include <QMutexLocker>
#include <QSqlDatabase> #include <QSqlDatabase>
#include <QSqlDriver> #include <QSqlDriver>
#include <QSqlError> #include <QSqlError>
#include <QSqlQuery> #include <QSqlQuery>
static const char kUserDocumentationKey[] = "Help/UserDocumentation"; static const char kUserDocumentationKey[] = "Help/UserDocumentation";
static const char kUpdateDocumentationTask[] = "UpdateDocumentationTask";
namespace Core { namespace Core {
@@ -73,6 +78,8 @@ struct HelpManagerPrivate
QHash<QString, QVariant> m_customValues; QHash<QString, QVariant> m_customValues;
QSet<QString> m_userRegisteredFiles; QSet<QString> m_userRegisteredFiles;
QMutex helpengineMutex;
}; };
static HelpManager *m_instance = nullptr; static HelpManager *m_instance = nullptr;
@@ -128,34 +135,54 @@ void HelpManager::registerDocumentation(const QStringList &files)
return; return;
} }
QFuture<bool> 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<bool> &futureInterface,
const QStringList &files)
{
QMutexLocker locker(&d->helpengineMutex);
futureInterface.setProgressRange(0, files.count());
futureInterface.setProgressValue(0);
QHelpEngineCore helpEngine(collectionFilePath());
bool docsChanged = false; bool docsChanged = false;
for (const QString &file : files) { 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()) if (nameSpace.isEmpty())
continue; continue;
if (!d->m_helpEngine->registeredDocumentations().contains(nameSpace)) { if (!helpEngine.registeredDocumentations().contains(nameSpace)) {
if (d->m_helpEngine->registerDocumentation(file)) { if (helpEngine.registerDocumentation(file)) {
docsChanged = true; docsChanged = true;
} else { } else {
qWarning() << "Error registering namespace '" << nameSpace qWarning() << "Error registering namespace '" << nameSpace
<< "' from file '" << file << "':" << d->m_helpEngine->error(); << "' from file '" << file << "':" << helpEngine.error();
} }
} else { } else {
const QLatin1String key("CreationDate"); const QLatin1String key("CreationDate");
const QString &newDate = d->m_helpEngine->metaData(file, key).toString(); const QString &newDate = helpEngine.metaData(file, key).toString();
const QString &oldDate = d->m_helpEngine->metaData( const QString &oldDate = helpEngine.metaData(
d->m_helpEngine->documentationFileName(nameSpace), key).toString(); d->m_helpEngine->documentationFileName(nameSpace), key).toString();
if (QDateTime::fromString(newDate, Qt::ISODate) if (QDateTime::fromString(newDate, Qt::ISODate)
> QDateTime::fromString(oldDate, Qt::ISODate)) { > QDateTime::fromString(oldDate, Qt::ISODate)) {
if (d->m_helpEngine->unregisterDocumentation(nameSpace)) { if (helpEngine.unregisterDocumentation(nameSpace)) {
docsChanged = true; docsChanged = true;
d->m_helpEngine->registerDocumentation(file); helpEngine.registerDocumentation(file);
} }
} }
} }
} }
if (docsChanged) futureInterface.reportResult(docsChanged);
emit m_instance->documentationChanged();
} }
void HelpManager::unregisterDocumentation(const QStringList &nameSpaces) void HelpManager::unregisterDocumentation(const QStringList &nameSpaces)
@@ -166,6 +193,7 @@ void HelpManager::unregisterDocumentation(const QStringList &nameSpaces)
return; return;
} }
QMutexLocker locker(&d->helpengineMutex);
bool docsChanged = false; bool docsChanged = false;
for (const QString &nameSpace : nameSpaces) { for (const QString &nameSpace : nameSpaces) {
const QString filePath = d->m_helpEngine->documentationFileName(nameSpace); const QString filePath = d->m_helpEngine->documentationFileName(nameSpace);
@@ -178,6 +206,7 @@ void HelpManager::unregisterDocumentation(const QStringList &nameSpaces)
<< "': " << d->m_helpEngine->error(); << "': " << d->m_helpEngine->error();
} }
} }
locker.unlock();
if (docsChanged) if (docsChanged)
emit m_instance->documentationChanged(); emit m_instance->documentationChanged();
} }
@@ -468,6 +497,7 @@ HelpManager *HelpManager::instance() { return 0; }
QString HelpManager::collectionFilePath() { return QString(); } QString HelpManager::collectionFilePath() { return QString(); }
void HelpManager::registerDocumentation(const QStringList &) {} void HelpManager::registerDocumentation(const QStringList &) {}
void HelpManager::registerDocumentationNow(const QStringList &fileNames) {}
void HelpManager::unregisterDocumentation(const QStringList &) {} void HelpManager::unregisterDocumentation(const QStringList &) {}
void HelpManager::registerUserDocumentation(const QStringList &) {} void HelpManager::registerUserDocumentation(const QStringList &) {}

View File

@@ -32,6 +32,7 @@
#include <QVariant> #include <QVariant>
#include <QMap> #include <QMap>
#include <QHash> #include <QHash>
#include <QFutureInterface>
QT_FORWARD_DECLARE_CLASS(QUrl) QT_FORWARD_DECLARE_CLASS(QUrl)
@@ -103,6 +104,8 @@ private:
~HelpManager(); ~HelpManager();
static void setupHelpManager(); static void setupHelpManager();
static void registerDocumentationNow(QFutureInterface<bool> &futureInterface,
const QStringList &fileNames);
friend class Core::Internal::CorePlugin; // setupHelpManager friend class Core::Internal::CorePlugin; // setupHelpManager
friend class Core::Internal::MainWindow; // constructor/destructor friend class Core::Internal::MainWindow; // constructor/destructor
}; };