diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2023-07-25 15:44:50 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-01-27 21:02:19 +0000 |
commit | e3af0e8ae86151214a1e285c7f3bd7d24efbdd35 (patch) | |
tree | 864c0e93fcf1c3118325cb5596ec984fadab87ab | |
parent | 213a569e99488755b398b487bd7f2c2883451b65 (diff) |
Fix discontinuity with successive pinch-zoom in PdfMultiPageView
pinch.persistentScale is settable since 6.5 (qtdeclarative
a432970b258edb9ff041d221b2155df30cad4799): we need that to tell
PinchHandler to start over from 1 after we have also set the rendered
scale back to 1, because PinchHandler does not read the scale property
for itself.
This cherry-pick includes 48ebac59b1ec5bbafa1c64adbdbc44b0cf3f302a
to avoid a crash on exit by waiting for the rendering to be done, and
a4e64baef027fb407b8c1491c444ed58edd15529 to disable touch compression.
Fixes: QTBUG-115502
Task-number: QTBUG-120245
Task-number: QTBUG-121502
Fixes: QTBUG-121564
Pick-to: 6.5
Change-Id: I21951c447bf33e5942b6a1635488d5474ec8f293
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit c0524da14d92a957b4607fb5867dba5d23eea6d9)
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
(cherry picked from commit 8c27ae33f80440d20f578fa404c454c8d7bfdf19)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/pdfquick/PdfMultiPageView.qml | 6 | ||||
-rw-r--r-- | tests/auto/pdfquick/multipageview/tst_multipageview.cpp | 75 |
2 files changed, 80 insertions, 1 deletions
diff --git a/src/pdfquick/PdfMultiPageView.qml b/src/pdfquick/PdfMultiPageView.qml index 10683f55d..84c3e3181 100644 --- a/src/pdfquick/PdfMultiPageView.qml +++ b/src/pdfquick/PdfMultiPageView.qml @@ -408,12 +408,16 @@ Item { const centroidInFlickable = tableView.mapFromItem(paper, pinch.centroid.position.x, pinch.centroid.position.y) const newSourceWidth = image.sourceSize.width * paper.scale const ratio = newSourceWidth / image.sourceSize.width - console.log(lcMPV, "pinch ended on page", index, "with centroid", pinch.centroid.position, centroidInPoints, "wrt flickable", centroidInFlickable, + console.log(lcMPV, "pinch ended on page", index, + "with scale", paper.scale.toFixed(3), "ratio", ratio.toFixed(3), + "centroid", pinch.centroid.position, centroidInPoints, + "wrt flickable", centroidInFlickable, "page at", pageHolder.x.toFixed(2), pageHolder.y.toFixed(2), "contentX/Y were", tableView.contentX.toFixed(2), tableView.contentY.toFixed(2)) if (ratio > 1.1 || ratio < 0.9) { const centroidOnPage = Qt.point(centroidInPoints.x * root.renderScale * ratio, centroidInPoints.y * root.renderScale * ratio) paper.scale = 1 + pinch.persistentScale = 1 paper.x = 0 paper.y = 0 root.renderScale *= ratio diff --git a/tests/auto/pdfquick/multipageview/tst_multipageview.cpp b/tests/auto/pdfquick/multipageview/tst_multipageview.cpp index 9cd8e3e2d..9067fdbe3 100644 --- a/tests/auto/pdfquick/multipageview/tst_multipageview.cpp +++ b/tests/auto/pdfquick/multipageview/tst_multipageview.cpp @@ -6,6 +6,7 @@ #include <QtCore/QLoggingCategory> #include <QtGui/QClipboard> #include <QtGui/QPointingDevice> +#include <QtGui/QStyleHints> #include <QtQuick/QQuickView> #include <QtPdfQuick/private/qquickpdflinkmodel_p.h> #include <QtPdfQuick/private/qquickpdfsearchmodel_p.h> @@ -28,6 +29,7 @@ private Q_SLOTS: void password(); void selectionAndClipboard(); void search(); + void pinchDragPinch(); public: enum NavigationAction { @@ -355,5 +357,78 @@ void tst_MultiPageView::search() QVERIFY(movements > 4); } +void tst_MultiPageView::pinchDragPinch() +{ + qputenv("QML_NO_TOUCH_COMPRESSION", "1"); + QQuickView window; + QVERIFY(showView(window, testFileUrl("multiPageView.qml"))); + QQuickItem *pdfView = window.rootObject(); + QVERIFY(pdfView); + pdfView->setProperty("source", testFileUrl("bookmarksAndLinks.pdf")); + QTRY_COMPARE(pdfView->property("currentPageRenderingStatus").toInt(), QQuickPdfPageImage::Ready); + QQuickItem *table = static_cast<QQuickItem *>(findFirstChild(pdfView, "QQuickTableView")); + QVERIFY(table); + QQuickItem *firstPage = tableViewItemAtCell(table, 0, 0); + QVERIFY(firstPage); + QQuickItem *paper = firstPage->childAt(10, 10); + QVERIFY(paper); + QQuickPdfPageImage *image = firstPage->findChild<QQuickPdfPageImage *>(); + QVERIFY(image); + + auto pinch = [&window, paper, this]() { + const int threshold = QGuiApplication::styleHints()->startDragDistance(); + const int movement = 100; + QCOMPARE_GT(movement, threshold); + const qreal initialScale = paper->scale(); + QPoint p0(100, 200); + QPoint p1(200, 200); + QTest::QTouchEventSequence seq = QTest::touchEvent(&window, touchscreen.get()); + seq.press(0, p0, &window).commit(); + seq.stationary(0).press(1, p1, &window).commit(); + p1.setX(p1.x() + movement); + QSignalSpy frameSwappedSpy(&window, &QQuickWindow::frameSwapped); + seq.stationary(0).move(1, p1, &window).commit(); + // after a frame is rendered, the PinchHandler ought to be active + // (but verifying it would require private API) + QTRY_VERIFY(frameSwappedSpy.size() > 0); + QTRY_COMPARE(paper->scale(), initialScale); + + for (int i = 1; i <= 2; ++i) { + p1.setX(p1.x() + movement); + seq.stationary(0).move(1, p1, &window).commit(); + QTRY_COMPARE(paper->scale(), initialScale + i * 0.5); + } + seq.release(0, p0, &window).release(1, p1, &window).commit(); + }; + + auto drag = [&window, table, this]() { + const int movement = 100; + QPoint p0(200, 200); + QTest::QTouchEventSequence seq = QTest::touchEvent(&window, touchscreen.get()); + seq.press(0, p0, &window).commit(); + p0.setY(p0.y() + movement); + seq.move(0, p0, &window).commit(); + p0.setY(p0.y() + movement); + seq.move(0, p0, &window).commit(); + seq.release(0, p0, &window).commit(); + QTRY_COMPARE(table->property("moving"), false); + }; + + pinch(); + qCDebug(lcTests) << "new scale" << pdfView->property("renderScale").toReal(); + QTRY_COMPARE(pdfView->property("renderScale").toReal(), 2); + + drag(); + QCOMPARE(pdfView->property("renderScale").toReal(), 2); + + pinch(); + qCDebug(lcTests) << "new scale" << pdfView->property("renderScale").toReal(); + QTRY_COMPARE(pdfView->property("renderScale").toReal(), 4); + + // wait for rendering to be done before we exit: if we delete the document + // prematurely, QPdfIOHandler might access a dangling pointer + QTRY_COMPARE(image->status(), QQuickPdfPageImage::Ready); +} + QTEST_MAIN(tst_MultiPageView) #include "tst_multipageview.moc" |