diff options
-rw-r--r-- | src/pdf/qpdfdocument.cpp | 24 | ||||
-rw-r--r-- | src/pdf/qpdfdocument.h | 2 | ||||
-rw-r--r-- | src/pdf/qpdfdocument_p.h | 1 | ||||
-rw-r--r-- | tests/auto/qpdfdocument/tst_qpdfdocument.cpp | 31 |
4 files changed, 49 insertions, 9 deletions
diff --git a/src/pdf/qpdfdocument.cpp b/src/pdf/qpdfdocument.cpp index 7381a92..c737ca0 100644 --- a/src/pdf/qpdfdocument.cpp +++ b/src/pdf/qpdfdocument.cpp @@ -59,6 +59,7 @@ QPdfDocumentPrivate::QPdfDocumentPrivate() , loadComplete(false) , status(QPdfDocument::Null) , lastError(QPdfDocument::NoError) + , pageCount(0) { asyncBuffer.setData(QByteArray()); asyncBuffer.open(QIODevice::ReadWrite); @@ -105,6 +106,11 @@ void QPdfDocumentPrivate::clear() avail = nullptr; lock.unlock(); + if (pageCount != 0) { + pageCount = 0; + emit q->pageCountChanged(pageCount); + } + loadComplete = false; asyncBuffer.close(); @@ -266,7 +272,8 @@ void QPdfDocumentPrivate::checkComplete() QPdfMutexLocker lock; - for (int i = 0, count = FPDF_GetPageCount(doc); i < count; ++i) { + const int newPageCount = FPDF_GetPageCount(doc); + for (int i = 0; i < newPageCount; ++i) { int result = PDF_DATA_NOTAVAIL; while (result == PDF_DATA_NOTAVAIL) { result = FPDFAvail_IsPageAvail(avail, i, this); @@ -278,8 +285,14 @@ void QPdfDocumentPrivate::checkComplete() lock.unlock(); - if (loadComplete) + if (loadComplete) { + if (newPageCount != pageCount) { + pageCount = newPageCount; + emit q->pageCountChanged(pageCount); + } + setStatus(QPdfDocument::Ready); + } } void QPdfDocumentPrivate::setStatus(QPdfDocument::Status documentStatus) @@ -518,12 +531,7 @@ void QPdfDocument::close() int QPdfDocument::pageCount() const { - if (!d->doc) - return 0; - - const QPdfMutexLocker lock; - - return FPDF_GetPageCount(d->doc); + return d->pageCount; } QSizeF QPdfDocument::pageSize(int page) const diff --git a/src/pdf/qpdfdocument.h b/src/pdf/qpdfdocument.h index 78a0b5a..751c1b3 100644 --- a/src/pdf/qpdfdocument.h +++ b/src/pdf/qpdfdocument.h @@ -113,7 +113,7 @@ Q_SIGNALS: void passwordChanged(); void passwordRequired(); void statusChanged(QPdfDocument::Status status); - void pageCountChanged(); + void pageCountChanged(int pageCount); private: friend class QPdfBookmarkModelPrivate; diff --git a/src/pdf/qpdfdocument_p.h b/src/pdf/qpdfdocument_p.h index 6e40485..56b15cd 100644 --- a/src/pdf/qpdfdocument_p.h +++ b/src/pdf/qpdfdocument_p.h @@ -75,6 +75,7 @@ public: QPdfDocument::Status status; QPdfDocument::DocumentError lastError; + int pageCount; void clear(); diff --git a/tests/auto/qpdfdocument/tst_qpdfdocument.cpp b/tests/auto/qpdfdocument/tst_qpdfdocument.cpp index 105abc8..b6a00e0 100644 --- a/tests/auto/qpdfdocument/tst_qpdfdocument.cpp +++ b/tests/auto/qpdfdocument/tst_qpdfdocument.cpp @@ -102,9 +102,13 @@ void tst_QPdfDocument::pageCount() TemporaryPdf tempPdf; QPdfDocument doc; + QSignalSpy pageCountChangedSpy(&doc, SIGNAL(pageCountChanged(int))); + QCOMPARE(doc.pageCount(), 0); QCOMPARE(doc.load(tempPdf.fileName()), QPdfDocument::NoError); QCOMPARE(doc.pageCount(), 2); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); QCOMPARE(doc.pageSize(0).toSize(), tempPdf.pageLayout.fullRectPoints().size()); } @@ -114,12 +118,15 @@ void tst_QPdfDocument::loadFromIODevice() TemporaryPdf tempPdf; QPdfDocument doc; QSignalSpy statusChangedSpy(&doc, SIGNAL(statusChanged(QPdfDocument::Status))); + QSignalSpy pageCountChangedSpy(&doc, SIGNAL(pageCountChanged(int))); doc.load(&tempPdf); QCOMPARE(statusChangedSpy.count(), 2); QCOMPARE(statusChangedSpy[0][0].value<QPdfDocument::Status>(), QPdfDocument::Loading); QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Ready); QCOMPARE(doc.error(), QPdfDocument::NoError); QCOMPARE(doc.pageCount(), 2); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); } void tst_QPdfDocument::loadAsync() @@ -133,6 +140,7 @@ void tst_QPdfDocument::loadAsync() QPdfDocument doc; QSignalSpy statusChangedSpy(&doc, SIGNAL(statusChanged(QPdfDocument::Status))); + QSignalSpy pageCountChangedSpy(&doc, SIGNAL(pageCountChanged(int))); doc.load(reply.data()); @@ -140,6 +148,8 @@ void tst_QPdfDocument::loadAsync() QCOMPARE(statusChangedSpy[0][0].value<QPdfDocument::Status>(), QPdfDocument::Loading); QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Ready); QCOMPARE(doc.pageCount(), 2); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); } void tst_QPdfDocument::password() @@ -166,19 +176,26 @@ void tst_QPdfDocument::close() QPdfDocument doc; QSignalSpy statusChangedSpy(&doc, SIGNAL(statusChanged(QPdfDocument::Status))); + QSignalSpy pageCountChangedSpy(&doc, SIGNAL(pageCountChanged(int))); doc.load(&tempPdf); QCOMPARE(statusChangedSpy.count(), 2); QCOMPARE(statusChangedSpy[0][0].value<QPdfDocument::Status>(), QPdfDocument::Loading); QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Ready); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); + statusChangedSpy.clear(); + pageCountChangedSpy.clear(); doc.close(); QCOMPARE(statusChangedSpy.count(), 2); QCOMPARE(statusChangedSpy[0][0].value<QPdfDocument::Status>(), QPdfDocument::Unloading); QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Null); QCOMPARE(doc.pageCount(), 0); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); } void tst_QPdfDocument::loadAfterClose() @@ -187,18 +204,25 @@ void tst_QPdfDocument::loadAfterClose() QPdfDocument doc; QSignalSpy statusChangedSpy(&doc, SIGNAL(statusChanged(QPdfDocument::Status))); + QSignalSpy pageCountChangedSpy(&doc, SIGNAL(pageCountChanged(int))); doc.load(&tempPdf); QCOMPARE(statusChangedSpy.count(), 2); QCOMPARE(statusChangedSpy[0][0].value<QPdfDocument::Status>(), QPdfDocument::Loading); QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Ready); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); statusChangedSpy.clear(); + pageCountChangedSpy.clear(); doc.close(); QCOMPARE(statusChangedSpy.count(), 2); QCOMPARE(statusChangedSpy[0][0].value<QPdfDocument::Status>(), QPdfDocument::Unloading); QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Null); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); statusChangedSpy.clear(); + pageCountChangedSpy.clear(); doc.load(&tempPdf); QCOMPARE(statusChangedSpy.count(), 2); @@ -206,6 +230,8 @@ void tst_QPdfDocument::loadAfterClose() QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Ready); QCOMPARE(doc.error(), QPdfDocument::NoError); QCOMPARE(doc.pageCount(), 2); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), doc.pageCount()); } void tst_QPdfDocument::closeOnDestroy() @@ -219,12 +245,15 @@ void tst_QPdfDocument::closeOnDestroy() doc->load(&tempPdf); QSignalSpy statusChangedSpy(doc, SIGNAL(statusChanged(QPdfDocument::Status))); + QSignalSpy pageCountChangedSpy(doc, SIGNAL(pageCountChanged(int))); delete doc; QCOMPARE(statusChangedSpy.count(), 2); QCOMPARE(statusChangedSpy[0][0].value<QPdfDocument::Status>(), QPdfDocument::Unloading); QCOMPARE(statusChangedSpy[1][0].value<QPdfDocument::Status>(), QPdfDocument::Null); + QCOMPARE(pageCountChangedSpy.count(), 1); + QCOMPARE(pageCountChangedSpy[0][0].toInt(), 0); } // deleting a closed document should not emit any signal @@ -234,10 +263,12 @@ void tst_QPdfDocument::closeOnDestroy() doc->close(); QSignalSpy statusChangedSpy(doc, SIGNAL(statusChanged(QPdfDocument::Status))); + QSignalSpy pageCountChangedSpy(doc, SIGNAL(pageCountChanged(int))); delete doc; QCOMPARE(statusChangedSpy.count(), 0); + QCOMPARE(pageCountChangedSpy.count(), 0); } } |