diff --git a/src/assistant/help/qhelpcontentwidget.cpp b/src/assistant/help/qhelpcontentwidget.cpp index b3c7c9c1bf548d44597337ca3f807fadff35f82a..37abd887b780bea74421e4f70a08b6a452ab1221 100644 --- a/src/assistant/help/qhelpcontentwidget.cpp +++ b/src/assistant/help/qhelpcontentwidget.cpp @@ -73,6 +73,7 @@ public: class QHelpContentProvider : public QThread { + Q_OBJECT public: QHelpContentProvider(QHelpEnginePrivate *helpEngine); ~QHelpContentProvider(); @@ -81,11 +82,13 @@ public: QHelpContentItem *rootItem(); int nextChildCount() const; +signals: + void finishedSuccessFully(); + private: void run(); QHelpEnginePrivate *m_helpEngine; - QHelpContentItem *m_rootItem; QStringList m_filterAttributes; QQueue<QHelpContentItem*> m_rootItems; QMutex m_mutex; @@ -196,7 +199,6 @@ QHelpContentProvider::QHelpContentProvider(QHelpEnginePrivate *helpEngine) : QThread(helpEngine) { m_helpEngine = helpEngine; - m_rootItem = 0; m_abort = false; } @@ -253,8 +255,7 @@ void QHelpContentProvider::run() QHelpContentItem *item = 0; m_mutex.lock(); - m_rootItem = new QHelpContentItem(QString(), QString(), 0); - m_rootItems.enqueue(m_rootItem); + QHelpContentItem * const rootItem = new QHelpContentItem(QString(), QString(), 0); QStringList atts = m_filterAttributes; const QStringList fileNames = m_helpEngine->orderedFileNameList; m_mutex.unlock(); @@ -262,9 +263,10 @@ void QHelpContentProvider::run() foreach (const QString &dbFileName, fileNames) { m_mutex.lock(); if (m_abort) { + delete rootItem; m_abort = false; m_mutex.unlock(); - break; + return; } m_mutex.unlock(); QHelpDBReader reader(dbFileName, @@ -292,8 +294,8 @@ CHECK_DEPTH: if (depth == 0) { m_mutex.lock(); item = new QHelpContentItem(title, link, - m_helpEngine->fileNameReaderMap.value(dbFileName), m_rootItem); - m_rootItem->appendChild(item); + m_helpEngine->fileNameReaderMap.value(dbFileName), rootItem); + rootItem->appendChild(item); m_mutex.unlock(); stack.push(item); _depth = 1; @@ -317,8 +319,10 @@ CHECK_DEPTH: } } m_mutex.lock(); + m_rootItems.enqueue(rootItem); m_abort = false; m_mutex.unlock(); + emit finishedSuccessFully(); } @@ -353,7 +357,7 @@ QHelpContentModel::QHelpContentModel(QHelpEnginePrivate *helpEngine) d->rootItem = 0; d->qhelpContentProvider = new QHelpContentProvider(helpEngine); - connect(d->qhelpContentProvider, SIGNAL(finished()), + connect(d->qhelpContentProvider, SIGNAL(finishedSuccessFully()), this, SLOT(insertContents()), Qt::QueuedConnection); connect(helpEngine->q, SIGNAL(readersAboutToBeInvalidated()), this, SLOT(invalidateContents())); } @@ -395,6 +399,9 @@ void QHelpContentModel::createContents(const QString &customFilterName) void QHelpContentModel::insertContents() { + QHelpContentItem * const newRootItem = d->qhelpContentProvider->rootItem(); + if (!newRootItem) + return; int count; if (d->rootItem) { count = d->rootItem->childCount() - 1; @@ -406,7 +413,7 @@ void QHelpContentModel::insertContents() count = d->qhelpContentProvider->nextChildCount() - 1; beginInsertRows(QModelIndex(), 0, count > 0 ? count : 0); - d->rootItem = d->qhelpContentProvider->rootItem(); + d->rootItem = newRootItem; endInsertRows(); emit contentsCreated(); } @@ -586,3 +593,5 @@ void QHelpContentWidget::showLink(const QModelIndex &index) } QT_END_NAMESPACE + +#include "qhelpcontentwidget.moc"