diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-08-12 10:03:53 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-08-12 10:04:33 +0200 |
commit | 61f72d32b4fddc6e87f21d0243d9f0a32ca61987 (patch) | |
tree | b166541b885e33666bc3dffbde937b5dc0e93bc5 | |
parent | 430853836f9c17154ef3ee4cac6b03b90ee493a9 (diff) | |
parent | 01c6af3fc940378e8eee41a9fb8273420ef5a7e1 (diff) |
Merge remote-tracking branch 'origin/5.3' into 5.4
Conflicts:
src/qml/jsruntime/qv4include.cpp
src/quick/items/qquickrendercontrol.cpp
src/quick/items/qquickrendercontrol_p.h
src/quickwidgets/qquickwidget.cpp
Change-Id: Ib2dc0051a38cd283a37a7665eb4a76f6f7ec8b15
20 files changed, 228 insertions, 46 deletions
diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index b8ada7ceaf..a4130cb45f 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -536,12 +536,14 @@ bool QQmlPropertyCacheCreator::buildMetaObjectRecursively(int objectIndex, int r Q_ASSERT(baseTypeCache); } - if (needVMEMetaObject) { - if (!createMetaObject(objectIndex, obj, baseTypeCache)) - return false; - } else if (baseTypeCache) { - propertyCaches[objectIndex] = baseTypeCache; - baseTypeCache->addref(); + if (baseTypeCache) { + if (needVMEMetaObject) { + if (!createMetaObject(objectIndex, obj, baseTypeCache)) + return false; + } else { + propertyCaches[objectIndex] = baseTypeCache; + baseTypeCache->addref(); + } } if (propertyCaches.at(objectIndex)) { diff --git a/src/qml/jsruntime/qv4include.cpp b/src/qml/jsruntime/qv4include.cpp index b9576e1bee..ece0cfa8b3 100644 --- a/src/qml/jsruntime/qv4include.cpp +++ b/src/qml/jsruntime/qv4include.cpp @@ -209,20 +209,28 @@ QV4::ReturnedValue QV4Include::method_include(QV4::CallContext *ctx) result = i->result(); } else { + QScopedPointer<QV4::Script> script; - QFile f(localFile); + if (const QQmlPrivate::CachedQmlUnit *cachedUnit = QQmlMetaType::findCachedCompilationUnit(url)) { + QV4::CompiledData::CompilationUnit *jsUnit = cachedUnit->createCompilationUnit(); + script.reset(new QV4::Script(scope.engine, qmlcontextobject, jsUnit)); + } else { + QFile f(localFile); - if (f.open(QIODevice::ReadOnly)) { - QByteArray data = f.readAll(); - QString code = QString::fromUtf8(data); - QmlIR::Document::removeScriptPragmas(code); + if (f.open(QIODevice::ReadOnly)) { + QByteArray data = f.readAll(); + QString code = QString::fromUtf8(data); + QmlIR::Document::removeScriptPragmas(code); - QV4::Script script(scope.engine, qmlcontextobject, code, url.toString()); + script.reset(new QV4::Script(scope.engine, qmlcontextobject, code, url.toString())); + } + } + if (!script.isNull()) { QV4::ExecutionContext *ctx = scope.engine->currentContext(); - script.parse(); + script->parse(); if (!scope.engine->hasException) - script.run(); + script->run(); if (scope.engine->hasException) { QV4::ScopedValue ex(scope, ctx->catchException()); result = resultValue(scope.engine, Exception); diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index e087785901..84ceefccba 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -265,7 +265,7 @@ V8_DEFINE_EXTENSION(QQmlComponentExtension, componentExtension); /*! \qmlattachedsignal Component::completed() - Emitted after component "startup" has completed. This can be used to + Emitted after the object has been instantiated. This can be used to execute script code at startup, once the full QML environment has been established. @@ -286,14 +286,13 @@ V8_DEFINE_EXTENSION(QQmlComponentExtension, componentExtension); /*! \qmlattachedsignal Component::destruction() - Emitted as the component begins destruction. This can be used to undo + Emitted as the object begins destruction. This can be used to undo work done in response to the \l {completed}{completed()} signal, or other imperative code in your application. The corresponding handler is \c onDestruction. It can be declared on - any object. However, it applies to the destruction of the component as - a whole, and not the destruction of the specific object. The order of - running the \c onDestruction handlers is undefined. + any object. The order of running the \c onDestruction handlers is + undefined. \qml Rectangle { diff --git a/src/qml/qml/qqmlincubator.cpp b/src/qml/qml/qqmlincubator.cpp index 0665a4ac1a..c342d8b080 100644 --- a/src/qml/qml/qqmlincubator.cpp +++ b/src/qml/qml/qqmlincubator.cpp @@ -292,10 +292,7 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) QQmlEngine *engine = compiledData->engine; QQmlEnginePrivate *enginePriv = QQmlEnginePrivate::get(engine); - bool guardOk = vmeGuard.isOK(); - vmeGuard.clear(); - - if (!guardOk) { + if (!vmeGuard.isOK()) { QQmlError error; error.setUrl(compiledData->url()); error.setDescription(QQmlComponent::tr("Object destroyed during incubation")); @@ -305,6 +302,8 @@ void QQmlIncubatorPrivate::incubate(QQmlInstantiationInterrupt &i) goto finishIncubate; } + vmeGuard.clear(); + if (progress == QQmlIncubatorPrivate::Execute) { enginePriv->referenceScarceResources(); QObject *tresult = 0; diff --git a/src/quick/items/qquickframebufferobject.cpp b/src/quick/items/qquickframebufferobject.cpp index 0a8ad36476..fea6aadc23 100644 --- a/src/quick/items/qquickframebufferobject.cpp +++ b/src/quick/items/qquickframebufferobject.cpp @@ -235,8 +235,12 @@ QSGNode *QQuickFramebufferObject::updatePaintNode(QSGNode *node, UpdatePaintNode n->renderer->synchronize(this); + QSize minFboSize = d->sceneGraphContext()->minimumFBOSize(); + QSize desiredFboSize(qMax<int>(minFboSize.width(), width()), + qMax<int>(minFboSize.height(), height())); + if (n->fbo && (d->followsItemSize || n->invalidatePending)) { - if (n->fbo->width() != width() || n->fbo->height() != height()) { + if (n->fbo->size() != desiredFboSize) { delete n->fbo; n->fbo = 0; delete n->msDisplayFbo; @@ -245,10 +249,7 @@ QSGNode *QQuickFramebufferObject::updatePaintNode(QSGNode *node, UpdatePaintNode } if (!n->fbo) { - QSize minFboSize = d->sceneGraphContext()->minimumFBOSize(); - QSize fboSize(qMax<int>(minFboSize.width(), width()), - qMax<int>(minFboSize.height(), height())); - n->fbo = n->renderer->createFramebufferObject(fboSize); + n->fbo = n->renderer->createFramebufferObject(desiredFboSize); GLuint displayTexture = n->fbo->texture(); diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp index bf67cbef26..738430dc89 100644 --- a/src/quick/items/qquickimagebase.cpp +++ b/src/quick/items/qquickimagebase.cpp @@ -292,10 +292,10 @@ void QQuickImageBase::handleWindowChanged(QQuickWindow* window) connect(window, SIGNAL(screenChanged(QScreen*)), this, SLOT(handleScreenChanged(QScreen*))); } -void QQuickImageBase::handleScreenChanged(QScreen*) +void QQuickImageBase::handleScreenChanged(QScreen* screen) { // Screen DPI might have changed, reload images on screen change. - if (isComponentComplete()) + if (screen && isComponentComplete()) load(); } diff --git a/src/quick/items/qquickimagebase_p.h b/src/quick/items/qquickimagebase_p.h index 67f1e81cae..a3d9e3ace2 100644 --- a/src/quick/items/qquickimagebase_p.h +++ b/src/quick/items/qquickimagebase_p.h @@ -107,7 +107,7 @@ private Q_SLOTS: virtual void requestFinished(); void requestProgress(qint64,qint64); void handleWindowChanged(QQuickWindow *window); - void handleScreenChanged(QScreen *); + void handleScreenChanged(QScreen *screen); private: Q_DISABLE_COPY(QQuickImageBase) diff --git a/src/quick/items/qquickpathview.cpp b/src/quick/items/qquickpathview.cpp index efce244f7d..216b7cc7c1 100644 --- a/src/quick/items/qquickpathview.cpp +++ b/src/quick/items/qquickpathview.cpp @@ -1599,6 +1599,7 @@ void QQuickPathViewPrivate::handleMousePressEvent(QMouseEvent *event) return; startPoint = pointNear(event->localPos(), &startPc); + startPos = event->localPos(); if (idx == items.count()) { qreal distance = qAbs(event->localPos().x() - startPoint.x()) + qAbs(event->localPos().y() - startPoint.y()); if (distance > dragMargin) @@ -1621,8 +1622,6 @@ void QQuickPathView::mouseMoveEvent(QMouseEvent *event) Q_D(QQuickPathView); if (d->interactive) { d->handleMouseMoveEvent(event); - if (d->stealMouse) - setKeepMouseGrab(true); event->accept(); } else { QQuickItem::mouseMoveEvent(event); @@ -1639,9 +1638,17 @@ void QQuickPathViewPrivate::handleMouseMoveEvent(QMouseEvent *event) qreal newPc; QPointF pathPoint = pointNear(event->localPos(), &newPc); if (!stealMouse) { - QPointF delta = pathPoint - startPoint; - if (qAbs(delta.x()) > qApp->styleHints()->startDragDistance() || qAbs(delta.y()) > qApp->styleHints()->startDragDistance()) { - stealMouse = true; + QPointF posDelta = event->localPos() - startPos; + if (QQuickWindowPrivate::dragOverThreshold(posDelta.y(), Qt::YAxis, event) || QQuickWindowPrivate::dragOverThreshold(posDelta.x(), Qt::XAxis, event)) { + // The touch has exceeded the threshold. If the movement along the path is close to the drag threshold + // then we'll assume that this gesture targets the PathView. This ensures PathView gesture grabbing + // is in sync with other items. + QPointF pathDelta = pathPoint - startPoint; + if (qAbs(pathDelta.x()) > qApp->styleHints()->startDragDistance() * 0.8 + || qAbs(pathDelta.y()) > qApp->styleHints()->startDragDistance() * 0.8) { + stealMouse = true; + q->setKeepMouseGrab(true); + } } } else { moveReason = QQuickPathViewPrivate::Mouse; diff --git a/src/quick/items/qquickpathview_p_p.h b/src/quick/items/qquickpathview_p_p.h index e21f3757e6..59a7ac231b 100644 --- a/src/quick/items/qquickpathview_p_p.h +++ b/src/quick/items/qquickpathview_p_p.h @@ -135,6 +135,7 @@ public: qreal currentItemOffset; qreal startPc; QPointF startPoint; + QPointF startPos; qreal offset; qreal offsetAdj; qreal mappedRange; diff --git a/src/quick/util/qquickanimatorjob.cpp b/src/quick/util/qquickanimatorjob.cpp index e7535be1d4..9639129583 100644 --- a/src/quick/util/qquickanimatorjob.cpp +++ b/src/quick/util/qquickanimatorjob.cpp @@ -97,9 +97,11 @@ QQuickAnimatorProxyJob::~QQuickAnimatorProxyJob() void QQuickAnimatorProxyJob::deleteJob() { if (m_job) { - if (m_controller && m_internalState != State_Starting) + // If we have a controller, we might have posted the job to be started + // so delete it through the controller to clean up properly. + if (m_controller) m_controller->deleteJob(m_job); - else if (m_internalState == State_Starting) + else delete m_job; m_job = 0; } diff --git a/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro b/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro index 6193ee7c88..6f3f765aba 100644 --- a/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro +++ b/tests/auto/qml/qqmlecmascript/qqmlecmascript.pro @@ -9,6 +9,8 @@ HEADERS += testtypes.h \ ../../shared/testhttpserver.h INCLUDEPATH += ../../shared +RESOURCES += qqmlecmascript.qrc + include (../../shared/util.pri) # QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage diff --git a/tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc b/tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc new file mode 100644 index 0000000000..e0e29ad4a5 --- /dev/null +++ b/tests/auto/qml/qqmlecmascript/qqmlecmascript.qrc @@ -0,0 +1,8 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> +<file>data/include.qml</file> +<file>data/include.js</file> +<file>data/js/include2.js</file> +<file>data/js/include3.js</file> +</qresource> +</RCC> diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index c68f1190dd..2550dd5473 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -6051,6 +6051,23 @@ void tst_qqmlecmascript::include() delete o; } + + // include from resources + { + QQmlComponent component(&engine, QUrl("qrc:///data/include.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test0").toInt(), 99); + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test2_1").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test3_1").toBool(), true); + + delete o; + } + } void tst_qqmlecmascript::includeRemoteSuccess() diff --git a/tests/auto/qml/qqmlincubator/tst_qqmlincubator.cpp b/tests/auto/qml/qqmlincubator/tst_qqmlincubator.cpp index 0b9872f94c..75b10ed804 100644 --- a/tests/auto/qml/qqmlincubator/tst_qqmlincubator.cpp +++ b/tests/auto/qml/qqmlincubator/tst_qqmlincubator.cpp @@ -171,10 +171,6 @@ void tst_qqmlincubator::objectDeleted() controller.incubateWhile(&b); } - // We have to cheat and manually remove it from the creator->allCreatedObjects - // otherwise we will do a double delete - QQmlIncubatorPrivate *incubatorPriv = QQmlIncubatorPrivate::get(&incubator); - incubatorPriv->creator->allCreatedObjects().pop(); delete SelfRegisteringType::me(); { diff --git a/tests/auto/qml/qqmllanguage/data/nonexistantProperty.8.errors.txt b/tests/auto/qml/qqmllanguage/data/nonexistantProperty.8.errors.txt new file mode 100644 index 0000000000..b60b59b111 --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/nonexistantProperty.8.errors.txt @@ -0,0 +1 @@ +4:24:Cannot assign to non-existent property "root" diff --git a/tests/auto/qml/qqmllanguage/data/nonexistantProperty.8.qml b/tests/auto/qml/qqmllanguage/data/nonexistantProperty.8.qml new file mode 100644 index 0000000000..86c5f3bd7d --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/nonexistantProperty.8.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 +Item { + id: root + NumberAnimation on root.opacity { duration: 1000 } +} diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 6364a8ebdd..8bc937d2bc 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -348,6 +348,7 @@ void tst_qqmllanguage::errors_data() QTest::newRow("nonexistantProperty.5") << "nonexistantProperty.5.qml" << "nonexistantProperty.5.errors.txt" << false; QTest::newRow("nonexistantProperty.6") << "nonexistantProperty.6.qml" << "nonexistantProperty.6.errors.txt" << false; QTest::newRow("nonexistantProperty.7") << "nonexistantProperty.7.qml" << "nonexistantProperty.7.errors.txt" << false; + QTest::newRow("nonexistantProperty.8") << "nonexistantProperty.8.qml" << "nonexistantProperty.8.errors.txt" << false; QTest::newRow("wrongType (string for int)") << "wrongType.1.qml" << "wrongType.1.errors.txt" << false; QTest::newRow("wrongType (int for bool)") << "wrongType.2.qml" << "wrongType.2.errors.txt" << false; diff --git a/tests/auto/quick/qquickpathview/data/flickableDelegate.qml b/tests/auto/quick/qquickpathview/data/flickableDelegate.qml new file mode 100644 index 0000000000..ed9c34161f --- /dev/null +++ b/tests/auto/quick/qquickpathview/data/flickableDelegate.qml @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +PathView { + id: pathView + objectName: "pathView" + width: 400 + height: 200 + + dragMargin: 400 + preferredHighlightBegin: 0.3 + preferredHighlightEnd: 0.3 + + model: 3 + path: Path { + startX: -pathView.width/2 + startY: pathView.height / 2 + PathLine { x: pathView.width + pathView.width/2; y: pathView.height / 2 } + } + + delegate: Flickable { + clip: true + flickableDirection: Qt.Horizontal + width: 200; height: 200 + contentWidth: 400 + contentX: 100 + Rectangle { + y: 50 + x: 50 + width: 300 + height: 100 + color: "purple" + } +Text { text: index } + MouseArea { + anchors.fill: parent + } + } +} diff --git a/tests/auto/quick/qquickpathview/data/incorrectSteal.qml b/tests/auto/quick/qquickpathview/data/nestedInFlickable.qml index bcd6923b73..bcd6923b73 100644 --- a/tests/auto/quick/qquickpathview/data/incorrectSteal.qml +++ b/tests/auto/quick/qquickpathview/data/nestedInFlickable.qml diff --git a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp index 1960775ad3..0575d8626f 100644 --- a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp +++ b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp @@ -143,8 +143,9 @@ private slots: void indexAt_itemAt(); void indexAt_itemAt_data(); void cacheItemCount(); - void incorrectSteal(); void changePathDuringRefill(); + void nestedinFlickable(); + void flickableDelegate(); }; class TestObject : public QObject @@ -2165,11 +2166,11 @@ void tst_QQuickPathView::changePathDuringRefill() testCurrentIndexChange(pathView, QStringList() << "delegateA" << "delegateB" << "delegateC"); } -void tst_QQuickPathView::incorrectSteal() +void tst_QQuickPathView::nestedinFlickable() { QScopedPointer<QQuickView> window(createView()); QQuickViewTestUtil::moveMouseAway(window.data()); - window->setSource(testFileUrl("incorrectSteal.qml")); + window->setSource(testFileUrl("nestedInFlickable.qml")); window->show(); window->requestActivate(); QVERIFY(QTest::qWaitForWindowActive(window.data())); @@ -2215,12 +2216,66 @@ void tst_QQuickPathView::incorrectSteal() QTRY_COMPARE(moveEndedSpy.count(), 1); QCOMPARE(moveStartedSpy.count(), 1); // Flickable should not handle this - QEXPECT_FAIL("", "QTBUG-37859", Abort); QCOMPARE(fflickingSpy.count(), 0); QCOMPARE(fflickStartedSpy.count(), 0); QCOMPARE(fflickEndedSpy.count(), 0); } +void tst_QQuickPathView::flickableDelegate() +{ + QScopedPointer<QQuickView> window(createView()); + QQuickViewTestUtil::moveMouseAway(window.data()); + window->setSource(testFileUrl("flickableDelegate.qml")); + window->show(); + window->requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(window.data())); + QCOMPARE(window.data(), qGuiApp->focusWindow()); + + QQuickPathView *pathview = qobject_cast<QQuickPathView*>(window->rootObject()); + QVERIFY(pathview != 0); + + QQuickFlickable *flickable = qobject_cast<QQuickFlickable*>(pathview->currentItem()); + QVERIFY(flickable != 0); + + QSignalSpy movingSpy(pathview, SIGNAL(movingChanged())); + QSignalSpy moveStartedSpy(pathview, SIGNAL(movementStarted())); + QSignalSpy moveEndedSpy(pathview, SIGNAL(movementEnded())); + + QSignalSpy fflickingSpy(flickable, SIGNAL(flickingChanged())); + QSignalSpy fflickStartedSpy(flickable, SIGNAL(flickStarted())); + QSignalSpy fflickEndedSpy(flickable, SIGNAL(flickEnded())); + + int waitInterval = 5; + + QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(23,100)); + + QTest::mouseMove(window.data(), QPoint(25,100), waitInterval); + QTest::mouseMove(window.data(), QPoint(26,100), waitInterval); + QTest::mouseMove(window.data(), QPoint(28,100), waitInterval); + QTest::mouseMove(window.data(), QPoint(31,100), waitInterval); + QTest::mouseMove(window.data(), QPoint(39,100), waitInterval); + + // first move beyond threshold does not trigger drag + QVERIFY(!flickable->isMoving()); + QVERIFY(!flickable->isDragging()); + QCOMPARE(movingSpy.count(), 0); + QCOMPARE(moveStartedSpy.count(), 0); + QCOMPARE(moveEndedSpy.count(), 0); + QCOMPARE(fflickingSpy.count(), 0); + QCOMPARE(fflickStartedSpy.count(), 0); + QCOMPARE(fflickEndedSpy.count(), 0); + + // no further moves after the initial move beyond threshold + QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(53,100)); + QTRY_COMPARE(fflickingSpy.count(), 2); + QTRY_COMPARE(fflickStartedSpy.count(), 1); + QCOMPARE(fflickEndedSpy.count(), 1); + // PathView should not handle this + QTRY_COMPARE(movingSpy.count(), 0); + QTRY_COMPARE(moveEndedSpy.count(), 0); + QCOMPARE(moveStartedSpy.count(), 0); +} + QTEST_MAIN(tst_QQuickPathView) #include "tst_qquickpathview.moc" |