From d0e96aa21daa8601254cffd584d33f38d62ff1df Mon Sep 17 00:00:00 2001 From: Shawn Rutledge <shawn.rutledge@qt.io> Date: Fri, 14 Feb 2020 09:26:19 +0100 Subject: [PATCH] Use a timer to update PdfSearchModel in the background Change-Id: I855150578c9127b175c5907500d057b704fe5e0e Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> --- src/pdf/api/qpdfsearchmodel.h | 1 + src/pdf/api/qpdfsearchmodel_p.h | 2 ++ src/pdf/qpdfsearchmodel.cpp | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/pdf/api/qpdfsearchmodel.h b/src/pdf/api/qpdfsearchmodel.h index c8190f192..cc91e214a 100644 --- a/src/pdf/api/qpdfsearchmodel.h +++ b/src/pdf/api/qpdfsearchmodel.h @@ -85,6 +85,7 @@ Q_SIGNALS: protected: void updatePage(int page); + void timerEvent(QTimerEvent *event) override; private: QHash<int, QByteArray> m_roleNames; diff --git a/src/pdf/api/qpdfsearchmodel_p.h b/src/pdf/api/qpdfsearchmodel_p.h index 0855bc216..2a23706b2 100644 --- a/src/pdf/api/qpdfsearchmodel_p.h +++ b/src/pdf/api/qpdfsearchmodel_p.h @@ -77,6 +77,8 @@ public: QVector<bool> pagesSearched; QVector<QVector<QPdfSearchResult>> searchResults; int rowCountSoFar = 0; + int updateTimerId = -1; + int nextPageToUpdate = 0; }; QT_END_NAMESPACE diff --git a/src/pdf/qpdfsearchmodel.cpp b/src/pdf/qpdfsearchmodel.cpp index aa19af5b1..4129c7cb7 100644 --- a/src/pdf/qpdfsearchmodel.cpp +++ b/src/pdf/qpdfsearchmodel.cpp @@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(qLcS, "qt.pdf.search") +static const int UpdateTimerInterval = 100; static const int ContextChars = 20; static const double CharacterHitTolerance = 6.0; @@ -164,12 +165,27 @@ void QPdfSearchModel::setDocument(QPdfDocument *document) d->clearResults(); } +void QPdfSearchModel::timerEvent(QTimerEvent *event) +{ + Q_D(QPdfSearchModel); + if (event->timerId() != d->updateTimerId) + return; + if (!d->document || d->nextPageToUpdate >= d->document->pageCount()) { + if (d->document) + qCDebug(qLcS, "done updating search results on %d pages", d->searchResults.count()); + killTimer(d->updateTimerId); + d->updateTimerId = -1; + } + d->doSearch(d->nextPageToUpdate++); +} + QPdfSearchModelPrivate::QPdfSearchModelPrivate() { } void QPdfSearchModelPrivate::clearResults() { + Q_Q(QPdfSearchModel); rowCountSoFar = 0; searchResults.clear(); pagesSearched.clear(); @@ -180,6 +196,8 @@ void QPdfSearchModelPrivate::clearResults() searchResults.resize(0); pagesSearched.resize(0); } + nextPageToUpdate = 0; + updateTimerId = q->startTimer(UpdateTimerInterval); } bool QPdfSearchModelPrivate::doSearch(int page) -- GitLab