diff options
author | Joona Petrell <joona.t.petrell@nokia.com> | 2011-02-15 05:36:34 (GMT) |
---|---|---|
committer | Joona Petrell <joona.t.petrell@nokia.com> | 2011-02-15 05:36:34 (GMT) |
commit | 5eb9edbd51df63fe3329e8ddc1325ed3024211ad (patch) | |
tree | e5f5ed8633385f559c16262d3a6e6d14b4578f14 /tests | |
parent | b428301a2af0a68ff40d75003ed85aafb19f03f7 (diff) | |
parent | 5f9f98ec047024fadbfdea334fbea7c357179032 (diff) | |
download | Qt-5eb9edbd51df63fe3329e8ddc1325ed3024211ad.zip Qt-5eb9edbd51df63fe3329e8ddc1325ed3024211ad.tar.gz Qt-5eb9edbd51df63fe3329e8ddc1325ed3024211ad.tar.bz2 |
Merge branch '4.7' into qtquick11
Diffstat (limited to 'tests')
105 files changed, 9744 insertions, 227 deletions
diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml new file mode 100644 index 0000000..cf5b601 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +Rectangle { + width: 500 + height: 500 + + AnimatedImage { + objectName: "anim" + anchors.centerIn: parent + asynchronous: true + opacity: status == AnimatedImage.Ready ? 1 : 0 + + Behavior on opacity { + NumberAnimation { duration: 1000 } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp b/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp index eba4239..104ee15 100644 --- a/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp +++ b/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp @@ -75,6 +75,7 @@ private slots: void sourceSize(); void sourceSizeReadOnly(); void invalidSource(); + void qtbug_16520(); private: QPixmap grabScene(QGraphicsScene *scene, int width, int height); @@ -307,6 +308,29 @@ void tst_qdeclarativeanimatedimage::invalidSource() QVERIFY(!anim->isPaused()); QCOMPARE(anim->currentFrame(), 0); QCOMPARE(anim->frameCount(), 0); + QTRY_VERIFY(anim->status() == 3); +} + +void tst_qdeclarativeanimatedimage::qtbug_16520() +{ + TestHTTPServer server(14449); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/qtbug-16520.qml")); + QTRY_VERIFY(component.isReady()); + + QDeclarativeRectangle *root = qobject_cast<QDeclarativeRectangle *>(component.create()); + QVERIFY(root); + QDeclarativeAnimatedImage *anim = root->findChild<QDeclarativeAnimatedImage*>("anim"); + + anim->setProperty("source", "http://127.0.0.1:14449/stickman.gif"); + + QTRY_VERIFY(anim->opacity() == 0); + QTRY_VERIFY(anim->opacity() == 1); + + delete anim; } QTEST_MAIN(tst_qdeclarativeanimatedimage) diff --git a/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp index 9a9d22b..d85b92a 100644 --- a/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp +++ b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp @@ -86,6 +86,8 @@ private slots: void invalidSciFile(); void pendingRemoteRequest(); void pendingRemoteRequest_data(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); private: QDeclarativeEngine engine; @@ -380,6 +382,45 @@ void tst_qdeclarativeborderimage::pendingRemoteRequest_data() QTest::newRow("sci file") << "http://localhost/none.sci"; } +void tst_qdeclarativeborderimage::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; BorderImage { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; BorderImage { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_qdeclarativeborderimage::testQtQuick11Attributes_data() +{ + QTest::addColumn<QString>("code"); + QTest::addColumn<QString>("warning"); + QTest::addColumn<QString>("error"); + + QTest::newRow("mirror") << "mirror: true" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"BorderImage.mirror\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("cache") << "cache: true" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"BorderImage.cache\" is not available in QtQuick 1.0.\n"; +} + QTEST_MAIN(tst_qdeclarativeborderimage) #include "tst_qdeclarativeborderimage.moc" diff --git a/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp index e3f0349..c182893 100644 --- a/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp +++ b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp @@ -76,7 +76,7 @@ void tst_QDeclarativeDebugClient::initTestCase() QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!"); QDeclarativeDebugHelper::enableDebugging(); - QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3770..."); + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 13770..."); new QDeclarativeEngine(this); m_conn = new QDeclarativeDebugConnection(this); @@ -84,7 +84,7 @@ void tst_QDeclarativeDebugClient::initTestCase() QDeclarativeDebugTestClient client("tst_QDeclarativeDebugClient::handshake()", m_conn); QDeclarativeDebugTestService service("tst_QDeclarativeDebugClient::handshake()"); - m_conn->connectToHost("127.0.0.1", 3770); + m_conn->connectToHost("127.0.0.1", 13770); QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Connection established"); bool ok = m_conn->waitForConnected(); @@ -149,7 +149,7 @@ int main(int argc, char *argv[]) char **_argv = new char*[_argc]; for (int i = 0; i < argc; ++i) _argv[i] = argv[i]; - _argv[_argc - 1] = "-qmljsdebugger=port:3770"; + _argv[_argc - 1] = "-qmljsdebugger=port:13770"; QApplication app(_argc, _argv); tst_QDeclarativeDebugClient tc; diff --git a/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp index a7e5f20..0911a83 100644 --- a/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp +++ b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp @@ -79,11 +79,11 @@ void tst_QDeclarativeDebugService::initTestCase() QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!"); QDeclarativeDebugHelper::enableDebugging(); - QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 3769..."); + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Waiting for connection on port 13769..."); new QDeclarativeEngine(this); m_conn = new QDeclarativeDebugConnection(this); - m_conn->connectToHost("127.0.0.1", 3769); + m_conn->connectToHost("127.0.0.1", 13769); QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugServer: Connection established"); bool ok = m_conn->waitForConnected(); @@ -193,7 +193,7 @@ int main(int argc, char *argv[]) char **_argv = new char*[_argc]; for (int i = 0; i < argc; ++i) _argv[i] = argv[i]; - _argv[_argc - 1] = "-qmljsdebugger=port:3769"; + _argv[_argc - 1] = "-qmljsdebugger=port:13769"; QApplication app(_argc, _argv); tst_QDeclarativeDebugService tc; diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml new file mode 100644 index 0000000..49293ed --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + onSignalWithUnknownType: variantMethod(arg); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp index d7f0f42..7e63bd5 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp @@ -125,6 +125,8 @@ void registerTypes() qmlRegisterExtendedType<QWidget,QWidgetDeclarativeUI>("Qt.test",1,0,"QWidget"); qmlRegisterType<QPlainTextEdit>("Qt.test",1,0,"QPlainTextEdit"); + + qRegisterMetaType<MyQmlObject::MyType>("MyQmlObject::MyType"); } #include "testtypes.moc" diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h index fb54a54..081cc4c 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h @@ -152,6 +152,11 @@ public: MyQmlObject *myinvokableObject; Q_INVOKABLE MyQmlObject *returnme() { return this; } + struct MyType { + int value; + }; + QVariant variant() const { return m_variant; } + signals: void basicSignal(); void argumentSignal(int a, QString b, qreal c); @@ -159,6 +164,7 @@ signals: void objectChanged(); void anotherBasicSignal(); void thirdBasicSignal(); + void signalWithUnknownType(const MyQmlObject::MyType &arg); public slots: void deleteMe() { delete this; } @@ -166,6 +172,7 @@ public slots: void method(int a) { if(a == 163) m_methodIntCalled = true; } void setString(const QString &s) { m_string = s; } void myinvokable(MyQmlObject *o) { myinvokableObject = o; } + void variantMethod(const QVariant &v) { m_variant = v; } private: friend class tst_qdeclarativeecmascript; @@ -178,6 +185,7 @@ private: int m_value; int m_resetProperty; QRegExp m_regExp; + QVariant m_variant; }; QML_DECLARE_TYPEINFO(MyQmlObject, QML_HAS_ATTACHED_PROPERTIES) @@ -898,6 +906,7 @@ QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered) QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered) QML_DECLARE_TYPE(MyRevisionedClass) QML_DECLARE_TYPE(MyRevisionedSubclass) +Q_DECLARE_METATYPE(MyQmlObject::MyType) void registerTypes(); diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index f66cd0b..40b0e1b 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -50,6 +50,7 @@ #include <QtCore/qnumeric.h> #include <private/qdeclarativeengine_p.h> #include <private/qdeclarativeglobalscriptclass_p.h> +#include <private/qscriptdeclarativeclass_p.h> #include "testtypes.h" #include "testhttpserver.h" #include "../../../shared/util.h" @@ -142,6 +143,7 @@ private slots: void compiled(); void numberAssignment(); void propertySplicing(); + void signalWithUnknownTypes(); void bug1(); void bug2(); @@ -173,6 +175,7 @@ private slots: void aliasBindingsAssignCorrectly(); void aliasBindingsOverrideTarget(); void aliasWritesOverrideBindings(); + void pushCleanContext(); void include(); @@ -2340,6 +2343,26 @@ void tst_qdeclarativeecmascript::propertySplicing() delete object; } +// QTBUG-16683 +void tst_qdeclarativeecmascript::signalWithUnknownTypes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("signalWithUnknownTypes.qml")); + + MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create()); + QVERIFY(object != 0); + + MyQmlObject::MyType type; + type.value = 0x8971123; + emit object->signalWithUnknownType(type); + + MyQmlObject::MyType result = qvariant_cast<MyQmlObject::MyType>(object->variant()); + + QCOMPARE(result.value, type.value); + + + delete object; +} + // Test that assigning a null object works // Regressed with: df1788b4dbbb2826ae63f26bdf166342595343f4 void tst_qdeclarativeecmascript::nullObjectBinding() @@ -2994,6 +3017,44 @@ void tst_qdeclarativeecmascript::revision() } } +// Test for QScriptDeclarativeClass::pushCleanContext() +void tst_qdeclarativeecmascript::pushCleanContext() +{ + QScriptEngine engine; + engine.globalObject().setProperty("a", 6); + QCOMPARE(engine.evaluate("a").toInt32(), 6); + + // First confirm pushContext() behaves as we expect + QScriptValue object = engine.newObject(); + object.setProperty("a", 15); + QScriptContext *context1 = engine.pushContext(); + context1->pushScope(object); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + + QScriptContext *context2 = engine.pushContext(); + Q_UNUSED(context2); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + QScriptValue func1 = engine.evaluate("(function() { return a; })"); + + // Now check that pushCleanContext() works + QScriptDeclarativeClass::pushCleanContext(&engine); + QCOMPARE(engine.evaluate("a").toInt32(), 6); + QScriptValue func2 = engine.evaluate("(function() { return a; })"); + + engine.popContext(); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + + engine.popContext(); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + + engine.popContext(); + QCOMPARE(engine.evaluate("a").toInt32(), 6); + + // Check that function objects created in these contexts work + QCOMPARE(func1.call().toInt32(), 15); + QCOMPARE(func2.call().toInt32(), 6); +} + QTEST_MAIN(tst_qdeclarativeecmascript) #include "tst_qdeclarativeecmascript.moc" diff --git a/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml b/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml new file mode 100644 index 0000000..6ea81b2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml @@ -0,0 +1,21 @@ +import QtQuick 1.1 + +Rectangle { + width: 400 + height: 400 + color: "gray" + + Flickable { + id: flick + objectName: "flick" + anchors.fill: parent + contentWidth: 800 + contentHeight: 800 + + Rectangle { + width: flick.contentWidth + height: flick.contentHeight + color: "red" + } + } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp b/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp index ae1e99e..f4bec8f 100644 --- a/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp +++ b/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp @@ -42,6 +42,7 @@ #include <QtTest/QSignalSpy> #include <QtDeclarative/qdeclarativeengine.h> #include <QtDeclarative/qdeclarativecomponent.h> +#include <QtDeclarative/qdeclarativeview.h> #include <private/qdeclarativeflickable_p.h> #include <private/qdeclarativevaluetype_p.h> #include <QtGui/qgraphicswidget.h> @@ -74,6 +75,7 @@ private slots: void returnToBounds(); void testQtQuick11Attributes(); void testQtQuick11Attributes_data(); + void wheel(); private: QDeclarativeEngine engine; @@ -373,6 +375,43 @@ void tst_qdeclarativeflickable::testQtQuick11Attributes_data() } +void tst_qdeclarativeflickable::wheel() +{ + QDeclarativeView *canvas = new QDeclarativeView; + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/wheel.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeFlickable *flick = canvas->rootObject()->findChild<QDeclarativeFlickable*>("flick"); + QVERIFY(flick != 0); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneWheelEvent event(QEvent::GraphicsSceneWheel); + event.setScenePos(QPointF(200, 200)); + event.setDelta(-120); + event.setOrientation(Qt::Vertical); + event.setAccepted(false); + QApplication::sendEvent(scene, &event); + + QTRY_VERIFY(flick->contentY() > 0); + QVERIFY(flick->contentX() == 0); + + flick->setContentY(0); + QVERIFY(flick->contentY() == 0); + + event.setScenePos(QPointF(200, 200)); + event.setDelta(-120); + event.setOrientation(Qt::Horizontal); + event.setAccepted(false); + QApplication::sendEvent(scene, &event); + + QTRY_VERIFY(flick->contentX() > 0); + QVERIFY(flick->contentY() == 0); + + delete canvas; +} + template<typename T> T *tst_qdeclarativeflickable::findItem(QGraphicsObject *parent, const QString &objectName) diff --git a/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml b/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml new file mode 100644 index 0000000..d527e9d --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +GridView { + id: view + width: 240; height: 320 + + property variant addedDelegates: [] + property int removedDelegateCount + + model: testModel + + cellWidth: delegateWidth; cellHeight: delegateHeight + + delegate: Rectangle { + width: delegateWidth; height: delegateHeight + border.width: 1 + GridView.onAdd: { + var obj = GridView.view.addedDelegates + obj.push(model.name) + GridView.view.addedDelegates = obj + } + GridView.onRemove: { + view.removedDelegateCount += 1 + } + } +} + diff --git a/tests/auto/declarative/qdeclarativegridview/data/footer.qml b/tests/auto/declarative/qdeclarativegridview/data/footer.qml index ad69a25..b41e2ac 100644 --- a/tests/auto/declarative/qdeclarativegridview/data/footer.qml +++ b/tests/auto/declarative/qdeclarativegridview/data/footer.qml @@ -1,6 +1,9 @@ import QtQuick 1.0 Rectangle { + function changeFooter() { + grid.footer = footer2 + } width: 240 height: 320 color: "#ffffff" @@ -29,4 +32,9 @@ Rectangle { delegate: myDelegate footer: Text { objectName: "footer"; text: "Footer"; height: 30 } } + + Component { + id: footer2 + Text { objectName: "footer2"; text: "Footer 2"; height: 20 } + } } diff --git a/tests/auto/declarative/qdeclarativegridview/data/header.qml b/tests/auto/declarative/qdeclarativegridview/data/header.qml index 99baacd..f39da55 100644 --- a/tests/auto/declarative/qdeclarativegridview/data/header.qml +++ b/tests/auto/declarative/qdeclarativegridview/data/header.qml @@ -1,6 +1,9 @@ import QtQuick 1.0 Rectangle { + function changeHeader() { + grid.header = header2 + } width: 240 height: 320 color: "#ffffff" @@ -29,4 +32,9 @@ Rectangle { delegate: myDelegate header: Text { objectName: "header"; text: "Header"; height: 30 } } + + Component { + id: header2 + Text { objectName: "header2"; text: "Header 2"; height: 20 } + } } diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp index a6a8b90..79189a7 100644 --- a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp +++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp @@ -86,6 +86,10 @@ private slots: void footer(); void header(); void indexAt(); + void onAdd(); + void onAdd_data(); + void onRemove(); + void onRemove_data(); void testQtQuick11Attributes(); void testQtQuick11Attributes_data(); @@ -131,6 +135,13 @@ public: emit endInsertRows(); } + void addItems(const QList<QPair<QString, QString> > &items) { + emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1); + for (int i=0; i<items.count(); i++) + list.append(QPair<QString,QString>(items[i].first, items[i].second)); + emit endInsertRows(); + } + void insertItem(int index, const QString &name, const QString &number) { emit beginInsertRows(QModelIndex(), index, index); list.insert(index, QPair<QString,QString>(name, number)); @@ -143,6 +154,13 @@ public: emit endRemoveRows(); } + void removeItems(int index, int count) { + emit beginRemoveRows(QModelIndex(), index, index+count-1); + while (count--) + list.removeAt(index); + emit endRemoveRows(); + } + void moveItem(int from, int to) { emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); list.move(from, to); @@ -1370,12 +1388,27 @@ void tst_QDeclarativeGridView::footer() QVERIFY(footer); QCOMPARE(footer->y(), 180.0); + QCOMPARE(footer->height(), 30.0); model.removeItem(2); QTRY_COMPARE(footer->y(), 120.0); model.clear(); QTRY_COMPARE(footer->y(), 0.0); + + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter"); + + footer = findItem<QDeclarativeText>(contentItem, "footer"); + QVERIFY(!footer); + footer = findItem<QDeclarativeText>(contentItem, "footer2"); + QVERIFY(footer); + + QCOMPARE(footer->y(), 600.0); + QCOMPARE(footer->height(), 20.0); + QCOMPARE(gridview->contentY(), 0.0); } void tst_QDeclarativeGridView::header() @@ -1402,6 +1435,7 @@ void tst_QDeclarativeGridView::header() QVERIFY(header); QCOMPARE(header->y(), 0.0); + QCOMPARE(header->height(), 30.0); QCOMPARE(gridview->contentY(), 0.0); QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", 0); @@ -1410,6 +1444,20 @@ void tst_QDeclarativeGridView::header() model.clear(); QTRY_COMPARE(header->y(), 0.0); + + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader"); + + header = findItem<QDeclarativeText>(contentItem, "header"); + QVERIFY(!header); + header = findItem<QDeclarativeText>(contentItem, "header2"); + QVERIFY(header); + + QCOMPARE(header->y(), 10.0); + QCOMPARE(header->height(), 20.0); + QCOMPARE(gridview->contentY(), 10.0); } void tst_QDeclarativeGridView::indexAt() @@ -1449,6 +1497,117 @@ void tst_QDeclarativeGridView::indexAt() delete canvas; } +void tst_QDeclarativeGridView::onAdd() +{ + QFETCH(int, initialItemCount); + QFETCH(int, itemsToAdd); + + const int delegateWidth = 50; + const int delegateHeight = 100; + TestModel model; + QDeclarativeView *canvas = createView(); + canvas->setFixedSize(5 * delegateWidth, 5 * delegateHeight); // just ensure all items fit + + // these initial items should not trigger GridView.onAdd + for (int i=0; i<initialItemCount; i++) + model.addItem("dummy value", "dummy value"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateWidth", delegateWidth); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + + QObject *object = canvas->rootObject(); + object->setProperty("width", canvas->width()); + object->setProperty("height", canvas->height()); + qApp->processEvents(); + + QList<QPair<QString, QString> > items; + for (int i=0; i<itemsToAdd; i++) + items << qMakePair(QString("value %1").arg(i), QString::number(i)); + model.addItems(items); + + qApp->processEvents(); + + QVariantList result = object->property("addedDelegates").toList(); + QCOMPARE(result.count(), items.count()); + for (int i=0; i<items.count(); i++) + QCOMPARE(result[i].toString(), items[i].first); + + delete canvas; +} + +void tst_QDeclarativeGridView::onAdd_data() +{ + QTest::addColumn<int>("initialItemCount"); + QTest::addColumn<int>("itemsToAdd"); + + QTest::newRow("0, add 1") << 0 << 1; + QTest::newRow("0, add 2") << 0 << 2; + QTest::newRow("0, add 10") << 0 << 10; + + QTest::newRow("1, add 1") << 1 << 1; + QTest::newRow("1, add 2") << 1 << 2; + QTest::newRow("1, add 10") << 1 << 10; + + QTest::newRow("5, add 1") << 5 << 1; + QTest::newRow("5, add 2") << 5 << 2; + QTest::newRow("5, add 10") << 5 << 10; +} + +void tst_QDeclarativeGridView::onRemove() +{ + QFETCH(int, initialItemCount); + QFETCH(int, indexToRemove); + QFETCH(int, removeCount); + + const int delegateWidth = 50; + const int delegateHeight = 100; + TestModel model; + for (int i=0; i<initialItemCount; i++) + model.addItem(QString("value %1").arg(i), "dummy value"); + + QDeclarativeView *canvas = createView(); + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateWidth", delegateWidth); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + QObject *object = canvas->rootObject(); + + qApp->processEvents(); + + model.removeItems(indexToRemove, removeCount); + qApp->processEvents(); + QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount)); + + delete canvas; +} + +void tst_QDeclarativeGridView::onRemove_data() +{ + QTest::addColumn<int>("initialItemCount"); + QTest::addColumn<int>("indexToRemove"); + QTest::addColumn<int>("removeCount"); + + QTest::newRow("remove first") << 1 << 0 << 1; + QTest::newRow("two items, remove first") << 2 << 0 << 1; + QTest::newRow("two items, remove last") << 2 << 1 << 1; + QTest::newRow("two items, remove all") << 2 << 0 << 2; + + QTest::newRow("four items, remove first") << 4 << 0 << 1; + QTest::newRow("four items, remove 0-2") << 4 << 0 << 2; + QTest::newRow("four items, remove 1-3") << 4 << 1 << 2; + QTest::newRow("four items, remove 2-4") << 4 << 2 << 2; + QTest::newRow("four items, remove last") << 4 << 3 << 1; + QTest::newRow("four items, remove all") << 4 << 0 << 4; + + QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8; + QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5; + QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6; +} + void tst_QDeclarativeGridView::testQtQuick11Attributes() { QFETCH(QString, code); diff --git a/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp b/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp index 5b214e6..6d35332 100644 --- a/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp +++ b/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp @@ -180,6 +180,10 @@ void tst_qdeclarativeimageprovider::fillRequestTestsData(const QString &id) << "image://test/" + fileName << fileName << "" << QSize(100,100) << ""; fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " simple test with capitalization"))//As it's a URL, should make no difference + << "image://Test/" + fileName << fileName << "" << QSize(100,100) << ""; + + fileName = newImageFileName(); QTest::newRow(QTest::toString(id + " url with no id")) << "image://test/" + fileName << "" + fileName << "" << QSize(100,100) << ""; diff --git a/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml b/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml new file mode 100644 index 0000000..5ca1a45 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +ListView { + id: view + width: 240; height: 320 + + property variant addedDelegates: [] + property int removedDelegateCount + + model: testModel + + delegate: Rectangle { + width: 200; height: delegateHeight + border.width: 1 + ListView.onAdd: { + var obj = ListView.view.addedDelegates + obj.push(model.name) + ListView.view.addedDelegates = obj + } + ListView.onRemove: { + view.removedDelegateCount += 1 + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/footer.qml b/tests/auto/declarative/qdeclarativelistview/data/footer.qml index 4cbd33b..33e04f1 100644 --- a/tests/auto/declarative/qdeclarativelistview/data/footer.qml +++ b/tests/auto/declarative/qdeclarativelistview/data/footer.qml @@ -1,6 +1,9 @@ import QtQuick 1.0 Rectangle { + function changeFooter() { + list.footer = footer2 + } width: 240 height: 320 color: "#ffffff" @@ -27,4 +30,9 @@ Rectangle { delegate: myDelegate footer: Text { objectName: "footer"; text: "Footer"; height: 30 } } + + Component { + id: footer2 + Text { objectName: "footer2"; text: "Footer 2"; height: 20 } + } } diff --git a/tests/auto/declarative/qdeclarativelistview/data/header.qml b/tests/auto/declarative/qdeclarativelistview/data/header.qml index 6da996e..38cdd6e 100644 --- a/tests/auto/declarative/qdeclarativelistview/data/header.qml +++ b/tests/auto/declarative/qdeclarativelistview/data/header.qml @@ -1,6 +1,9 @@ import QtQuick 1.0 Rectangle { + function changeHeader() { + list.header = header2 + } width: 240 height: 320 color: "#ffffff" @@ -26,6 +29,10 @@ Rectangle { snapMode: ListView.SnapToItem model: testModel delegate: myDelegate - header: Text { objectName: "header"; text: "Header"; height: 10 } + header: Text { objectName: "header"; text: "Header"; height: 20 } + } + Component { + id: header2 + Text { objectName: "header2"; text: "Header 2"; height: 10 } } } diff --git a/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml b/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml new file mode 100644 index 0000000..35a398b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml @@ -0,0 +1,63 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Item { + id: wrapper + objectName: "wrapper" + height: 20; + width: 240 + Rectangle { + height: 20 + width: parent.width + color: wrapper.ListView.isCurrentItem ? "lightsteelblue" : "white" + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 100 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + objectName: "nextSection" + x: 150 + text: wrapper.ListView.nextSection + } + Text { + x: 200 + text: wrapper.y + } + } + } + } + ] + ListView { + id: list + objectName: "list" + width: 240 + height: 320 + model: testModel + delegate: myDelegate + section.property: "number" + section.delegate: Rectangle { + objectName: "sect_" + section + color: "#99bb99" + height: 20 + width: list.width + Text { text: section } + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp index 4fff071..f358625 100644 --- a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp +++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp @@ -90,6 +90,7 @@ private slots: void enforceRange(); void spacing(); void sections(); + void sectionsDelegate(); void cacheBuffer(); void positionViewAtIndex(); void resetModel(); @@ -108,6 +109,10 @@ private slots: void QTBUG_16037(); void indexAt(); void incrementalModel(); + void onAdd(); + void onAdd_data(); + void onRemove(); + void onRemove_data(); void testQtQuick11Attributes(); void testQtQuick11Attributes_data(); @@ -296,6 +301,13 @@ public: emit endInsertRows(); } + void addItems(const QList<QPair<QString, QString> > &items) { + emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1); + for (int i=0; i<items.count(); i++) + list.append(QPair<QString,QString>(items[i].first, items[i].second)); + emit endInsertRows(); + } + void insertItem(int index, const QString &name, const QString &number) { emit beginInsertRows(QModelIndex(), index, index); list.insert(index, QPair<QString,QString>(name, number)); @@ -1017,6 +1029,58 @@ void tst_QDeclarativeListView::sections() delete canvas; } +void tst_QDeclarativeListView::sectionsDelegate() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i/5)); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-sections_delegate.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem<QDeclarativeListView>(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20 + ((i+5)/5) * 20)); + QDeclarativeText *next = findItem<QDeclarativeText>(item, "nextSection"); + QCOMPARE(next->text().toInt(), (i+1)/5); + } + + for (int i = 0; i < 3; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "sect_" + QString::number(i)); + QVERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20*6)); + } + + model.modifyItem(0, "One", "aaa"); + model.modifyItem(1, "Two", "aaa"); + model.modifyItem(2, "Three", "aaa"); + model.modifyItem(3, "Four", "aaa"); + model.modifyItem(4, "Five", "aaa"); + + for (int i = 0; i < 3; ++i) { + QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, + "sect_" + (i == 0 ? QString("aaa") : QString::number(i))); + QVERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20*6)); + } + + delete canvas; +} + void tst_QDeclarativeListView::currentIndex() { TestModel model; @@ -1612,7 +1676,7 @@ void tst_QDeclarativeListView::QTBUG_9791() // Confirm items positioned correctly int itemCount = findItems<QDeclarativeItem>(contentItem, "wrapper").count(); - QVERIFY(itemCount == 3); + QCOMPARE(itemCount, 3); for (int i = 0; i < itemCount; ++i) { QDeclarativeItem *item = findItem<QDeclarativeItem>(contentItem, "wrapper", i); @@ -1736,12 +1800,27 @@ void tst_QDeclarativeListView::header() QDeclarativeText *header = findItem<QDeclarativeText>(contentItem, "header"); QVERIFY(header); QCOMPARE(header->y(), 0.0); + QCOMPARE(header->height(), 20.0); QCOMPARE(listview->contentY(), 0.0); model.clear(); QTRY_COMPARE(header->y(), 0.0); + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader"); + + header = findItem<QDeclarativeText>(contentItem, "header"); + QVERIFY(!header); + header = findItem<QDeclarativeText>(contentItem, "header2"); + QVERIFY(header); + + QCOMPARE(header->y(), 10.0); + QCOMPARE(header->height(), 10.0); + QCOMPARE(listview->contentY(), 10.0); + delete canvas; } { @@ -1796,6 +1875,7 @@ void tst_QDeclarativeListView::footer() QDeclarativeText *footer = findItem<QDeclarativeText>(contentItem, "footer"); QVERIFY(footer); QCOMPARE(footer->y(), 60.0); + QCOMPARE(footer->height(), 30.0); model.removeItem(1); QTRY_COMPARE(footer->y(), 40.0); @@ -1803,6 +1883,20 @@ void tst_QDeclarativeListView::footer() model.clear(); QTRY_COMPARE(footer->y(), 0.0); + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter"); + + footer = findItem<QDeclarativeText>(contentItem, "footer"); + QVERIFY(!footer); + footer = findItem<QDeclarativeText>(contentItem, "footer2"); + QVERIFY(footer); + + QCOMPARE(footer->y(), 600.0); + QCOMPARE(footer->height(), 20.0); + QCOMPARE(listview->contentY(), 0.0); + delete canvas; } @@ -2059,6 +2153,113 @@ void tst_QDeclarativeListView::incrementalModel() delete canvas; } +void tst_QDeclarativeListView::onAdd() +{ + QFETCH(int, initialItemCount); + QFETCH(int, itemsToAdd); + + const int delegateHeight = 10; + TestModel2 model; + + // these initial items should not trigger ListView.onAdd + for (int i=0; i<initialItemCount; i++) + model.addItem("dummy value", "dummy value"); + + QDeclarativeView *canvas = createView(); + canvas->setFixedSize(200, delegateHeight * (initialItemCount + itemsToAdd)); + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + + QObject *object = canvas->rootObject(); + object->setProperty("width", canvas->width()); + object->setProperty("height", canvas->height()); + qApp->processEvents(); + + QList<QPair<QString, QString> > items; + for (int i=0; i<itemsToAdd; i++) + items << qMakePair(QString("value %1").arg(i), QString::number(i)); + model.addItems(items); + + qApp->processEvents(); + + QVariantList result = object->property("addedDelegates").toList(); + QCOMPARE(result.count(), items.count()); + for (int i=0; i<items.count(); i++) + QCOMPARE(result[i].toString(), items[i].first); + + delete canvas; +} + +void tst_QDeclarativeListView::onAdd_data() +{ + QTest::addColumn<int>("initialItemCount"); + QTest::addColumn<int>("itemsToAdd"); + + QTest::newRow("0, add 1") << 0 << 1; + QTest::newRow("0, add 2") << 0 << 2; + QTest::newRow("0, add 10") << 0 << 10; + + QTest::newRow("1, add 1") << 1 << 1; + QTest::newRow("1, add 2") << 1 << 2; + QTest::newRow("1, add 10") << 1 << 10; + + QTest::newRow("5, add 1") << 5 << 1; + QTest::newRow("5, add 2") << 5 << 2; + QTest::newRow("5, add 10") << 5 << 10; +} + +void tst_QDeclarativeListView::onRemove() +{ + QFETCH(int, initialItemCount); + QFETCH(int, indexToRemove); + QFETCH(int, removeCount); + + const int delegateHeight = 10; + TestModel2 model; + for (int i=0; i<initialItemCount; i++) + model.addItem(QString("value %1").arg(i), "dummy value"); + + QDeclarativeView *canvas = createView(); + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + QObject *object = canvas->rootObject(); + + qApp->processEvents(); + + model.removeItems(indexToRemove, removeCount); + qApp->processEvents(); + QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount)); + + delete canvas; +} + +void tst_QDeclarativeListView::onRemove_data() +{ + QTest::addColumn<int>("initialItemCount"); + QTest::addColumn<int>("indexToRemove"); + QTest::addColumn<int>("removeCount"); + + QTest::newRow("remove first") << 1 << 0 << 1; + QTest::newRow("two items, remove first") << 2 << 0 << 1; + QTest::newRow("two items, remove last") << 2 << 1 << 1; + QTest::newRow("two items, remove all") << 2 << 0 << 2; + + QTest::newRow("four items, remove first") << 4 << 0 << 1; + QTest::newRow("four items, remove 0-2") << 4 << 0 << 2; + QTest::newRow("four items, remove 1-3") << 4 << 1 << 2; + QTest::newRow("four items, remove 2-4") << 4 << 2 << 2; + QTest::newRow("four items, remove last") << 4 << 3 << 1; + QTest::newRow("four items, remove all") << 4 << 0 << 4; + + QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8; + QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5; + QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6; +} + void tst_QDeclarativeListView::testQtQuick11Attributes() { QFETCH(QString, code); diff --git a/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml new file mode 100644 index 0000000..8a49733 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml @@ -0,0 +1,18 @@ +import QtQuick 1.1 + +Rectangle { + property real loaderWidth: loader.width + property real loaderHeight: loader.height + width: 200 + height: 200 + + Loader { + id: loader + sourceComponent: Item { + property real iwidth: 32 + property real iheight: 32 + width: iwidth + height: iheight + } + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp index 42746e8..f5218c7 100644 --- a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp +++ b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp @@ -91,6 +91,7 @@ private slots: void creationContext(); void QTBUG_16928(); void implicitSize(); + void QTBUG_17114(); private: QDeclarativeEngine engine; @@ -619,6 +620,18 @@ void tst_QDeclarativeLoader::implicitSize() delete item; } +void tst_QDeclarativeLoader::QTBUG_17114() +{ + QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_17114.qml")); + QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create()); + QVERIFY(item); + + QCOMPARE(item->property("loaderWidth").toReal(), 32.); + QCOMPARE(item->property("loaderHeight").toReal(), 32.); + + delete item; +} + QTEST_MAIN(tst_QDeclarativeLoader) #include "tst_qdeclarativeloader.moc" diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml new file mode 100644 index 0000000..70b2bfd --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml @@ -0,0 +1,21 @@ +import com.nokia.AutoTestQmlMixedPluginType 1.5 +import QtQuick 1.0 + +Item { + property bool test: false + property bool test2: false + + Bar { + id: bar + } + + Foo { + id: foo + } + + Component.onCompleted: { + test = (bar.value == 16); + test2 = (foo.value == 89); + } +} + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml new file mode 100644 index 0000000..da6ff46 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml @@ -0,0 +1,13 @@ +import com.nokia.AutoTestQmlMixedPluginType 1.0 +import QtQuick 1.0 + +Item { + property bool test: false + Bar { + id: bar + } + + Component.onCompleted: { + test = (bar.value == 16); + } +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml new file mode 100644 index 0000000..a9e28e5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml @@ -0,0 +1,3 @@ +import com.nokia.AutoTestPluginWithQmlFile 1.0 + +MyQmlFile {} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt new file mode 100644 index 0000000..a40c1c8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt @@ -0,0 +1 @@ +1:1:module "com.nokia.AutoTestQmlVersionPluginType" version 1.9 is not installed diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml new file mode 100644 index 0000000..59fd084 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml @@ -0,0 +1,5 @@ +import com.nokia.AutoTestQmlVersionPluginType 1.9 +import QtQuick 1.0 + +QtObject { +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt new file mode 100644 index 0000000..2634223 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt @@ -0,0 +1 @@ +1:1:module "com.nokia.AutoTestQmlVersionPluginType" version 1.1 is not installed diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml new file mode 100644 index 0000000..2065c07 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml @@ -0,0 +1,6 @@ +import com.nokia.AutoTestQmlVersionPluginType 1.1 +import QtQuick 1.0 + +QtObject { +} + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml new file mode 100644 index 0000000..cc322bf --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml @@ -0,0 +1,3 @@ +import com.nokia.AutoTestQmlPluginType 2.0 + +MyPluginType { valueOnlyIn2: 123 } diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml new file mode 100644 index 0000000..c08160a --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml @@ -0,0 +1,3 @@ +import com.nokia.AutoTestQmlPluginType 2.1 + +MyPluginType { valueOnlyIn2: 123 } diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml new file mode 100644 index 0000000..18dcd26 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Item {}
\ No newline at end of file diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir new file mode 100644 index 0000000..858ba14 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir @@ -0,0 +1,3 @@ +MyQmlFile 1.0 MyQmlFile.qml +plugin pluginWithQmlFile + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml new file mode 100644 index 0000000..ce51cbd --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + property int value: 89 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir new file mode 100644 index 0000000..065dc3b --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir @@ -0,0 +1,2 @@ +plugin pluginMixed +Foo 1.5 Foo.qml diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir new file mode 100644 index 0000000..0a8b5d4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir @@ -0,0 +1 @@ +plugin plugin diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir new file mode 100644 index 0000000..0a8b5d4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir @@ -0,0 +1 @@ +plugin plugin diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir new file mode 100644 index 0000000..640967f --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir @@ -0,0 +1 @@ +plugin pluginVersion diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml new file mode 100644 index 0000000..49613aa --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Item {} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml new file mode 100644 index 0000000..f19a336 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Item {} + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir new file mode 100644 index 0000000..167bb10 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir @@ -0,0 +1,3 @@ +ComponentA 1.0 ComponentA.qml +ComponentB 1.0 ComponentB.qml + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro new file mode 100644 index 0000000..661675a --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlPluginType.2.1 + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp new file mode 100644 index 0000000..1ae2bd4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QStringList> +#include <QtDeclarative/qdeclarativeextensionplugin.h> +#include <QtDeclarative/qdeclarative.h> +#include <QDebug> + +class MyPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue) + Q_PROPERTY(int valueOnlyIn2 READ value WRITE setValue) + +public: + MyPluginType(QObject *parent=0) : QObject(parent) + { + qWarning("import2.1 worked"); + } + + int value() const { return v; } + void setValue(int i) { v = i; } + +private: + int v; +}; + + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyPlugin() + { + qWarning("plugin2.1 created"); + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlPluginType"); + qmlRegisterType<MyPluginType>(uri, 2, 1, "MyPluginType"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro new file mode 100644 index 0000000..d254642 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlPluginType.2 + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp new file mode 100644 index 0000000..6bd8542 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QStringList> +#include <QtDeclarative/qdeclarativeextensionplugin.h> +#include <QtDeclarative/qdeclarative.h> +#include <QDebug> + +class MyPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue) + Q_PROPERTY(int valueOnlyIn2 READ value WRITE setValue) + +public: + MyPluginType(QObject *parent=0) : QObject(parent) + { + qWarning("import2 worked"); + } + + int value() const { return v; } + void setValue(int i) { v = i; } + +private: + int v; +}; + + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyPlugin() + { + qWarning("plugin2 created"); + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlPluginType"); + qmlRegisterType<MyPluginType>(uri, 2, 0, "MyPluginType"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp new file mode 100644 index 0000000..c7796e2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QStringList> +#include <QtDeclarative/qdeclarativeextensionplugin.h> +#include <QtDeclarative/qdeclarative.h> +#include <QDebug> + +class BarPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value); + +public: + int value() const { return 16; } +}; + + +class MyMixedPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyMixedPlugin() + { + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlMixedPluginType"); + qmlRegisterType<BarPluginType>(uri, 1, 0, "Bar"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyMixedPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro new file mode 100644 index 0000000..9766003 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlMixedPluginType + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp new file mode 100644 index 0000000..27a6341 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QStringList> +#include <QtDeclarative/qdeclarativeextensionplugin.h> +#include <QtDeclarative/qdeclarative.h> +#include <QDebug> + +class FloorPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value); + +public: + int value() const { return 16; } +}; + + +class MyMixedPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyMixedPlugin() + { + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlVersionPluginType"); + qmlRegisterType<FloorPluginType>(uri, 1, 4, "Floor"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyMixedPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro new file mode 100644 index 0000000..70a38b9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlVersionPluginType + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp new file mode 100644 index 0000000..20e2d80 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QStringList> +#include <QtDeclarative/qdeclarativeextensionplugin.h> +#include <QtDeclarative/qdeclarative.h> +#include <QDebug> + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestPluginWithQmlFile"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro new file mode 100644 index 0000000..aa9c95c --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestPluginWithQmlFile + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro index 221e465..6e72d98 100644 --- a/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro +++ b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro @@ -1,6 +1,6 @@ QT = core TEMPLATE = subdirs -SUBDIRS = plugin pluginWrongCase +SUBDIRS = plugin plugin.2 plugin.2.1 pluginWrongCase pluginWithQmlFile pluginMixed pluginVersion tst_qdeclarativemoduleplugin_pro.depends += plugin SUBDIRS += tst_qdeclarativemoduleplugin.pro diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp index 96ec21b..dc104e2 100644 --- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp +++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp @@ -44,6 +44,13 @@ #include <QtDeclarative/qdeclarativecomponent.h> #include <QDebug> +#include "../shared/testhttpserver.h" +#include "../../../shared/util.h" + +#define SERVER_ADDR "http://127.0.0.1:14450" +#define SERVER_PORT 14450 + + class tst_qdeclarativemoduleplugin : public QObject { Q_OBJECT @@ -54,7 +61,15 @@ public: private slots: void importsPlugin(); + void importsPlugin2(); + void importsPlugin21(); + void importsMixedQmlCppPlugin(); void incorrectPluginCase(); + void importPluginWithQmlFile(); + void remoteImportWithQuotedUrl(); + void remoteImportWithUnquotedUri(); + void versionNotInstalled(); + void versionNotInstalled_data(); }; #ifdef Q_OS_SYMBIAN @@ -121,6 +136,38 @@ void tst_qdeclarativemoduleplugin::importsPlugin() delete object; } +void tst_qdeclarativemoduleplugin::importsPlugin2() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + QTest::ignoreMessage(QtWarningMsg, "plugin2 created"); + QTest::ignoreMessage(QtWarningMsg, "import2 worked"); + QDeclarativeComponent component(&engine, TEST_FILE("data/works2.qml")); + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("value").toInt(),123); + delete object; +} + +void tst_qdeclarativemoduleplugin::importsPlugin21() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + QTest::ignoreMessage(QtWarningMsg, "plugin2.1 created"); + QTest::ignoreMessage(QtWarningMsg, "import2.1 worked"); + QDeclarativeComponent component(&engine, TEST_FILE("data/works21.qml")); + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("value").toInt(),123); + delete object; +} + void tst_qdeclarativemoduleplugin::incorrectPluginCase() { QDeclarativeEngine engine; @@ -145,6 +192,122 @@ void tst_qdeclarativemoduleplugin::incorrectPluginCase() QCOMPARE(errors.at(0).description(), expectedError); } +void tst_qdeclarativemoduleplugin::importPluginWithQmlFile() +{ + QString path = QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"); + + // QTBUG-16885: adding an import path with a lower-case "c:" causes assert failure + // (this only happens if the plugin includes pure QML files) + #ifdef Q_OS_WIN + QVERIFY(path.at(0).isUpper() && path.at(1) == QLatin1Char(':')); + path = path.at(0).toLower() + path.mid(1); + #endif + + QDeclarativeEngine engine; + engine.addImportPath(path); + + QDeclarativeComponent component(&engine, TEST_FILE("data/pluginWithQmlFile.qml")); + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + delete object; +} + +void tst_qdeclarativemoduleplugin::remoteImportWithQuotedUrl() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/imports"); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData("import \"http://127.0.0.1:14450/com/nokia/PureQmlModule\" \nComponentA { width: 300; ComponentB{} }", QUrl()); + + QTRY_COMPARE(component.status(), QDeclarativeComponent::Ready); + QObject *object = component.create(); + QCOMPARE(object->property("width").toInt(), 300); + QVERIFY(object != 0); + delete object; + + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); +} + +void tst_qdeclarativemoduleplugin::remoteImportWithUnquotedUri() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/imports"); + + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + QDeclarativeComponent component(&engine); + component.setData("import com.nokia.PureQmlModule 1.0 \nComponentA { width: 300; ComponentB{} }", QUrl()); + + + QTRY_COMPARE(component.status(), QDeclarativeComponent::Ready); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("width").toInt(), 300); + delete object; + + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); +} + +// QTBUG-17324 +void tst_qdeclarativemoduleplugin::importsMixedQmlCppPlugin() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + + { + QDeclarativeComponent component(&engine, TEST_FILE("data/importsMixedQmlCppPlugin.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + delete o; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("data/importsMixedQmlCppPlugin.2.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + delete o; + } + + +} + +void tst_qdeclarativemoduleplugin::versionNotInstalled_data() +{ + QTest::addColumn<QString>("file"); + QTest::addColumn<QString>("errorFile"); + + QTest::newRow("versionNotInstalled") << "data/versionNotInstalled.qml" << "versionNotInstalled.errors.txt"; + QTest::newRow("versionNotInstalled") << "data/versionNotInstalled.2.qml" << "versionNotInstalled.2.errors.txt"; +} + +void tst_qdeclarativemoduleplugin::versionNotInstalled() +{ + QFETCH(QString, file); + QFETCH(QString, errorFile); + + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + + QDeclarativeComponent component(&engine, TEST_FILE(file)); + VERIFY_ERRORS(errorFile.toLatin1().constData()); +} + QTEST_MAIN(tst_qdeclarativemoduleplugin) #include "tst_qdeclarativemoduleplugin.moc" diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro index fb3630f..a92d3a2 100644 --- a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro +++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro @@ -1,6 +1,9 @@ load(qttest_p4) -SOURCES = tst_qdeclarativemoduleplugin.cpp -QT += declarative + +HEADERS = ../shared/testhttpserver.h +SOURCES = tst_qdeclarativemoduleplugin.cpp \ + ../shared/testhttpserver.cpp +QT += declarative network CONFIG -= app_bundle symbian: { diff --git a/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml b/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml new file mode 100644 index 0000000..a361bdc --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +PathView { + width: 400 + height: 200 + model: 100 + pathItemCount: 20 + path: Path { + startX: 0; startY: 100 + PathLine { x: 400; y: 100 } + } + delegate: Rectangle { height: 100; width: 1; color: PathView.isCurrentItem?"red" : "black" } + dragMargin: 100 + preferredHighlightBegin: 0.5 + preferredHighlightEnd: 0.5 + Text { + text: "current index: " + parent.currentIndex + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml b/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml new file mode 100644 index 0000000..56f7ae4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +PathView { + width: 320 + height: 240 + function setRoot(index) { + vdm.rootIndex = vdm.modelIndex(index); + } + model: VisualDataModel { + id: vdm + model: myModel + delegate: Text { objectName: "wrapper"; text: display } + } + + path: Path { + startX: 0; startY: 120 + PathLine { x: 320; y: 120 } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp index 23ae907..ebb5f98 100644 --- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp +++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp @@ -53,6 +53,7 @@ #include <QtDeclarative/private/qdeclarativevaluetype_p.h> #include <QAbstractListModel> #include <QStringListModel> +#include <QStandardItemModel> #include <QFile> #include "../../../shared/util.h" @@ -62,6 +63,25 @@ #define SRCDIR "." #endif +static void initStandardTreeModel(QStandardItemModel *model) +{ + QStandardItem *item; + item = new QStandardItem(QLatin1String("Row 1 Item")); + model->insertRow(0, item); + + item = new QStandardItem(QLatin1String("Row 2 Item")); + item->setCheckable(true); + model->insertRow(1, item); + + QStandardItem *childItem = new QStandardItem(QLatin1String("Row 2 Child Item")); + item->setChild(0, childItem); + + item = new QStandardItem(QLatin1String("Row 3 Item")); + item->setIcon(QIcon()); + model->insertRow(2, item); +} + + class tst_QDeclarativePathView : public QObject { Q_OBJECT @@ -89,6 +109,8 @@ private slots: void pathUpdate(); void visualDataModel(); void undefinedPath(); + void mouseDrag(); + void treeModel(); private: QDeclarativeView *createView(); @@ -867,6 +889,65 @@ void tst_QDeclarativePathView::undefinedPath() delete obj; } +void tst_QDeclarativePathView::mouseDrag() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragpath.qml")); + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas)); + + QDeclarativePathView *pathview = qobject_cast<QDeclarativePathView*>(canvas->rootObject()); + QVERIFY(pathview != 0); + + int current = pathview->currentIndex(); + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(10,100))); + + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(30,100)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(90,100)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + + QVERIFY(pathview->currentIndex() != current); + + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(40,100))); + + delete canvas; +} + +void tst_QDeclarativePathView::treeModel() +{ + QDeclarativeView *canvas = createView(); + + QStandardItemModel model; + initStandardTreeModel(&model); + canvas->engine()->rootContext()->setContextProperty("myModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/treemodel.qml")); + + QDeclarativePathView *pathview = qobject_cast<QDeclarativePathView*>(canvas->rootObject()); + QVERIFY(pathview != 0); + QCOMPARE(pathview->count(), 3); + + QDeclarativeText *item = findItem<QDeclarativeText>(pathview, "wrapper", 0); + QVERIFY(item); + QCOMPARE(item->text(), QLatin1String("Row 1 Item")); + + QVERIFY(QMetaObject::invokeMethod(pathview, "setRoot", Q_ARG(QVariant, 1))); + QCOMPARE(pathview->count(), 1); + + QTRY_VERIFY(item = findItem<QDeclarativeText>(pathview, "wrapper", 0)); + QTRY_COMPARE(item->text(), QLatin1String("Row 2 Child Item")); + + delete canvas; +} + QDeclarativeView *tst_QDeclarativePathView::createView() { QDeclarativeView *canvas = new QDeclarativeView(0); diff --git a/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp b/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp index b7e7a99..f175033 100644 --- a/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp +++ b/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp @@ -228,14 +228,8 @@ void tst_QDeclarativePinchArea::scale() p2 += QPoint(10,10); QTest::touchEvent(vp).move(0, p1).move(1, p2); -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo on mac", Continue); -#endif QCOMPARE(root->property("scale").toReal(), 1.5); QCOMPARE(root->property("center").toPointF(), QPointF(40, 40)); // blackrect is at 50,50 -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo on mac", Continue); -#endif QCOMPARE(blackRect->scale(), 1.5); // scale beyond bound @@ -243,9 +237,6 @@ void tst_QDeclarativePinchArea::scale() p2 += QPoint(50,50); QTest::touchEvent(vp).move(0, p1).move(1, p2); -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo on mac", Continue); -#endif QCOMPARE(blackRect->scale(), 2.0); QTest::touchEvent(vp).release(0, p1).release(1, p2); @@ -292,18 +283,9 @@ void tst_QDeclarativePinchArea::pan() p2 += QPoint(10,10); QTest::touchEvent(vp).move(0, p1).move(1, p2); -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo mac", Continue); -#endif QCOMPARE(root->property("center").toPointF(), QPointF(60, 60)); // blackrect is at 50,50 -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo mac", Continue); -#endif QCOMPARE(blackRect->x(), 60.0); -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo mac", Continue); -#endif QCOMPARE(blackRect->y(), 60.0); // pan x beyond bound @@ -311,13 +293,7 @@ void tst_QDeclarativePinchArea::pan() p2 += QPoint(100,100); QTest::touchEvent(vp).move(0, p1).move(1, p2); -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo mac", Continue); -#endif QCOMPARE(blackRect->x(), 140.0); -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "todo mac", Continue); -#endif QCOMPARE(blackRect->y(), 160.0); QTest::touchEvent(vp).release(0, p1).release(1, p2); diff --git a/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml b/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml index 1cba598..f93ce67 100644 --- a/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml +++ b/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml @@ -12,9 +12,27 @@ Item { height: 50 z: {if(index == 0){2;}else if(index == 1){1;} else{3;}} objectName: {if(index == 0){"one";}else if(index == 1){"two";} else{"three";}} - } } } } + + //This crashed once (QTBUG-16959) because the repeater ended up on the end of the list + //If this grid just instantiates without crashing, then it has not regressed. + Grid { + id: grid + rows: 2 + flow: Grid.TopToBottom + + Repeater { + model: 13 + Rectangle { + color: "goldenrod" + width: 100 + height: 100 + radius: 10 + border.width: 1 + } + } + } } diff --git a/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp index 6365ce5..40e533d 100644 --- a/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp +++ b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp @@ -87,6 +87,8 @@ private slots: void test_flow_implicit_resize(); void test_conflictinganchors(); void test_vertical_qgraphicswidget(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); private: QDeclarativeView *createView(const QString &filename); }; @@ -1070,7 +1072,7 @@ void interceptWarnings(QtMsgType type, const char *msg) void tst_QDeclarativePositioners::test_conflictinganchors() { - qInstallMsgHandler(interceptWarnings); + QtMsgHandler oldMsgHandler = qInstallMsgHandler(interceptWarnings); QDeclarativeEngine engine; QDeclarativeComponent component(&engine); @@ -1151,6 +1153,7 @@ void tst_QDeclarativePositioners::test_conflictinganchors() item = qobject_cast<QDeclarativeItem*>(component.create()); QVERIFY(item); QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow")); + qInstallMsgHandler(oldMsgHandler); } void tst_QDeclarativePositioners::test_vertical_qgraphicswidget() @@ -1195,6 +1198,49 @@ void tst_QDeclarativePositioners::test_vertical_qgraphicswidget() delete canvas; } +void tst_QDeclarativePositioners::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; " + code.toUtf8(), QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; " + code.toUtf8(), QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_QDeclarativePositioners::testQtQuick11Attributes_data() +{ + QTest::addColumn<QString>("code"); + QTest::addColumn<QString>("warning"); + QTest::addColumn<QString>("error"); + + QTest::newRow("Flow.layoutDirection") << "Flow { layoutDirection: Qt.LeftToRight }" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Flow.layoutDirection\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("Row.layoutDirection") << "Row { layoutDirection: Qt.LeftToRight }" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Row.layoutDirection\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("Grid.layoutDirection") << "Grid { layoutDirection: Qt.LeftToRight }" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Grid.layoutDirection\" is not available in QtQuick 1.0.\n"; +} + QDeclarativeView *tst_QDeclarativePositioners::createView(const QString &filename) { QDeclarativeView *canvas = new QDeclarativeView(0); diff --git a/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml b/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml new file mode 100644 index 0000000..0b57d50 --- /dev/null +++ b/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml @@ -0,0 +1,26 @@ +import QtQuick 1.1 + +Column { + Repeater { + id: repeater + objectName: "repeater" + + property int itemsCount + property variant itemsFound: [] + + delegate: Rectangle { + color: "red" + width: (index+1)*50 + height: 50 + } + + onModelChanged: { + repeater.itemsCount = repeater.count + var items = [] + for (var i=0; i<repeater.count; i++) + items.push(repeater.itemAt(i)) + repeater.itemsFound = items + } + } +} + diff --git a/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp b/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp index 6b840a3..ba52987 100644 --- a/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp +++ b/tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp @@ -74,6 +74,7 @@ private slots: void dataModel_changes(); void itemModel(); void resetModel(); + void modelChanged(); void properties(); void testQtQuick11Attributes(); void testQtQuick11Attributes_data(); @@ -534,7 +535,10 @@ void tst_QDeclarativeRepeater::resetModel() QVERIFY(container != 0); QCOMPARE(repeater->count(), dataA.count()); + for (int i=0; i<repeater->count(); i++) + QCOMPARE(repeater->itemAt(i), container->childItems().at(i+1)); // +1 to skip first Text object + QSignalSpy modelChangedSpy(repeater, SIGNAL(modelChanged())); QSignalSpy countSpy(repeater, SIGNAL(countChanged())); QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QDeclarativeItem*))); QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QDeclarativeItem*))); @@ -547,6 +551,7 @@ void tst_QDeclarativeRepeater::resetModel() ctxt->setContextProperty("testData", dataB); QCOMPARE(repeater->count(), dataB.count()); + QCOMPARE(modelChangedSpy.count(), 1); QCOMPARE(countSpy.count(), 1); QCOMPARE(removedSpy.count(), dataA.count()); QCOMPARE(addedSpy.count(), dataB.count()); @@ -554,6 +559,7 @@ void tst_QDeclarativeRepeater::resetModel() QCOMPARE(addedSpy.at(i).at(0).toInt(), i); QCOMPARE(addedSpy.at(i).at(1).value<QDeclarativeItem*>(), repeater->itemAt(i)); } + modelChangedSpy.clear(); countSpy.clear(); removedSpy.clear(); addedSpy.clear(); @@ -562,6 +568,7 @@ void tst_QDeclarativeRepeater::resetModel() repeater->setModel(dataA); QCOMPARE(repeater->count(), dataA.count()); + QCOMPARE(modelChangedSpy.count(), 1); QCOMPARE(countSpy.count(), 1); QCOMPARE(removedSpy.count(), dataB.count()); QCOMPARE(addedSpy.count(), dataA.count()); @@ -569,6 +576,32 @@ void tst_QDeclarativeRepeater::resetModel() QCOMPARE(addedSpy.at(i).at(0).toInt(), i); QCOMPARE(addedSpy.at(i).at(1).value<QDeclarativeItem*>(), repeater->itemAt(i)); } + + delete canvas; +} + +// QTBUG-17156 +void tst_QDeclarativeRepeater::modelChanged() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, TEST_FILE("/modelChanged.qml")); + + QDeclarativeItem *rootObject = qobject_cast<QDeclarativeItem*>(component.create()); + QVERIFY(rootObject); + QDeclarativeRepeater *repeater = findItem<QDeclarativeRepeater>(rootObject, "repeater"); + QVERIFY(repeater); + + repeater->setModel(4); + QCOMPARE(repeater->count(), 4); + QCOMPARE(repeater->property("itemsCount").toInt(), 4); + QCOMPARE(repeater->property("itemsFound").toList().count(), 4); + + repeater->setModel(10); + QCOMPARE(repeater->count(), 10); + QCOMPARE(repeater->property("itemsCount").toInt(), 10); + QCOMPARE(repeater->property("itemsFound").toList().count(), 10); + + delete rootObject; } void tst_QDeclarativeRepeater::properties() diff --git a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp index 8111cd2..05546cb 100644 --- a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp +++ b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp @@ -470,6 +470,8 @@ void tst_qdeclarativetext::alignments() QCOMPARE(actual,expect); } #endif + + delete canvas; } //the alignment tests may be trivial o.oa @@ -962,6 +964,8 @@ void tst_qdeclarativetext::QTBUG_12291() QDeclarativeText *text = ob->findChild<QDeclarativeText*>("text"); QVERIFY(text); QVERIFY(text->boundingRect().isValid()); + + delete canvas; } class EventSender : public QGraphicsItem @@ -1054,6 +1058,8 @@ void tst_qdeclarativetext::embeddedImages() QCOMPARE(textObject->width(), 16.0); // default size of QTextDocument broken image icon QCOMPARE(textObject->height(), 16.0); } + + delete textObject; } void tst_qdeclarativetext::lineCount() @@ -1081,6 +1087,8 @@ void tst_qdeclarativetext::lineCount() QCOMPARE(myText->lineCount(), 2); QCOMPARE(myText->truncated(), true); QCOMPARE(myText->maximumLineCount(), 2); + + delete canvas; } void tst_qdeclarativetext::lineHeight() @@ -1091,27 +1099,29 @@ void tst_qdeclarativetext::lineHeight() QVERIFY(myText != 0); QVERIFY(myText->lineHeight() == 1); - QVERIFY(myText->lineHeightMode() == QDeclarativeText::MultiplyHeight); + QVERIFY(myText->lineHeightMode() == QDeclarativeText::ProportionalHeight); qreal h = myText->height(); myText->setLineHeight(1.5); QVERIFY(myText->height() == h * 1.5); - myText->setLineHeightMode(QDeclarativeText::PixelHeight); + myText->setLineHeightMode(QDeclarativeText::FixedHeight); myText->setLineHeight(20); QCOMPARE(myText->height(), myText->lineCount() * 20.0); myText->setText("Lorem ipsum sit <b>amet</b>, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum."); - myText->setLineHeightMode(QDeclarativeText::MultiplyHeight); - myText->setLineHeight(1); + myText->setLineHeightMode(QDeclarativeText::ProportionalHeight); + myText->setLineHeight(1.0); - qreal h2 = myText->height(); + //qreal h2 = myText->height(); myText->setLineHeight(2.0); - QVERIFY(myText->height() == h2 * 2.0); + //QVERIFY(myText->height() == h2 * 2.0); - myText->setLineHeightMode(QDeclarativeText::PixelHeight); + myText->setLineHeightMode(QDeclarativeText::FixedHeight); myText->setLineHeight(10); - QCOMPARE(myText->height(), myText->lineCount() * 10.0); + //QCOMPARE(myText->height(), myText->lineCount() * 10.0); + + delete canvas; } void tst_qdeclarativetext::implicitSize_data() @@ -1175,9 +1185,21 @@ void tst_qdeclarativetext::testQtQuick11Attributes_data() << "QDeclarativeComponent: Component is not ready" << ":1 \"Text.maximumLineCount\" is not available in QtQuick 1.0.\n"; - QTest::newRow("truncated") << "property int foo: lineCount" + QTest::newRow("lineHeight") << "lineHeight: 2" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Text.lineHeight\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("lineHeightMode") << "lineHeightMode: Text.ProportionalHeight" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Text.lineHeightMode\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("lineCount") << "property int foo: lineCount" << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount" << ""; + + QTest::newRow("truncated") << "property bool foo: truncated" + << "<Unknown File>:1: ReferenceError: Can't find variable: truncated" + << ""; } QTEST_MAIN(tst_qdeclarativetext) diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml new file mode 100644 index 0000000..5784e19 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextEdit.SelectCharacters +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml new file mode 100644 index 0000000..1e5f4aa --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml @@ -0,0 +1,7 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml new file mode 100644 index 0000000..4b25f2f --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextEdit.SelectWords +} diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp index b1e0cb9..7d5101c 100644 --- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp +++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -112,8 +112,12 @@ private slots: void selection(); void moveCursorSelection_data(); void moveCursorSelection(); + void moveCursorSelectionSequence_data(); + void moveCursorSelectionSequence(); void mouseSelection_data(); void mouseSelection(); + void mouseSelectionMode_data(); + void mouseSelectionMode(); void dragMouseSelection(); void inputMethodHints(); @@ -786,91 +790,113 @@ void tst_qdeclarativetextedit::moveCursorSelection_data() QTest::newRow("jum()ped|characters") << standard[0] << 23 << 23 << QDeclarativeTextEdit::SelectCharacters << 23 << 23 << true; - QTest::newRow("(t)he|words") + QTest::newRow("<(t)he>|words") << standard[0] << 0 << 1 << QDeclarativeTextEdit::SelectWords << 0 << 3 << true; - QTest::newRow("do(g)|words") + QTest::newRow("<do(g)>|words") << standard[0] << 43 << 44 << QDeclarativeTextEdit::SelectWords << 41 << 44 << true; - QTest::newRow("jum(p)ed|words") + QTest::newRow("<jum(p)ed>|words") << standard[0] << 23 << 24 << QDeclarativeTextEdit::SelectWords << 20 << 26 << true; - QTest::newRow("jumped( )over|words") - << standard[0] << 26 << 27 << QDeclarativeTextEdit::SelectWords << 27 << 27 << false; - QTest::newRow("jumped( )over|words,reversed") - << standard[0] << 27 << 26 << QDeclarativeTextEdit::SelectWords << 26 << 26 << false; - QTest::newRow("(the )|words") - << standard[0] << 0 << 4 << QDeclarativeTextEdit::SelectWords << 0 << 3 << true; - QTest::newRow("( dog)|words") - << standard[0] << 40 << 44 << QDeclarativeTextEdit::SelectWords << 41 << 44 << true; - QTest::newRow("( jumped )|words") - << standard[0] << 19 << 27 << QDeclarativeTextEdit::SelectWords << 20 << 26 << true; - QTest::newRow("th(e qu)ick|words") + QTest::newRow("<jumped( )>over|words") + << standard[0] << 26 << 27 << QDeclarativeTextEdit::SelectWords << 20 << 27 << false; + QTest::newRow("jumped<( )over>|words,reversed") + << standard[0] << 27 << 26 << QDeclarativeTextEdit::SelectWords << 26 << 31 << false; + QTest::newRow("<(the )>quick|words") + << standard[0] << 0 << 4 << QDeclarativeTextEdit::SelectWords << 0 << 4 << false; + QTest::newRow("<(the )quick>|words,reversed") + << standard[0] << 4 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 9 << false; + QTest::newRow("<lazy( dog)>|words") + << standard[0] << 40 << 44 << QDeclarativeTextEdit::SelectWords << 36 << 44 << false; + QTest::newRow("lazy<( dog)>|words,reversed") + << standard[0] << 44 << 40 << QDeclarativeTextEdit::SelectWords << 40 << 44 << false; + QTest::newRow("<fox( jumped )>over|words") + << standard[0] << 19 << 27 << QDeclarativeTextEdit::SelectWords << 16 << 27 << false; + QTest::newRow("fox<( jumped )over>|words,reversed") + << standard[0] << 27 << 19 << QDeclarativeTextEdit::SelectWords << 19 << 31 << false; + QTest::newRow("<th(e qu)ick>|words") << standard[0] << 2 << 6 << QDeclarativeTextEdit::SelectWords << 0 << 9 << true; - QTest::newRow("la(zy d)og|words") + QTest::newRow("<la(zy d)og|words>") << standard[0] << 38 << 42 << QDeclarativeTextEdit::SelectWords << 36 << 44 << true; - QTest::newRow("jum(ped ov)er|words") + QTest::newRow("<jum(ped ov)er>|words") << standard[0] << 23 << 29 << QDeclarativeTextEdit::SelectWords << 20 << 31 << true; - QTest::newRow("()the|words") + QTest::newRow("<()>the|words") << standard[0] << 0 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 0 << true; - QTest::newRow("dog()|words") + QTest::newRow("dog<()>|words") << standard[0] << 44 << 44 << QDeclarativeTextEdit::SelectWords << 44 << 44 << true; - QTest::newRow("jum()ped|words") + QTest::newRow("jum<()>ped|words") << standard[0] << 23 << 23 << QDeclarativeTextEdit::SelectWords << 23 << 23 << true; - QTest::newRow("Hello(,) |words") + QTest::newRow("Hello<(,)> |words") << standard[2] << 5 << 6 << QDeclarativeTextEdit::SelectWords << 5 << 6 << true; - QTest::newRow("Hello(, )|words") - << standard[2] << 5 << 7 << QDeclarativeTextEdit::SelectWords << 5 << 6 << true; - QTest::newRow("Hel(lo, )|words") - << standard[2] << 3 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 6 << true; - QTest::newRow("Hel(lo),|words") + QTest::newRow("Hello<(, )>world|words") + << standard[2] << 5 << 7 << QDeclarativeTextEdit::SelectWords << 5 << 7 << false; + QTest::newRow("Hello<(, )world>|words,reversed") + << standard[2] << 7 << 5 << QDeclarativeTextEdit::SelectWords << 5 << 12 << false; + QTest::newRow("<Hel(lo, )>world|words") + << standard[2] << 3 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 7 << false; + QTest::newRow("<Hel(lo, )world>|words,reversed") + << standard[2] << 7 << 3 << QDeclarativeTextEdit::SelectWords << 0 << 12 << false; + QTest::newRow("<Hel(lo)>,|words") << standard[2] << 3 << 5 << QDeclarativeTextEdit::SelectWords << 0 << 5 << true; - QTest::newRow("Hello(),|words") + QTest::newRow("Hello<()>,|words") << standard[2] << 5 << 5 << QDeclarativeTextEdit::SelectWords << 5 << 5 << true; - QTest::newRow("Hello,()|words") + QTest::newRow("Hello,<()>|words") << standard[2] << 6 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 6 << true; - QTest::newRow("Hello,( )|words") - << standard[2] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 7 << 7 << false; - QTest::newRow("Hello,( )|words") - << standard[2] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 6 << false; - QTest::newRow("Hello,( world)|words") - << standard[2] << 6 << 12 << QDeclarativeTextEdit::SelectWords << 7 << 12 << true; - QTest::newRow("Hello,( world!)|words") - << standard[2] << 6 << 13 << QDeclarativeTextEdit::SelectWords << 7 << 13 << true; - QTest::newRow("Hello(, world!)|words") + QTest::newRow("Hello<,( )>world|words") + << standard[2] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 5 << 7 << false; + QTest::newRow("Hello,<( )world>|words,reversed") + << standard[2] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world)>|words") + << standard[2] << 6 << 12 << QDeclarativeTextEdit::SelectWords << 5 << 12 << false; + QTest::newRow("Hello,<( world)>|words,reversed") + << standard[2] << 12 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world!)>|words") + << standard[2] << 6 << 13 << QDeclarativeTextEdit::SelectWords << 5 << 13 << false; + QTest::newRow("Hello,<( world!)>|words,reversed") + << standard[2] << 13 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 13 << false; + QTest::newRow("Hello<(, world!)>|words") << standard[2] << 5 << 13 << QDeclarativeTextEdit::SelectWords << 5 << 13 << true; - QTest::newRow("world(!)|words") + QTest::newRow("world<(!)>|words") << standard[2] << 12 << 13 << QDeclarativeTextEdit::SelectWords << 12 << 13 << true; - QTest::newRow("world!())|words") + QTest::newRow("world!<()>)|words") << standard[2] << 13 << 13 << QDeclarativeTextEdit::SelectWords << 13 << 13 << true; - QTest::newRow("world()!)|words") + QTest::newRow("world<()>!)|words") << standard[2] << 12 << 12 << QDeclarativeTextEdit::SelectWords << 12 << 12 << true; - QTest::newRow("(,)olleH |words") + QTest::newRow("<(,)>olleH |words") << standard[3] << 7 << 8 << QDeclarativeTextEdit::SelectWords << 7 << 8 << true; - QTest::newRow("( ,)olleH|words") - << standard[3] << 6 << 8 << QDeclarativeTextEdit::SelectWords << 7 << 8 << true; - QTest::newRow("( ,ol)leH|words") - << standard[3] << 6 << 10 << QDeclarativeTextEdit::SelectWords << 7 << 13 << true; - QTest::newRow(",(ol)leH,|words") + QTest::newRow("<dlrow( ,)>olleH|words") + << standard[3] << 6 << 8 << QDeclarativeTextEdit::SelectWords << 1 << 8 << false; + QTest::newRow("dlrow<( ,)>olleH|words,reversed") + << standard[3] << 8 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 8 << false; + QTest::newRow("<dlrow( ,ol)leH>|words") + << standard[3] << 6 << 10 << QDeclarativeTextEdit::SelectWords << 1 << 13 << false; + QTest::newRow("dlrow<( ,ol)leH>|words,reversed") + << standard[3] << 10 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 13 << false; + QTest::newRow(",<(ol)leH>,|words") << standard[3] << 8 << 10 << QDeclarativeTextEdit::SelectWords << 8 << 13 << true; - QTest::newRow(",()olleH|words") + QTest::newRow(",<()>olleH|words") << standard[3] << 8 << 8 << QDeclarativeTextEdit::SelectWords << 8 << 8 << true; - QTest::newRow("(),olleH|words") + QTest::newRow("<()>,olleH|words") << standard[3] << 7 << 7 << QDeclarativeTextEdit::SelectWords << 7 << 7 << true; - QTest::newRow("( ),olleH|words") - << standard[3] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 7 << 7 << false; - QTest::newRow("( ),olleH|words,reversed") - << standard[3] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 6 << false; - QTest::newRow("(dlrow ),olleH|words") - << standard[3] << 1 << 7 << QDeclarativeTextEdit::SelectWords << 1 << 6 << true; - QTest::newRow("(!dlrow ),olleH|words") - << standard[3] << 0 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 6 << true; + QTest::newRow("<dlrow( )>,olleH|words") + << standard[3] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 1 << 7 << false; + QTest::newRow("dlrow<( ),>olleH|words,reversed") + << standard[3] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 8 << false; + QTest::newRow("<(dlrow )>,olleH|words") + << standard[3] << 1 << 7 << QDeclarativeTextEdit::SelectWords << 1 << 7 << false; + QTest::newRow("<(dlrow ),>olleH|words,reversed") + << standard[3] << 7 << 1 << QDeclarativeTextEdit::SelectWords << 1 << 8 << false; + QTest::newRow("<(!dlrow )>,olleH|words") + << standard[3] << 0 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 7 << false; + QTest::newRow("<(!dlrow ),>olleH|words,reversed") + << standard[3] << 7 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 8 << false; QTest::newRow("(!dlrow ,)olleH|words") << standard[3] << 0 << 8 << QDeclarativeTextEdit::SelectWords << 0 << 8 << true; - QTest::newRow("(!)dlrow|words") + QTest::newRow("<(!)>dlrow|words") << standard[3] << 0 << 1 << QDeclarativeTextEdit::SelectWords << 0 << 1 << true; - QTest::newRow("()!dlrow|words") + QTest::newRow("<()>!dlrow|words") << standard[3] << 0 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 0 << true; - QTest::newRow("!()dlrow|words") + QTest::newRow("!<()>dlrow|words") << standard[3] << 1 << 1 << QDeclarativeTextEdit::SelectWords << 1 << 1 << true; } @@ -893,6 +919,7 @@ void tst_qdeclarativetextedit::moveCursorSelection() texteditObject->setCursorPosition(cursorPosition); texteditObject->moveCursorSelection(movePosition, mode); + QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); QCOMPARE(texteditObject->selectionStart(), selectionStart); QCOMPARE(texteditObject->selectionEnd(), selectionEnd); @@ -900,11 +927,168 @@ void tst_qdeclarativetextedit::moveCursorSelection() texteditObject->setCursorPosition(movePosition); texteditObject->moveCursorSelection(cursorPosition, mode); + QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); QCOMPARE(texteditObject->selectionStart(), selectionStart); QCOMPARE(texteditObject->selectionEnd(), selectionEnd); } } +void tst_qdeclarativetextedit::moveCursorSelectionSequence_data() +{ + QTest::addColumn<QString>("testStr"); + QTest::addColumn<int>("cursorPosition"); + QTest::addColumn<int>("movePosition1"); + QTest::addColumn<int>("movePosition2"); + QTest::addColumn<int>("selection1Start"); + QTest::addColumn<int>("selection1End"); + QTest::addColumn<int>("selection2Start"); + QTest::addColumn<int>("selection2End"); + + QTest::newRow("the {<quick( bro)wn> f^ox} jumped|ltr") + << standard[0] + << 9 << 13 << 17 + << 4 << 15 + << 4 << 19; + QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl") + << standard[0] + << 13 << 9 << 17 + << 9 << 15 + << 10 << 19; + QTest::newRow("the {<quick( bro)wn> ^}fox jumped|ltr") + << standard[0] + << 9 << 13 << 16 + << 4 << 15 + << 4 << 16; + QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl") + << standard[0] + << 13 << 9 << 16 + << 9 << 15 + << 10 << 16; + QTest::newRow("the {<quick( bro)wn^>} fox jumped|ltr") + << standard[0] + << 9 << 13 << 15 + << 4 << 15 + << 4 << 15; + QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl") + << standard[0] + << 13 << 9 << 15 + << 9 << 15 + << 10 << 15; + QTest::newRow("the {<quick() ^}bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 10 + << 4 << 15 + << 4 << 10; + QTest::newRow("the quick<(^ {^bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 10 + << 9 << 15 + << 10 << 15; + QTest::newRow("the {<quick^}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 9 + << 4 << 15 + << 4 << 9; + QTest::newRow("the quick{<(^ bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 9 + << 9 << 15 + << 9 << 15; + QTest::newRow("the {<qui^ck}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 7 + << 4 << 15 + << 4 << 9; + QTest::newRow("the {<qui^ck}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 7 + << 9 << 15 + << 4 << 15; + QTest::newRow("the {<^quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 4 + << 4 << 15 + << 4 << 9; + QTest::newRow("the {<^quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 4 + << 9 << 15 + << 4 << 15; + QTest::newRow("the{^ <quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 3 + << 4 << 15 + << 3 << 9; + QTest::newRow("the{^ <quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 3 + << 9 << 15 + << 3 << 15; + QTest::newRow("{t^he <quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 1 + << 4 << 15 + << 0 << 9; + QTest::newRow("{t^he <quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 1 + << 9 << 15 + << 0 << 15; + + QTest::newRow("{<He(ll)o>, w^orld}!|ltr") + << standard[2] + << 2 << 4 << 8 + << 0 << 5 + << 0 << 12; + QTest::newRow("{<He(ll)o>, w^orld}!|rtl") + << standard[2] + << 4 << 2 << 8 + << 0 << 5 + << 0 << 12; + + QTest::newRow("!{dlro^w ,<o(ll)eH>}|ltr") + << standard[3] + << 9 << 11 << 5 + << 8 << 13 + << 1 << 13; + QTest::newRow("!{dlro^w ,<o(ll)eH>}|rtl") + << standard[3] + << 11 << 9 << 5 + << 8 << 13 + << 1 << 13; +} + +void tst_qdeclarativetextedit::moveCursorSelectionSequence() +{ + QFETCH(QString, testStr); + QFETCH(int, cursorPosition); + QFETCH(int, movePosition1); + QFETCH(int, movePosition2); + QFETCH(int, selection1Start); + QFETCH(int, selection1End); + QFETCH(int, selection2Start); + QFETCH(int, selection2End); + + QString componentStr = "import QtQuick 1.1\nTextEdit { text: \""+ testStr +"\"; }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *texteditObject = qobject_cast<QDeclarativeTextEdit*>(texteditComponent.create()); + QVERIFY(texteditObject != 0); + + texteditObject->setCursorPosition(cursorPosition); + + texteditObject->moveCursorSelection(movePosition1, QDeclarativeTextEdit::SelectWords); + QCOMPARE(texteditObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start)); + QCOMPARE(texteditObject->selectionStart(), selection1Start); + QCOMPARE(texteditObject->selectionEnd(), selection1End); + + texteditObject->moveCursorSelection(movePosition2, QDeclarativeTextEdit::SelectWords); + QCOMPARE(texteditObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start)); + QCOMPARE(texteditObject->selectionStart(), selection2Start); + QCOMPARE(texteditObject->selectionEnd(), selection2End); +} + + void tst_qdeclarativetextedit::mouseSelection_data() { QTest::addColumn<QString>("qmlfile"); @@ -995,6 +1179,55 @@ void tst_qdeclarativetextedit::dragMouseSelection() QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and doesn't not the first moved. } +void tst_qdeclarativetextedit::mouseSelectionMode_data() +{ + QTest::addColumn<QString>("qmlfile"); + QTest::addColumn<bool>("selectWords"); + + // import installed + QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true; + QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false; + QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false; +} + +void tst_qdeclarativetextedit::mouseSelectionMode() +{ + QFETCH(QString, qmlfile); + QFETCH(bool, selectWords); + + QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast<QDeclarativeTextEdit *>(canvas->rootObject()); + QVERIFY(textEditObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textEditObject->height()/2; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str = textEditObject->selectedText(); + if (selectWords) { + QCOMPARE(str, text); + } else { + QVERIFY(str.length() > 3); + QVERIFY(str != text); + } + + delete canvas; +} + void tst_qdeclarativetextedit::inputMethodHints() { QDeclarativeView *canvas = createView(SRCDIR "/data/inputmethodhints.qml"); @@ -1443,6 +1676,16 @@ void tst_qdeclarativetextedit::openInputPanelOnFocus() QApplication::processEvents(); QVERIFY(view.inputContext() == 0); QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); + + // input method should not be enabled + // if TextEdit is read only. + edit.setReadOnly(true); + ic.openInputPanelReceived = false; + edit.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); } void tst_qdeclarativetextedit::geometrySignals() @@ -1513,14 +1756,14 @@ void tst_qdeclarativetextedit::testQtQuick11Attributes() QObject *obj; QDeclarativeComponent valid(&engine); - valid.setData("import QtQuick 1.1; Text { " + code.toUtf8() + " }", QUrl("")); + valid.setData("import QtQuick 1.1; TextEdit { " + code.toUtf8() + " }", QUrl("")); obj = valid.create(); QVERIFY(obj); QVERIFY(valid.errorString().isEmpty()); delete obj; QDeclarativeComponent invalid(&engine); - invalid.setData("import QtQuick 1.0; Text { " + code.toUtf8() + " }", QUrl("")); + invalid.setData("import QtQuick 1.0; TextEdit { " + code.toUtf8() + " }", QUrl("")); QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); obj = invalid.create(); QCOMPARE(invalid.errorString(), error); @@ -1540,6 +1783,18 @@ void tst_qdeclarativetextedit::testQtQuick11Attributes_data() QTest::newRow("lineCount") << "property int foo: lineCount" << "<Unknown File>:1: ReferenceError: Can't find variable: lineCount" << ""; + + QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)" + << "<Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection" + << ""; + + QTest::newRow("deselect") << "Component.onCompleted: deselect()" + << "<Unknown File>:1: ReferenceError: Can't find variable: deselect" + << ""; + + QTest::newRow("onLinkActivated") << "onLinkActivated: {}" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"TextEdit.onLinkActivated\" is not available in QtQuick 1.0.\n"; } QTEST_MAIN(tst_qdeclarativetextedit) diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml new file mode 100644 index 0000000..0ffc6ff --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextInput.SelectCharacters +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml new file mode 100644 index 0000000..87c174b --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml @@ -0,0 +1,7 @@ +import QtQuick 1.1 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml new file mode 100644 index 0000000..df69a7d --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextInput.SelectWords +} diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp index 78f6693..a6d30a5 100644 --- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp +++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp @@ -91,7 +91,11 @@ private slots: void selection(); void moveCursorSelection_data(); void moveCursorSelection(); + void moveCursorSelectionSequence_data(); + void moveCursorSelectionSequence(); void dragMouseSelection(); + void mouseSelectionMode_data(); + void mouseSelectionMode(); void horizontalAlignment_data(); void horizontalAlignment(); @@ -117,6 +121,11 @@ private slots: void echoMode(); void geometrySignals(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + + void preeditAutoScroll(); + private: void simulateKey(QDeclarativeView *, int key); QDeclarativeView *createView(const QString &filename); @@ -459,91 +468,115 @@ void tst_qdeclarativetextinput::moveCursorSelection_data() QTest::newRow("jum()ped|characters") << standard[0] << 23 << 23 << QDeclarativeTextInput::SelectCharacters << 23 << 23 << true; - QTest::newRow("(t)he|words") + QTest::newRow("<(t)he>|words") << standard[0] << 0 << 1 << QDeclarativeTextInput::SelectWords << 0 << 3 << true; - QTest::newRow("do(g)|words") + QTest::newRow("<do(g)>|words") << standard[0] << 43 << 44 << QDeclarativeTextInput::SelectWords << 41 << 44 << true; - QTest::newRow("jum(p)ed|words") + QTest::newRow("<jum(p)ed>|words") << standard[0] << 23 << 24 << QDeclarativeTextInput::SelectWords << 20 << 26 << true; - QTest::newRow("jumped( )over|words") - << standard[0] << 26 << 27 << QDeclarativeTextInput::SelectWords << 27 << 27 << false; - QTest::newRow("jumped( )over|words,reversed") - << standard[0] << 27 << 26 << QDeclarativeTextInput::SelectWords << 26 << 26 << false; - QTest::newRow("(the )|words") - << standard[0] << 0 << 4 << QDeclarativeTextInput::SelectWords << 0 << 3 << true; - QTest::newRow("( dog)|words") - << standard[0] << 40 << 44 << QDeclarativeTextInput::SelectWords << 41 << 44 << true; - QTest::newRow("( jumped )|words") - << standard[0] << 19 << 27 << QDeclarativeTextInput::SelectWords << 20 << 26 << true; - QTest::newRow("th(e qu)ick|words") + QTest::newRow("<jumped( )>over|words,ltr") + << standard[0] << 26 << 27 << QDeclarativeTextInput::SelectWords << 20 << 27 << false; + QTest::newRow("jumped<( )over>|words,rtl") + << standard[0] << 27 << 26 << QDeclarativeTextInput::SelectWords << 26 << 31 << false; + QTest::newRow("<(the )>quick|words,ltr") + << standard[0] << 0 << 4 << QDeclarativeTextInput::SelectWords << 0 << 4 << false; + QTest::newRow("<(the )quick>|words,rtl") + << standard[0] << 4 << 0 << QDeclarativeTextInput::SelectWords << 0 << 9 << false; + QTest::newRow("<lazy( dog)>|words,ltr") + << standard[0] << 40 << 44 << QDeclarativeTextInput::SelectWords << 36 << 44 << false; + QTest::newRow("lazy<( dog)>|words,rtl") + << standard[0] << 44 << 40 << QDeclarativeTextInput::SelectWords << 40 << 44 << false; + QTest::newRow("<fox( jumped )>over|words,ltr") + << standard[0] << 19 << 27 << QDeclarativeTextInput::SelectWords << 16 << 27 << false; + QTest::newRow("fox<( jumped )over>|words,rtl") + << standard[0] << 27 << 19 << QDeclarativeTextInput::SelectWords << 19 << 31 << false; + QTest::newRow("<th(e qu)ick>|words") << standard[0] << 2 << 6 << QDeclarativeTextInput::SelectWords << 0 << 9 << true; - QTest::newRow("la(zy d)og|words") + QTest::newRow("<la(zy d)og|words>") << standard[0] << 38 << 42 << QDeclarativeTextInput::SelectWords << 36 << 44 << true; - QTest::newRow("jum(ped ov)er|words") + QTest::newRow("<jum(ped ov)er>|words") << standard[0] << 23 << 29 << QDeclarativeTextInput::SelectWords << 20 << 31 << true; - QTest::newRow("()the|words") + QTest::newRow("<()>the|words") << standard[0] << 0 << 0 << QDeclarativeTextInput::SelectWords << 0 << 0 << true; - QTest::newRow("dog()|words") + QTest::newRow("dog<()>|words") << standard[0] << 44 << 44 << QDeclarativeTextInput::SelectWords << 44 << 44 << true; - QTest::newRow("jum()ped|words") + QTest::newRow("jum<()>ped|words") << standard[0] << 23 << 23 << QDeclarativeTextInput::SelectWords << 23 << 23 << true; - QTest::newRow("Hello(,) |words") + QTest::newRow("Hello<(,)> |words") << standard[2] << 5 << 6 << QDeclarativeTextInput::SelectWords << 5 << 6 << true; - QTest::newRow("Hello(, )|words") - << standard[2] << 5 << 7 << QDeclarativeTextInput::SelectWords << 5 << 6 << true; - QTest::newRow("Hel(lo, )|words") - << standard[2] << 3 << 7 << QDeclarativeTextInput::SelectWords << 0 << 6 << true; - QTest::newRow("Hel(lo),|words") + QTest::newRow("Hello<(, )>world|words,ltr") + << standard[2] << 5 << 7 << QDeclarativeTextInput::SelectWords << 5 << 7 << false; + QTest::newRow("Hello<(, )world>|words,rtl") + << standard[2] << 7 << 5 << QDeclarativeTextInput::SelectWords << 5 << 12 << false; + QTest::newRow("<Hel(lo, )>world|words,ltr") + << standard[2] << 3 << 7 << QDeclarativeTextInput::SelectWords << 0 << 7 << false; + QTest::newRow("<Hel(lo, )world>|words,rtl") + << standard[2] << 7 << 3 << QDeclarativeTextInput::SelectWords << 0 << 12 << false; + QTest::newRow("<Hel(lo)>,|words") << standard[2] << 3 << 5 << QDeclarativeTextInput::SelectWords << 0 << 5 << true; - QTest::newRow("Hello(),|words") + QTest::newRow("Hello<()>,|words") << standard[2] << 5 << 5 << QDeclarativeTextInput::SelectWords << 5 << 5 << true; - QTest::newRow("Hello,()|words") + QTest::newRow("Hello,<()>|words") << standard[2] << 6 << 6 << QDeclarativeTextInput::SelectWords << 6 << 6 << true; - QTest::newRow("Hello,( )|words") - << standard[2] << 6 << 7 << QDeclarativeTextInput::SelectWords << 7 << 7 << false; - QTest::newRow("Hello,( )|words,reversed") - << standard[2] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 6 << false; - QTest::newRow("Hello,( world)|words") - << standard[2] << 6 << 12 << QDeclarativeTextInput::SelectWords << 7 << 12 << true; - QTest::newRow("Hello,( world!)|words") - << standard[2] << 6 << 13 << QDeclarativeTextInput::SelectWords << 7 << 13 << true; - QTest::newRow("Hello(, world!)|words") + QTest::newRow("Hello<,( )>world|words,ltr") + << standard[2] << 6 << 7 << QDeclarativeTextInput::SelectWords << 5 << 7 << false; + QTest::newRow("Hello,<( )world>|words,rtl") + << standard[2] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world)>|words,ltr") + << standard[2] << 6 << 12 << QDeclarativeTextInput::SelectWords << 5 << 12 << false; + QTest::newRow("Hello,<( world)>|words,rtl") + << standard[2] << 12 << 6 << QDeclarativeTextInput::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world!)>|words,ltr") + << standard[2] << 6 << 13 << QDeclarativeTextInput::SelectWords << 5 << 13 << false; + QTest::newRow("Hello,<( world!)>|words,rtl") + << standard[2] << 13 << 6 << QDeclarativeTextInput::SelectWords << 6 << 13 << false; + QTest::newRow("Hello<(, world!)>|words") << standard[2] << 5 << 13 << QDeclarativeTextInput::SelectWords << 5 << 13 << true; - QTest::newRow("world(!)|words") - << standard[2] << 12 << 13 << QDeclarativeTextInput::SelectWords << 12 << 13 << true; - QTest::newRow("world!())|words") + // Fails due to an issue with QTextBoundaryFinder and punctuation at the end of strings. + // QTBUG-11365 + // QTest::newRow("world<(!)>|words") + // << standard[2] << 12 << 13 << QDeclarativeTextInput::SelectWords << 12 << 13 << true; + QTest::newRow("world!<()>)|words") << standard[2] << 13 << 13 << QDeclarativeTextInput::SelectWords << 13 << 13 << true; - QTest::newRow("world()!)|words") + QTest::newRow("world<()>!)|words") << standard[2] << 12 << 12 << QDeclarativeTextInput::SelectWords << 12 << 12 << true; - QTest::newRow("(,)olleH |words") + QTest::newRow("<(,)>olleH |words") << standard[3] << 7 << 8 << QDeclarativeTextInput::SelectWords << 7 << 8 << true; - QTest::newRow("( ,)olleH|words") - << standard[3] << 6 << 8 << QDeclarativeTextInput::SelectWords << 7 << 8 << true; - QTest::newRow("( ,ol)leH|words") - << standard[3] << 6 << 10 << QDeclarativeTextInput::SelectWords << 7 << 13 << true; - QTest::newRow(",(ol)leH,|words") + QTest::newRow("<dlrow( ,)>olleH|words,ltr") + << standard[3] << 6 << 8 << QDeclarativeTextInput::SelectWords << 1 << 8 << false; + QTest::newRow("dlrow<( ,)>olleH|words,rtl") + << standard[3] << 8 << 6 << QDeclarativeTextInput::SelectWords << 6 << 8 << false; + QTest::newRow("<dlrow( ,ol)leH>|words,ltr") + << standard[3] << 6 << 10 << QDeclarativeTextInput::SelectWords << 1 << 13 << false; + QTest::newRow("dlrow<( ,ol)leH>|words,rtl") + << standard[3] << 10 << 6 << QDeclarativeTextInput::SelectWords << 6 << 13 << false; + QTest::newRow(",<(ol)leH>,|words") << standard[3] << 8 << 10 << QDeclarativeTextInput::SelectWords << 8 << 13 << true; - QTest::newRow(",()olleH|words") + QTest::newRow(",<()>olleH|words") << standard[3] << 8 << 8 << QDeclarativeTextInput::SelectWords << 8 << 8 << true; - QTest::newRow("(),olleH|words") + QTest::newRow("<()>,olleH|words") << standard[3] << 7 << 7 << QDeclarativeTextInput::SelectWords << 7 << 7 << true; - QTest::newRow("( ),olleH|words") - << standard[3] << 6 << 7 << QDeclarativeTextInput::SelectWords << 7 << 7 << false; - QTest::newRow("( ),olleH|words,reversed") - << standard[3] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 6 << false; - QTest::newRow("(dlrow ),olleH|words") - << standard[3] << 1 << 7 << QDeclarativeTextInput::SelectWords << 1 << 6 << true; - QTest::newRow("(!dlrow ),olleH|words") - << standard[3] << 0 << 7 << QDeclarativeTextInput::SelectWords << 0 << 6 << true; + QTest::newRow("<dlrow( )>,olleH|words,ltr") + << standard[3] << 6 << 7 << QDeclarativeTextInput::SelectWords << 1 << 7 << false; + QTest::newRow("dlrow<( ),>olleH|words,rtl") + << standard[3] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 8 << false; + QTest::newRow("<(dlrow )>,olleH|words,ltr") + << standard[3] << 1 << 7 << QDeclarativeTextInput::SelectWords << 1 << 7 << false; + QTest::newRow("<(dlrow ),>olleH|words,rtl") + << standard[3] << 7 << 1 << QDeclarativeTextInput::SelectWords << 1 << 8 << false; + QTest::newRow("<(!dlrow )>,olleH|words,ltr") + << standard[3] << 0 << 7 << QDeclarativeTextInput::SelectWords << 0 << 7 << false; + QTest::newRow("<(!dlrow ),>olleH|words,rtl") + << standard[3] << 7 << 0 << QDeclarativeTextInput::SelectWords << 0 << 8 << false; QTest::newRow("(!dlrow ,)olleH|words") << standard[3] << 0 << 8 << QDeclarativeTextInput::SelectWords << 0 << 8 << true; - QTest::newRow("(!)dlrow|words") + QTest::newRow("<(!)>dlrow|words") << standard[3] << 0 << 1 << QDeclarativeTextInput::SelectWords << 0 << 1 << true; - QTest::newRow("()!dlrow|words") + QTest::newRow("<()>!dlrow|words") << standard[3] << 0 << 0 << QDeclarativeTextInput::SelectWords << 0 << 0 << true; - QTest::newRow("!()dlrow|words") + QTest::newRow("!<()>dlrow|words") << standard[3] << 1 << 1 << QDeclarativeTextInput::SelectWords << 1 << 1 << true; } @@ -566,6 +599,7 @@ void tst_qdeclarativetextinput::moveCursorSelection() textinputObject->setCursorPosition(cursorPosition); textinputObject->moveCursorSelection(movePosition, mode); + QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); QCOMPARE(textinputObject->selectionStart(), selectionStart); QCOMPARE(textinputObject->selectionEnd(), selectionEnd); @@ -573,11 +607,167 @@ void tst_qdeclarativetextinput::moveCursorSelection() textinputObject->setCursorPosition(movePosition); textinputObject->moveCursorSelection(cursorPosition, mode); + QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); QCOMPARE(textinputObject->selectionStart(), selectionStart); QCOMPARE(textinputObject->selectionEnd(), selectionEnd); } } +void tst_qdeclarativetextinput::moveCursorSelectionSequence_data() +{ + QTest::addColumn<QString>("testStr"); + QTest::addColumn<int>("cursorPosition"); + QTest::addColumn<int>("movePosition1"); + QTest::addColumn<int>("movePosition2"); + QTest::addColumn<int>("selection1Start"); + QTest::addColumn<int>("selection1End"); + QTest::addColumn<int>("selection2Start"); + QTest::addColumn<int>("selection2End"); + + QTest::newRow("the {<quick( bro)wn> f^ox} jumped|ltr") + << standard[0] + << 9 << 13 << 17 + << 4 << 15 + << 4 << 19; + QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl") + << standard[0] + << 13 << 9 << 17 + << 9 << 15 + << 10 << 19; + QTest::newRow("the {<quick( bro)wn> ^}fox jumped|ltr") + << standard[0] + << 9 << 13 << 16 + << 4 << 15 + << 4 << 16; + QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl") + << standard[0] + << 13 << 9 << 16 + << 9 << 15 + << 10 << 16; + QTest::newRow("the {<quick( bro)wn^>} fox jumped|ltr") + << standard[0] + << 9 << 13 << 15 + << 4 << 15 + << 4 << 15; + QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl") + << standard[0] + << 13 << 9 << 15 + << 9 << 15 + << 10 << 15; + QTest::newRow("the {<quick() ^}bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 10 + << 4 << 15 + << 4 << 10; + QTest::newRow("the quick<( {^bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 10 + << 9 << 15 + << 10 << 15; + QTest::newRow("the {<quick^}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 9 + << 4 << 15 + << 4 << 9; + QTest::newRow("the quick{<(^ bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 9 + << 9 << 15 + << 9 << 15; + QTest::newRow("the {<qui^ck}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 7 + << 4 << 15 + << 4 << 9; + QTest::newRow("the {<qui^ck}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 7 + << 9 << 15 + << 4 << 15; + QTest::newRow("the {<^quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 4 + << 4 << 15 + << 4 << 9; + QTest::newRow("the {<^quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 4 + << 9 << 15 + << 4 << 15; + QTest::newRow("the{^ <quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 3 + << 4 << 15 + << 3 << 9; + QTest::newRow("the{^ <quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 3 + << 9 << 15 + << 3 << 15; + QTest::newRow("{t^he <quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 1 + << 4 << 15 + << 0 << 9; + QTest::newRow("{t^he <quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 1 + << 9 << 15 + << 0 << 15; + + QTest::newRow("{<He(ll)o>, w^orld}!|ltr") + << standard[2] + << 2 << 4 << 8 + << 0 << 5 + << 0 << 12; + QTest::newRow("{<He(ll)o>, w^orld}!|rtl") + << standard[2] + << 4 << 2 << 8 + << 0 << 5 + << 0 << 12; + + QTest::newRow("!{dlro^w ,<o(ll)eH>}|ltr") + << standard[3] + << 9 << 11 << 5 + << 8 << 13 + << 1 << 13; + QTest::newRow("!{dlro^w ,<o(ll)eH>}|rtl") + << standard[3] + << 11 << 9 << 5 + << 8 << 13 + << 1 << 13; +} + +void tst_qdeclarativetextinput::moveCursorSelectionSequence() +{ + QFETCH(QString, testStr); + QFETCH(int, cursorPosition); + QFETCH(int, movePosition1); + QFETCH(int, movePosition2); + QFETCH(int, selection1Start); + QFETCH(int, selection1End); + QFETCH(int, selection2Start); + QFETCH(int, selection2End); + + QString componentStr = "import QtQuick 1.1\nTextInput { text: \""+ testStr +"\"; }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast<QDeclarativeTextInput*>(textinputComponent.create()); + QVERIFY(textinputObject != 0); + + textinputObject->setCursorPosition(cursorPosition); + + textinputObject->moveCursorSelection(movePosition1, QDeclarativeTextInput::SelectWords); + QCOMPARE(textinputObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start)); + QCOMPARE(textinputObject->selectionStart(), selection1Start); + QCOMPARE(textinputObject->selectionEnd(), selection1End); + + textinputObject->moveCursorSelection(movePosition2, QDeclarativeTextInput::SelectWords); + QCOMPARE(textinputObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start)); + QCOMPARE(textinputObject->selectionStart(), selection2Start); + QCOMPARE(textinputObject->selectionEnd(), selection2End); +} + void tst_qdeclarativetextinput::dragMouseSelection() { QString qmlfile = SRCDIR "/data/mouseselection_true.qml"; @@ -623,6 +813,55 @@ void tst_qdeclarativetextinput::dragMouseSelection() delete canvas; } +void tst_qdeclarativetextinput::mouseSelectionMode_data() +{ + QTest::addColumn<QString>("qmlfile"); + QTest::addColumn<bool>("selectWords"); + + // import installed + QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true; + QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false; + QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false; +} + +void tst_qdeclarativetextinput::mouseSelectionMode() +{ + QFETCH(QString, qmlfile); + QFETCH(bool, selectWords); + + QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *textInputObject = qobject_cast<QDeclarativeTextInput *>(canvas->rootObject()); + QVERIFY(textInputObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textInputObject->height()/2; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str = textInputObject->selectedText(); + if (selectWords) { + QCOMPARE(str, text); + } else { + QVERIFY(str.length() > 3); + QVERIFY(str != text); + } + + delete canvas; +} + void tst_qdeclarativetextinput::horizontalAlignment_data() { QTest::addColumn<int>("hAlign"); @@ -1198,6 +1437,17 @@ public: closeInputPanelReceived = true; return QInputContext::filterEvent(event); } + + void sendPreeditText(const QString &text, int cursor) + { + QList<QInputMethodEvent::Attribute> attributes; + attributes.append(QInputMethodEvent::Attribute( + QInputMethodEvent::Cursor, cursor, text.length(), QVariant())); + + QInputMethodEvent event(text, attributes); + sendEvent(event); + } + bool openInputPanelReceived; bool closeInputPanelReceived; }; @@ -1368,6 +1618,16 @@ void tst_qdeclarativetextinput::openInputPanelOnFocus() QApplication::processEvents(); QVERIFY(view.inputContext() == 0); QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); + + // input method should not be enabled + // if TextEdit is read only. + input.setReadOnly(true); + ic.openInputPanelReceived = false; + input.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); } class MyTextInput : public QDeclarativeTextInput @@ -1434,6 +1694,112 @@ void tst_qdeclarativetextinput::geometrySignals() delete o; } +void tst_qdeclarativetextinput::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; TextInput { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; TextInput { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_qdeclarativetextinput::testQtQuick11Attributes_data() +{ + QTest::addColumn<QString>("code"); + QTest::addColumn<QString>("warning"); + QTest::addColumn<QString>("error"); + + QTest::newRow("canPaste") << "property bool foo: canPaste" + << "<Unknown File>:1: ReferenceError: Can't find variable: canPaste" + << ""; + + QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)" + << "<Unknown File>:1: ReferenceError: Can't find variable: moveCursorSelection" + << ""; + + QTest::newRow("deselect") << "Component.onCompleted: deselect()" + << "<Unknown File>:1: ReferenceError: Can't find variable: deselect" + << ""; +} + +void tst_qdeclarativetextinput::preeditAutoScroll() +{ + QString committedText = "super"; + QString preeditText = "califragisiticexpialidocious!"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextInput input; + input.setWidth(QFontMetricsF(input.font()).width(committedText)); + input.setText(committedText); + input.setPos(0, 0); + input.setFocus(true); + scene.addItem(&input); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view)); + + // test the text is scrolled so the preedit is visible. + ic.sendPreeditText(preeditText.mid(0, 3), 1); + QVERIFY(input.positionAt(0) != 0); + QCOMPARE(input.positionAt(input.width()), 8); + + // test the text is scrolled back when the preedit is removed. + ic.sendEvent(QInputMethodEvent()); + QCOMPARE(input.positionAt(0), 0); + QCOMPARE(input.positionAt(input.width()), 5); + + // test if the preedit is larger than the text input that the + // character preceding the cursor is still visible. + for (int i = 0; i < 3; ++i) { + ic.sendPreeditText(preeditText, i + 1); + QCOMPARE(input.positionAt(0), 5 + i); + } + for (int i = 1; i >= 0; --i) { + ic.sendPreeditText(preeditText, i + 1); + QCOMPARE(input.positionAt(0), 5 + i); + } + + // Test incrementing the preedit cursor doesn't cause further + // scrolling when right most text is visible. + ic.sendPreeditText(preeditText, preeditText.length() - 3); + int position = input.positionAt(0); + for (int i = 2; i >= 0; --i) { + ic.sendPreeditText(preeditText, preeditText.length() - i); + QCOMPARE(input.positionAt(0), position); + } + for (int i = 1; i < 3; ++i) { + ic.sendPreeditText(preeditText, preeditText.length() - i); + QCOMPARE(input.positionAt(0), position); + } + + // Test disabling auto scroll. + ic.sendEvent(QInputMethodEvent()); + + input.setAutoScroll(false); + ic.sendPreeditText(preeditText.mid(0, 3), 1); + QCOMPARE(input.positionAt(0), 0); + QCOMPARE(input.positionAt(input.width()), 5); +} + QTEST_MAIN(tst_qdeclarativetextinput) #include "tst_qdeclarativetextinput.moc" diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js new file mode 100644 index 0000000..f589b0e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js @@ -0,0 +1,6 @@ +WorkerScript.onMessage = function(msg) { + var a = 123 + var b = 345 + var f = getData() +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js new file mode 100644 index 0000000..1d6eab2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js @@ -0,0 +1,5 @@ +WorkerScript.onMessage = function(msg) { + var a = 123 + aoij awef aljfaow eij +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml new file mode 100644 index 0000000..90c4617 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +BaseWorker { + source: "script_error_onCall.js" +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml new file mode 100644 index 0000000..0b9d21d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +BaseWorker { + source: "script_error_onLoad.js" +} + + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp index aaedd82..4b922fb 100644 --- a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp +++ b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp @@ -41,6 +41,8 @@ #include <qtest.h> #include <QtCore/qdebug.h> #include <QtCore/qtimer.h> +#include <QtCore/qdir.h> +#include <QtCore/qfileinfo.h> #include <QtScript/qscriptengine.h> #include <QtDeclarative/qdeclarativecomponent.h> @@ -58,6 +60,13 @@ Q_DECLARE_METATYPE(QScriptValue) #define SRCDIR "." #endif +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(filename)); +} + + class tst_QDeclarativeWorkerScript : public QObject { Q_OBJECT @@ -70,6 +79,8 @@ private slots: void messaging_sendQObjectList(); void messaging_sendJsObject(); void script_with_pragma(); + void scriptError_onLoad(); + void scriptError_onCall(); private: void waitForEchoMessage(QDeclarativeWorkerScript *worker) { @@ -215,6 +226,47 @@ void tst_QDeclarativeWorkerScript::script_with_pragma() delete worker; } +static QString qdeclarativeworkerscript_lastWarning; +static void qdeclarativeworkerscript_warningsHandler(QtMsgType type, const char *msg) +{ + if (type == QtWarningMsg) + qdeclarativeworkerscript_lastWarning = QString::fromUtf8(msg); +} + +void tst_QDeclarativeWorkerScript::scriptError_onLoad() +{ + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_error_onLoad.qml"); + + QtMsgHandler previousMsgHandler = qInstallMsgHandler(qdeclarativeworkerscript_warningsHandler); + QDeclarativeWorkerScript *worker = qobject_cast<QDeclarativeWorkerScript*>(component.create()); + QVERIFY(worker != 0); + + QTRY_COMPARE(qdeclarativeworkerscript_lastWarning, + TEST_FILE("data/script_error_onLoad.js").toString() + QLatin1String(":3: SyntaxError: Parse error")); + + qInstallMsgHandler(previousMsgHandler); + qApp->processEvents(); + delete worker; +} + +void tst_QDeclarativeWorkerScript::scriptError_onCall() +{ + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_error_onCall.qml"); + QDeclarativeWorkerScript *worker = qobject_cast<QDeclarativeWorkerScript*>(component.create()); + QVERIFY(worker != 0); + + QtMsgHandler previousMsgHandler = qInstallMsgHandler(qdeclarativeworkerscript_warningsHandler); + QVariant value; + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value))); + + QTRY_COMPARE(qdeclarativeworkerscript_lastWarning, + TEST_FILE("data/script_error_onCall.js").toString() + QLatin1String(":4: ReferenceError: Can't find variable: getData")); + + qInstallMsgHandler(previousMsgHandler); + qApp->processEvents(); + delete worker; +} + QTEST_MAIN(tst_QDeclarativeWorkerScript) diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png Binary files differnew file mode 100644 index 0000000..431bed8 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png Binary files differnew file mode 100644 index 0000000..d8d6bac --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png Binary files differnew file mode 100644 index 0000000..27e02e5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png Binary files differnew file mode 100644 index 0000000..00549b3 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png Binary files differnew file mode 100644 index 0000000..5c2a885 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png Binary files differnew file mode 100644 index 0000000..5c2a885 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png Binary files differnew file mode 100644 index 0000000..fd7f010 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml new file mode 100644 index 0000000..dff5452 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml @@ -0,0 +1,3551 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickableEdit.0.png" + } + Frame { + msec: 32 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 48 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 64 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 80 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 96 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 112 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 128 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 144 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 160 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 176 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 192 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 208 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 224 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 240 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 256 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 272 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 288 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 304 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 320 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 336 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 352 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 368 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 384 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 400 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 416 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 432 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 448 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 464 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 480 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 496 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 512 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 528 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 544 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 560 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 576 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 592 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 608 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 624 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 640 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 656 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 672 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 688 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 704 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 720 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 736 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 752 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 768 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 784 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 800 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 816 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 832 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 848 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 864 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 880 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 896 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 29; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 928 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 944 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 960 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 976 + image: "flickableEdit.1.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 32; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 34; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 36; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1024 + hash: "4626e25f67dfd0fe3846322455762b3b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1040 + hash: "4626e25f67dfd0fe3846322455762b3b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "e506425ea4a8eb6d94442ac0bccd0911" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "3c45be5d00748154f9abce8d525b5791" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1088 + hash: "3e33ff0dfd478bad91472fa2bb4908a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "3e33ff0dfd478bad91472fa2bb4908a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "e8e7e98f3d7dbcdb4040ae81ef656e02" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "e8e7e98f3d7dbcdb4040ae81ef656e02" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 78; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "309c25ff85a361dfebd6464984fd9d79" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 83; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1168 + hash: "4b4fc7d9263af761222bb23f41021731" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "4b4fc7d9263af761222bb23f41021731" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "bd00eeda31cfc8d59a2c9677e771dadb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "adce307d674b8425fa39b69958d6acc5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1232 + hash: "36e04d9124f32a21784f3017cc26ee71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1248 + hash: "36e04d9124f32a21784f3017cc26ee71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "c6548ac358dd0eb4fa07ed305039d4e2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "a0c4b8e21b0b04edaf7b32b2ab40edb2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "a0c4b8e21b0b04edaf7b32b2ab40edb2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 134; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "d32fb36408859c35dacc5787374b6ae4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "d32fb36408859c35dacc5787374b6ae4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 141; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "d32fb36408859c35dacc5787374b6ae4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 144; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "90f44df899138e894b1a7e42657b8331" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 147; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1376 + hash: "90f44df899138e894b1a7e42657b8331" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "8ec6bb08aac10a622df934421f64beb4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 150; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1408 + hash: "d4e52b7ca07033e4f2124607454fd81b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 152; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1424 + hash: "499d7c3d9cfb35db68f6eece23130e6b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1440 + hash: "499d7c3d9cfb35db68f6eece23130e6b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1456 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1472 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1488 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Frame { + msec: 1504 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1520 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1536 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1552 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1568 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1584 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1600 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1616 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1632 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1648 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1664 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1680 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1696 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1712 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1728 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1744 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1760 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1776 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1792 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1808 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1824 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1840 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 170; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1872 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1888 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1904 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1920 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 1936 + image: "flickableEdit.2.png" + } + Frame { + msec: 1952 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 1968 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 1984 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2000 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2016 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2032 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2048 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2064 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2080 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2096 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2112 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2128 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2144 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2160 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2176 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2192 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2208 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2224 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2240 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2256 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2272 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2288 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2304 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2320 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2336 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2352 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2368 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2384 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2400 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2416 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2432 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2448 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2464 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2480 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2496 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2512 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2528 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2544 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2560 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2576 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2592 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2608 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2624 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2640 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2656 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2672 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2688 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2704 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 21; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2736 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2752 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2768 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2784 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2800 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2816 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2832 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2848 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2864 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2880 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2896 + image: "flickableEdit.3.png" + } + Frame { + msec: 2912 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2928 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2960 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2992 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 25; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "e5daa45e1d798fdf2562dbb9a1a2c97b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 31; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "698b572adf95ddc235b781b126a1cc10" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "7a87fe9484b00f8c7039e3129fc24fb5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 37; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "2f17e7980a28789d0f262e3682c2da27" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 42; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "0757f4c05233a25e6a8825b2c6052d8d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3136 + hash: "799da712f376033efdbaf9a342e4bc3f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "bf7b2a29664fe4acf52d56c73cf079b1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3168 + hash: "7928b280e7a9ab89217c9abf3b709cd2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "3102339f3e18640f6b508e88aafefb79" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 78; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3200 + hash: "98cddfbea5b96f9dd08c5a3655155d35" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "5604b2f85c3a90f8b29da3fec2f6c509" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3232 + hash: "5ca4055c8dded5d30c326d6d304da28d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "b0afe256f8f89a77a5fa87c023cda469" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "d7408be78c80e2b6e5848ee696a79ee0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "f7e12621527fd52e21595cfbf804879c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "6b8c9413ba1a791e42b06aaa711cdb4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3312 + hash: "1c80e0f89033dedc66b236561042f4f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "6ec06d8844ff57e34af5316895250858" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "f3c0159243555e919fd736866b00a5ab" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "973ced5d6155240490acd6241610429d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "0aee5feb94508f70c62cc3255c53bc8a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 182; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "840cc661a50dd8bc1af8f6d53ccbece5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 187; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "34a470358ccfb7592cf47399ab6dbc19" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "25c53ff3977ca8422c545c1608782833" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 202; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3440 + hash: "d4388550549d54e31640cda4672c3bfb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 213; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3456 + hash: "8904c3b225a5e732fca4fc605d0fc12a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 216; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 219; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3472 + hash: "415a630fc6a963e99a0e13bf5e461849" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 223; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 226; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "1526e90e0345e20a3455554c8f249de7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 229; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 233; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3504 + hash: "2b215748d63e505469d343919b245af9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 235; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 238; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3520 + hash: "6821e559cb1e45b0cd731c90c3b16934" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 241; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 243; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "334ddaa8c2cd0506528fe20a21991b03" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 245; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 247; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3552 + hash: "6e651889e91d3de96d9aaf91f4ed9a2c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 250; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 251; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3568 + hash: "0554f22d8079ef0213dc25f9f1b59055" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 252; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 253; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3584 + hash: "1eb0805e4c706af1c7cfa113d32edda1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 255; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 256; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3600 + hash: "482f30ca992e9f92241523a47125d9b4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 257; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 259; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3616 + hash: "6b2bec317fad51fe85bab6a00ced9655" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 261; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 262; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "acc661684f507375518fc73fe081f61e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 263; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 265; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "f77143d0d7a3cf8c0163bf950940ad07" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 267; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "8d0407ae3f55305e1d9780deaa30c064" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3680 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 3696 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 3712 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3728 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3744 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3760 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3776 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3792 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3808 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3824 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3840 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3856 + image: "flickableEdit.4.png" + } + Frame { + msec: 3872 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3888 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3904 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3920 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3936 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3952 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3968 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3984 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4000 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4016 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4032 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4048 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4064 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4080 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4096 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4112 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4128 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4144 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4160 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4176 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4192 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4208 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4224 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4240 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4256 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4272 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4288 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4304 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4320 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4336 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4352 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4368 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4384 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4400 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4416 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4432 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4448 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4464 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4480 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4496 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4512 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4528 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4544 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4560 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4576 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4592 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4608 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4624 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4640 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4656 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4672 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4688 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4704 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4720 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4736 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4752 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4768 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4784 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4800 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4816 + image: "flickableEdit.5.png" + } + Frame { + msec: 4832 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4848 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4864 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4880 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4896 + hash: "e5a6693779ffb4e8a333756690a8f9e0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 264; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 262; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4912 + hash: "6acabe70146611091621ef5079cc97ec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 259; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 256; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "f75b5eaa04bfec866f088f665edb225e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 253; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 249; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4944 + hash: "1888acd9f3e48348c22e324d67ab2724" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 245; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 240; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4960 + hash: "cd24be347f20371f9d0796fa4a38ad0c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 235; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 231; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4976 + hash: "f39bc67a8e83340f8e89cf11c89fb27c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 227; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 222; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4992 + hash: "80d8019485231c061ba1cf81fd4c42ca" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 217; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 213; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5008 + hash: "72893900dfd007ea25a7d75982be6320" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5024 + hash: "f3d02c4d2f0b8b75b0b6159c0ba8f4db" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5040 + hash: "8ecdf1325bb2084bf6212216bd86b324" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 27 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 186; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5056 + hash: "be5c62268b337c9d7f69ab01b02c816d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 182; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 178; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5072 + hash: "a0eea6c818a1cb71809aff4613e9655d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5088 + hash: "27fcf1d4cd00dc7ac54fa92f9c7e2ac2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5104 + hash: "32f6bdc5e2f6ce34436a21dd8ee348dd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5120 + hash: "4c11c9075429acd4acddc6ede4e5fe69" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5136 + hash: "8fdaf03e0b03698613092303945787d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5152 + hash: "d9bc269f21d5eade8bb9555d05a86744" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 22 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5168 + hash: "f9dd0735682dba198febffcc85c9835a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5184 + hash: "a98869bb654e3b4c1f4d9d0e7e24197a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5200 + hash: "50ceb9d6d58129b71009079a0028e7c4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5216 + hash: "6b8c9413ba1a791e42b06aaa711cdb4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5232 + hash: "f7e12621527fd52e21595cfbf804879c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5248 + hash: "d7408be78c80e2b6e5848ee696a79ee0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5264 + hash: "e648f25a978b9f14cf71d5f1d90edf15" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5280 + hash: "64ce73aa32f2c08f4cee9a35a103a1d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 88; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5296 + hash: "1db1d100eb1f97a7c85ab8df3e558188" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5312 + hash: "5604b2f85c3a90f8b29da3fec2f6c509" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5328 + hash: "fb57c6295d512821945754020ea6a3ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5344 + hash: "14dfd5b78901c9f63e4f5d0889f77805" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5360 + hash: "cc105198e78269be1240785b791c8612" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5376 + hash: "1ef97830b4f1be66a4f443ee4573547b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5392 + hash: "0ef86edc381e75c39ba067404817edb8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 63; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 60; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5408 + hash: "6a7605f59eb364fbc166aeea7b54695a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5424 + hash: "e86bb3698ad8b46e70237088ea056ab0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5440 + hash: "56db36cde05d74d6bf8eec0b21515b20" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5456 + hash: "05adc602e827635ca43c0cff2b5b857d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5472 + hash: "cbdcdf9b7e640a79e2269247bb4d6cc2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5488 + hash: "bc014e9feb5e69c4042385a6753d1884" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 38; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 37; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5504 + hash: "544e9ddbedae500955e6cec79eae709c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5520 + hash: "ec17a9dba3846c1919b67eaf3d234471" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 28; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5536 + hash: "8ab538f8baa170798c93e6eb4d5441f8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5552 + hash: "1b1636fecff90e602b87dbf84a986d2a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 25; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5568 + hash: "27a84ee3fb8b306e22e50ba753828b7c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5584 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5600 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 23; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5616 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5632 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5648 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5664 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5680 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5696 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5712 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5728 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5744 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5760 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5776 + image: "flickableEdit.6.png" + } + Frame { + msec: 5792 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5808 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5824 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5840 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5856 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5872 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5888 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5904 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5920 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5936 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5952 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5968 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5984 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6000 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6016 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6032 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6048 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6064 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6080 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6096 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6112 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6128 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6144 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6160 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6176 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6192 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6208 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6224 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6240 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6256 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6272 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6288 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6304 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6320 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6336 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6352 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6368 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6384 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6400 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6416 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6432 + hash: "ee9cd90fbe594efb411315a97b702a40" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml new file mode 100644 index 0000000..6913fdd --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +Flickable { + width: 200 + height: 50 + contentWidth: 400 + + Column { + anchors.fill: parent + + TextEdit { + selectByMouse: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + TextEdit { + selectByMouse: false + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png Binary files differnew file mode 100644 index 0000000..431bed8 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png Binary files differnew file mode 100644 index 0000000..9708b4f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png Binary files differnew file mode 100644 index 0000000..7034946 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png Binary files differnew file mode 100644 index 0000000..7c56f00 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png Binary files differnew file mode 100644 index 0000000..431bed8 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png Binary files differnew file mode 100644 index 0000000..30b7a08 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png Binary files differnew file mode 100644 index 0000000..54e13cb --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png Binary files differnew file mode 100644 index 0000000..34c099b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml new file mode 100644 index 0000000..de69c6a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml @@ -0,0 +1,3279 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickableInput.0.png" + } + Frame { + msec: 32 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 48 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 64 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 80 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 96 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 112 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 128 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 144 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 160 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 176 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 192 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 208 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 224 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 240 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 256 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 272 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 288 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 304 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 320 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 336 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 352 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 368 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 384 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 400 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 416 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 432 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 448 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 464 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 480 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 496 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 512 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 528 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 544 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 560 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 576 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 592 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 608 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 624 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 640 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 656 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 672 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 688 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 704 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 720 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 736 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 752 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 768 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 39; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Frame { + msec: 800 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Frame { + msec: 816 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Frame { + msec: 832 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 848 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 864 + hash: "c54c442eb01186dc8d5be7ff7b242aa1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 880 + hash: "8eb5252ed783eae4dd998ea5a451c6bb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 896 + hash: "f80423adedb40b1c9ed88bb171590626" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "afb2d22b60113d05b038fd09b5966151" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 928 + hash: "e0a4a243acd0c4f3960ea77fdb5e30c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "24c5185a748dc4b02fdd40fd2d0420ff" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 960 + hash: "e271a2cd9847828da3e39c1e618f828a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 7 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "flickableInput.1.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 7 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "3f40064784f716ce75ef9390d90a1eac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 6 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "77a95b3d8d4682eb8e613bd86ea7b3c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1024 + hash: "308ea214fc63e47141623bc436df0efc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 150; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1040 + hash: "3e0a860238ab282aebd733a92321f86f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 156; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "ed4c6a18ed003922f5724ebc8e798c6c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "ed4c6a18ed003922f5724ebc8e798c6c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 163; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1088 + hash: "90bc837ada7b6cd08028e790b1a87ae2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "90bc837ada7b6cd08028e790b1a87ae2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 173; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1168 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1216 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1232 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1248 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1264 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1280 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1296 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1312 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1328 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1344 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1360 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1376 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 176; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1408 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1424 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1440 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1456 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1472 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1488 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1504 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1520 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1536 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1552 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1568 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1584 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1600 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1616 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1632 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1648 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1664 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1680 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1696 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1712 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1728 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1744 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1760 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1776 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1792 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1808 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1824 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1840 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1856 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1872 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1888 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1904 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1920 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1936 + image: "flickableInput.2.png" + } + Frame { + msec: 1952 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1968 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1984 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2000 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2016 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2032 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2048 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2064 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2080 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2096 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2112 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2128 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2144 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2160 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2176 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2192 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2208 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2224 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2240 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2256 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2272 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2288 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 17; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2304 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2320 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2336 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2352 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2368 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2384 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2400 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2416 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2432 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 13 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2448 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 15 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2464 + hash: "6865c870740497e31dfeb91e09737206" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "541acf0d74762064d970506a40f6600b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "956939b887f2bb0d45400214685f1fac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "956939b887f2bb0d45400214685f1fac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "3eff05a088e55df16f0b30546ad8c87f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "3eff05a088e55df16f0b30546ad8c87f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2560 + hash: "5b0488fc2a7f840f73d4fc9d17a5a738" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2576 + hash: "e17d039213c12708ff378789705e281a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2592 + hash: "2e2eaab559d0dd7543c2e6e17e0f7740" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2608 + hash: "49a9baad5178009409e28618a4132544" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2624 + hash: "49a9baad5178009409e28618a4132544" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2640 + hash: "a867fe835626e562d5e060c0b2bc4ea3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2656 + hash: "1479e0feffdff866bfd14cbbf76017c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2672 + hash: "1479e0feffdff866bfd14cbbf76017c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2688 + hash: "dfa99d1eee5ed8d2913c0e603be3ad0e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2704 + hash: "b55abbe5e7d2c3f5cdaf6dcf5a12c00a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "46be0cd1b01d80de8e9d8cd78364fdd4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2736 + hash: "46be0cd1b01d80de8e9d8cd78364fdd4" + } + Frame { + msec: 2752 + hash: "46be0cd1b01d80de8e9d8cd78364fdd4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2768 + hash: "c9ec87a419171b4d6311a36c952eaef1" + } + Frame { + msec: 2784 + hash: "c9ec87a419171b4d6311a36c952eaef1" + } + Frame { + msec: 2800 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2816 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2832 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2848 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2864 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2880 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2896 + image: "flickableInput.3.png" + } + Frame { + msec: 2912 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2928 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2944 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2960 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2976 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2992 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3008 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 17; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3040 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3056 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3072 + hash: "09201585ad57e87efda13c469e1bc95d" + } + Frame { + msec: 3088 + hash: "09201585ad57e87efda13c469e1bc95d" + } + Frame { + msec: 3104 + hash: "b816b96270a846ed5776e6f53d507eb8" + } + Frame { + msec: 3120 + hash: "6ee997c78cadb4357b30db81acf4ee40" + } + Frame { + msec: 3136 + hash: "abbab9e07614915a49fc8f30242932a7" + } + Frame { + msec: 3152 + hash: "47f0d0fe751a8ad3dd3f6341d76c929d" + } + Frame { + msec: 3168 + hash: "0304cbed0c52d5486df52312898fe81d" + } + Frame { + msec: 3184 + hash: "6ac82afa8805f1bdb4c67a2f1a1aff32" + } + Frame { + msec: 3200 + hash: "4cc6db0a1dbe6c70d5e2dfe60fe70a51" + } + Frame { + msec: 3216 + hash: "cf04ff1b13f5aa36470fd8ae23523153" + } + Frame { + msec: 3232 + hash: "20fcdfd24f21125d61ac45cbe94e48a7" + } + Frame { + msec: 3248 + hash: "e017109961b5e6c6701c3045f284ebf7" + } + Frame { + msec: 3264 + hash: "e017109961b5e6c6701c3045f284ebf7" + } + Frame { + msec: 3280 + hash: "c2a770b8c95959f4abf91420c0a3e8b2" + } + Frame { + msec: 3296 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3312 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3328 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3344 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3360 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3376 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3392 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3408 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3424 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3440 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3456 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3472 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3488 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3504 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3520 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3536 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3552 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3568 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3584 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3600 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3616 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3632 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3648 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3664 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3680 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3696 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3712 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3728 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3744 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3760 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3776 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3792 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3808 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3824 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3840 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3856 + image: "flickableInput.4.png" + } + Frame { + msec: 3872 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3888 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3904 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3920 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3936 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3952 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 12; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3968 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 3984 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4000 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4016 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4032 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4048 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 13; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4064 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4080 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4096 + hash: "ab2ea5988d2b3288d3c57369f68933dc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 31; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 36; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4112 + hash: "986834600427959d170d547a1c5ecce0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4128 + hash: "52847e87c1fef2d7357c86abb0944df4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4144 + hash: "bc68a47163712646cf8439459fb0d100" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4160 + hash: "9e9f66e9545c77a2e7ee02d46acd102e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4176 + hash: "4e9e7500185499c5a5f9d65e0e9406a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 83; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4192 + hash: "550d6c645bf694c544734d67e2ae5ac3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4208 + hash: "0736bab3f9c1cec0f944003bebe3d499" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4224 + hash: "efffb9f6d6a7dacf297530b1cb68a713" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4240 + hash: "d5458a8dd8a9bf22e67439c9d8d9c366" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4256 + hash: "2d30acf6dc0e186577bd6f7ce858ab92" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4272 + hash: "e1a926cc5f7a49c9320a8d49c8a1bb3f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4288 + hash: "cfc9c0bca9e269887ad5c67cc684b753" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4304 + hash: "7b561e04ef93399460eb3b4b850c3cab" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4320 + hash: "1c17d036e08b24b47239f9a38df3d87d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4336 + hash: "3ec95ad7622048b68a53cfd3fdeac999" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 133; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4352 + hash: "1e20084ed70b7423885a2d0f06fba660" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 134; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4368 + hash: "f19e136b3c3d57d8b8e63c64b17c29e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4384 + hash: "f19e136b3c3d57d8b8e63c64b17c29e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4400 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4416 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Frame { + msec: 4432 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Frame { + msec: 4448 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Frame { + msec: 4464 + hash: "03c99addee96254d19db72746f1bef11" + } + Frame { + msec: 4480 + hash: "03c99addee96254d19db72746f1bef11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4496 + hash: "cb087b0af44fd7e767b3ff5da1f49790" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4512 + hash: "8c36fa6a9c8bfb66e272c8628aec7077" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4528 + hash: "971154dba58b18b1d82999f5b6a40cc1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "253397b603f99f7d092dda82d794e944" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "f8ded9e6f36a35a73fbe2264321838ca" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4576 + hash: "83b9cec7bbe65ba9d68b089211296116" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4592 + hash: "525ffec3a2d2a7a9e0c82f2c98b09ea0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4608 + hash: "c4fb902f66abebb6b7c3489a073e17d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 172; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 173; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4624 + hash: "0f4526d9f840c0a95e9d145c9822d6e1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4640 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Frame { + msec: 4656 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4672 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4688 + hash: "d6f7a50416c3805aeafbdf55905e8276" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 177; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4704 + hash: "d6f7a50416c3805aeafbdf55905e8276" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 178; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "7586c3d3f46eba4a1abe2fe223e7fde2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 179; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4736 + hash: "7586c3d3f46eba4a1abe2fe223e7fde2" + } + Frame { + msec: 4752 + hash: "7586c3d3f46eba4a1abe2fe223e7fde2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 180; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4784 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4800 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4816 + image: "flickableInput.5.png" + } + Frame { + msec: 4832 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4848 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4864 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4880 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4896 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4912 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4928 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4944 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4960 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 4976 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 4992 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5008 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5024 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5040 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5056 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5072 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5088 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5104 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5120 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5136 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5152 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5168 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5184 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5200 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5216 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5232 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5248 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5264 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5280 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5296 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5312 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5328 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5344 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5360 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5376 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5392 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5408 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5424 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5440 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5456 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5472 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5488 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5504 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5520 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5536 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 177; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5552 + hash: "d6f7a50416c3805aeafbdf55905e8276" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5568 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5584 + hash: "c4fb902f66abebb6b7c3489a073e17d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5600 + hash: "04c6accf277b5bca4c53c1817f85bafe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5616 + hash: "8eb14964fea798ceccc150310a12fd4b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5632 + hash: "83b9cec7bbe65ba9d68b089211296116" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5648 + hash: "e59ae71a5636c48e6befa305eba76ec8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5664 + hash: "73e178775ee01d28cf03378f267753b1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 150; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5680 + hash: "253397b603f99f7d092dda82d794e944" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5696 + hash: "971154dba58b18b1d82999f5b6a40cc1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 144; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5712 + hash: "5bd30e73b37592c06f735541f802f367" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5728 + hash: "cb087b0af44fd7e767b3ff5da1f49790" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5744 + hash: "03c99addee96254d19db72746f1bef11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5760 + hash: "0f76d8a89e383e7e742a3d194d770061" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 133; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + image: "flickableInput.6.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5792 + hash: "f047f32822850b2c0fee18b4a8f8a96a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5808 + hash: "160c8c8447a469291fc2f87c2b6c97ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5824 + hash: "4a9d610f3fa37336c0cab7b4e575713b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "5a00b185983ad89bcf1ceb036c424dd4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "a578449e7df3994d0806f7ee2e5a7815" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 107; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "445cb1ae1934659c3c8b5800bc30fc74" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "ad22110876a867ca80530ca6d132dfe3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 105; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "7a644a888de5691c69543699229ec8ca" + } + Frame { + msec: 5920 + hash: "7a644a888de5691c69543699229ec8ca" + } + Frame { + msec: 5936 + hash: "41c14cc9ea05712aea8d1feb18ca85f3" + } + Frame { + msec: 5952 + hash: "921d476813711e64b9c2272aeff3ed40" + } + Frame { + msec: 5968 + hash: "2dad691263389dce74c99530f188cd20" + } + Frame { + msec: 5984 + hash: "b426ff8ba6d1c52974b117fb8b912b76" + } + Frame { + msec: 6000 + hash: "bbcae0d0547e1cfe9a4db1a6f86bf4b6" + } + Frame { + msec: 6016 + hash: "b8e54bc1a48d7a225cce25c3735c2933" + } + Frame { + msec: 6032 + hash: "b59e0f6eea3c41cedb10ac7a7e2629ef" + } + Frame { + msec: 6048 + hash: "48add89789f9d1be82aedeecf6fda362" + } + Frame { + msec: 6064 + hash: "3cf7a035a5b7dbc81c3da5e99efa5024" + } + Frame { + msec: 6080 + hash: "ff9c7173f7138e273cdbdfa8c6f5fedf" + } + Frame { + msec: 6096 + hash: "bc5e19862dfb38e687d1bfc37690a3b8" + } + Frame { + msec: 6112 + hash: "6ff97512731fd97d3c540245ffff6205" + } + Frame { + msec: 6128 + hash: "290e8c8bf51ced134e965f72a868e467" + } + Frame { + msec: 6144 + hash: "3a63687a5179896572be2e1e0d00766f" + } + Frame { + msec: 6160 + hash: "80f8d13272a23e8816ef45fbbef922fe" + } + Frame { + msec: 6176 + hash: "7888e0ece9522f751417944855824be8" + } + Frame { + msec: 6192 + hash: "3d81f8cde15b7d0b009fc9b46a1144e1" + } + Frame { + msec: 6208 + hash: "3d81f8cde15b7d0b009fc9b46a1144e1" + } + Frame { + msec: 6224 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6240 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6256 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6272 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6288 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6304 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6320 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6336 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6352 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6368 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6384 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6400 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6416 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6432 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6448 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6464 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6480 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6496 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6512 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6528 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6544 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6560 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6576 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6592 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6608 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6624 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6640 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6656 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6672 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6688 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6704 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6720 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6736 + image: "flickableInput.7.png" + } + Frame { + msec: 6752 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6768 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6784 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6800 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6816 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6832 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6848 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6864 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6880 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6896 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6912 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6928 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6944 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6960 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6976 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6992 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7008 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7024 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7040 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7056 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7072 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7088 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7104 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7120 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7136 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7152 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7168 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7184 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7200 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7216 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7232 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7248 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7264 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7280 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7296 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml new file mode 100644 index 0000000..7af74ac --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Flickable { + width: 200 + height: 50 + contentWidth: 400 + contentHeight: 100 + + Column { + anchors.fill: parent + + TextInput { + selectByMouse: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + TextInput { + selectByMouse: false + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + } +} diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml index 768a4e2..c966fa1 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml +++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/main.qml @@ -93,5 +93,8 @@ QtObject { //: qsTrId() with comment, meta-data and plurals. //~ well-tested True qsTrId("qtn_bar_baz", 10); + + //% "Source text" + qsTrId("qtn_baz_biz"); } } diff --git a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result index 7dac8cb..4843902 100644 --- a/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result +++ b/tests/auto/linguist/lupdate/testdata/good/parseqml/project.ts.result @@ -27,6 +27,11 @@ </translation> <extra-well-tested>True</extra-well-tested> </message> + <message id="qtn_baz_biz"> + <location filename="main.qml" line="98"/> + <source>Source text</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>BarContext</name> diff --git a/tests/auto/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/qcoreapplication/tst_qcoreapplication.cpp index 95055d1..bc69461 100644 --- a/tests/auto/qcoreapplication/tst_qcoreapplication.cpp +++ b/tests/auto/qcoreapplication/tst_qcoreapplication.cpp @@ -59,6 +59,9 @@ private slots: void applicationPid(); void globalPostedEventsCount(); void processEventsAlwaysSendsPostedEvents(); + void reexec(); + void execAfterExit(); + void eventLoopExecAfterExit(); }; class EventSpy : public QObject @@ -524,5 +527,47 @@ void tst_QCoreApplication::processEventsAlwaysSendsPostedEvents() } while (t.elapsed() < 3000); } +void tst_QCoreApplication::reexec() +{ + int argc = 1; + char *argv[] = { "tst_qcoreapplication" }; + QCoreApplication app(argc, argv); + + // exec once + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); + + // and again + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); +} + +void tst_QCoreApplication::execAfterExit() +{ + int argc = 1; + char *argv[] = { "tst_qcoreapplication" }; + QCoreApplication app(argc, argv); + + app.exit(1); + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); +} + +void tst_QCoreApplication::eventLoopExecAfterExit() +{ + int argc = 1; + char *argv[] = { "tst_qcoreapplication" }; + QCoreApplication app(argc, argv); + + // exec once and exit + QMetaObject::invokeMethod(&app, "quit", Qt::QueuedConnection); + QCOMPARE(app.exec(), 0); + + // and again, but this time using a QEventLoop + QEventLoop loop; + QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection); + QCOMPARE(loop.exec(), 0); +} + QTEST_APPLESS_MAIN(tst_QCoreApplication) #include "tst_qcoreapplication.moc" diff --git a/tests/auto/qeventloop/tst_qeventloop.cpp b/tests/auto/qeventloop/tst_qeventloop.cpp index 7af722f..6860f19 100644 --- a/tests/auto/qeventloop/tst_qeventloop.cpp +++ b/tests/auto/qeventloop/tst_qeventloop.cpp @@ -112,6 +112,10 @@ signals: public: QMutex mutex; QWaitCondition cond; + volatile int result1; + volatile int result2; + MultipleExecThread() : result1(0xdead), result2(0xbeef) {} + void run() { QMutexLocker locker(&mutex); @@ -124,13 +128,13 @@ public: connect(&timer, SIGNAL(timeout()), SLOT(quit()), Qt::DirectConnection); timer.setInterval(1000); timer.start(); - (void) exec(); + result1 = exec(); // this should return immediately, since exit() has been called cond.wakeOne(); cond.wait(&mutex); QEventLoop eventLoop; - (void) eventLoop.exec(); + result2 = eventLoop.exec(); } }; @@ -197,7 +201,9 @@ private slots: void symbianNestedActiveSchedulerLoop(); void processEvents(); void exec(); + void reexec(); void exit(); + void execAfterExit(); void wakeUp(); void quit(); void processEventsExcludeSocket(); @@ -398,7 +404,9 @@ void tst_QEventLoop::exec() } { - // calling exec() after exit()/quit() should return immediately + // calling QEventLoop::exec() after a thread loop has exit()ed should return immediately + // Note: this behaviour differs from QCoreApplication and QEventLoop + // see tst_QCoreApplication::eventLoopExecAfterExit, tst_QEventLoop::reexec MultipleExecThread thread; // start thread and wait for checkpoint @@ -411,6 +419,8 @@ void tst_QEventLoop::exec() thread.cond.wakeOne(); thread.cond.wait(&thread.mutex); QVERIFY(spy.count() > 0); + int v = thread.result1; + QCOMPARE(v, 0); // exec should return immediately spy.clear(); @@ -418,6 +428,8 @@ void tst_QEventLoop::exec() thread.mutex.unlock(); thread.wait(); QCOMPARE(spy.count(), 0); + v = thread.result2; + QCOMPARE(v, -1); } { @@ -462,9 +474,32 @@ void tst_QEventLoop::exec() #endif } +void tst_QEventLoop::reexec() +{ + QEventLoop loop; + + // exec once + QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection); + QCOMPARE(loop.exec(), 0); + + // and again + QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection); + QCOMPARE(loop.exec(), 0); +} + void tst_QEventLoop::exit() { DEPENDS_ON(exec()); } +void tst_QEventLoop::execAfterExit() +{ + QEventLoop loop; + EventLoopExiter obj(&loop); + + QMetaObject::invokeMethod(&obj, "exit", Qt::QueuedConnection); + loop.exit(1); + QCOMPARE(loop.exec(), 0); +} + void tst_QEventLoop::wakeUp() { EventLoopThread thread; diff --git a/tests/auto/qglthreads/tst_qglthreads.cpp b/tests/auto/qglthreads/tst_qglthreads.cpp index 0bcc4f6..65bebb0 100644 --- a/tests/auto/qglthreads/tst_qglthreads.cpp +++ b/tests/auto/qglthreads/tst_qglthreads.cpp @@ -216,7 +216,7 @@ public: // That's why we create only small textures. width = 50; height = 20; -#else +#endif QImage image(width, height, QImage::Format_RGB32); QPainter p(&image); p.fillRect(image.rect(), QColor(rand() % 256, rand() % 256, rand() % 256)); diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp index b221cd9..d446ca7 100644 --- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp +++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp @@ -3838,6 +3838,23 @@ public: mutable int queryCalls; }; +class TestInputContext : public QInputContext +{ +public: + TestInputContext() {} + + QString identifierName() { return QString(); } + QString language() { return QString(); } + + void reset() { + ++resetCalls; + sendEvent(QInputMethodEvent()); } + + bool isComposing() const { return false; } + + int resetCalls; +}; + void tst_QGraphicsScene::inputMethod() { QFETCH(int, flags); @@ -3847,14 +3864,22 @@ void tst_QGraphicsScene::inputMethod() item->setFlags((QGraphicsItem::GraphicsItemFlags)flags); QGraphicsScene scene; - QEvent activate(QEvent::WindowActivate); - QApplication::sendEvent(&scene, &activate); + QGraphicsView view(&scene); + TestInputContext inputContext; + view.setInputContext(&inputContext); + view.show(); + QApplication::setActiveWindow(&view); + view.setFocus(); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&view)); + inputContext.resetCalls = 0; scene.addItem(item); QInputMethodEvent event; scene.setFocusItem(item); QCOMPARE(!!(item->flags() & QGraphicsItem::ItemIsFocusable), scene.focusItem() == item); + QCOMPARE(inputContext.resetCalls, 0); item->eventCalls = 0; qApp->sendEvent(&scene, &event); @@ -3865,6 +3890,9 @@ void tst_QGraphicsScene::inputMethod() QCOMPARE(item->queryCalls, callFocusItem ? 1 : 0); scene.setFocusItem(0); + // the input context is reset twice, once because an item has lost focus and again because + // the Qt::WA_InputMethodEnabled flag is cleared because no item has focus. + QCOMPARE(inputContext.resetCalls, callFocusItem ? 2 : 0); QCOMPARE(item->eventCalls, callFocusItem ? 2 : 0); // verify correct delivery of "reset" event QCOMPARE(item->queryCalls, callFocusItem ? 1 : 0); // verify that value is unaffected diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp index dcd679f..3c4984e 100644 --- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp @@ -4141,11 +4141,14 @@ void tst_QGraphicsView::inputContextReset() inputContext.resets = 0; scene.setFocusItem(0); - QCOMPARE(inputContext.resets, 1); + // the input context is reset twice, once because an item has lost focus and again because + // the Qt::WA_InputMethodEnabled flag is cleared because no item has focus. + QCOMPARE(inputContext.resets, 2); // introduce another item that is focusable but does not accept input methods QGraphicsItem *item2 = new QGraphicsRectItem; - item1->setFlags(QGraphicsItem::ItemIsFocusable); + item2->setFlags(QGraphicsItem::ItemIsFocusable); + scene.addItem(item2); inputContext.resets = 0; scene.setFocusItem(item2); @@ -4154,6 +4157,11 @@ void tst_QGraphicsView::inputContextReset() inputContext.resets = 0; scene.setFocusItem(item1); QCOMPARE(inputContext.resets, 0); + + // test changing between between items that accept input methods. + item2->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemAcceptsInputMethod); + scene.setFocusItem(item2); + QCOMPARE(inputContext.resets, 1); } void tst_QGraphicsView::indirectPainting() diff --git a/tests/auto/qinputcontext/tst_qinputcontext.cpp b/tests/auto/qinputcontext/tst_qinputcontext.cpp index 800f9de..6a047f2 100644 --- a/tests/auto/qinputcontext/tst_qinputcontext.cpp +++ b/tests/auto/qinputcontext/tst_qinputcontext.cpp @@ -88,6 +88,7 @@ private slots: void closeSoftwareInputPanel(); void selections(); void focusProxy(); + void contextInheritance(); void symbianTestCoeFepInputContext_data(); void symbianTestCoeFepInputContext(); void symbianTestCoeFepAutoCommit_data(); @@ -473,6 +474,37 @@ void tst_QInputContext::focusProxy() QCOMPARE(gic->focusWidget(), &proxy); } +void tst_QInputContext::contextInheritance() +{ + QWidget parent; + QWidget child(&parent); + + parent.setAttribute(Qt::WA_InputMethodEnabled, true); + child.setAttribute(Qt::WA_InputMethodEnabled, true); + + QCOMPARE(parent.inputContext(), qApp->inputContext()); + QCOMPARE(child.inputContext(), qApp->inputContext()); + + QInputContext *qic = new QFilterInputContext; + parent.setInputContext(qic); + QCOMPARE(parent.inputContext(), qic); + QCOMPARE(child.inputContext(), qic); + + parent.setAttribute(Qt::WA_InputMethodEnabled, false); + QVERIFY(!parent.inputContext()); + QCOMPARE(child.inputContext(), qic); + parent.setAttribute(Qt::WA_InputMethodEnabled, true); + + parent.setInputContext(0); + QCOMPARE(parent.inputContext(), qApp->inputContext()); + QCOMPARE(child.inputContext(), qApp->inputContext()); + + qic = new QFilterInputContext; + qApp->setInputContext(qic); + QCOMPARE(parent.inputContext(), qic); + QCOMPARE(child.inputContext(), qic); +} + #ifdef QT_WEBKIT_LIB class AutoWebView : public QWebView { diff --git a/tests/auto/qthread/tst_qthread.cpp b/tests/auto/qthread/tst_qthread.cpp index e6bf9ce..c7036e4 100644 --- a/tests/auto/qthread/tst_qthread.cpp +++ b/tests/auto/qthread/tst_qthread.cpp @@ -86,6 +86,7 @@ private slots: void start(); void terminate(); void quit(); + void execAfterQuit(); void wait(); void started(); void finished(); @@ -265,6 +266,34 @@ public: } }; +class ExecAfterQuitThreadHelper: public QObject +{ + Q_OBJECT + QThread *thr; +public: + ExecAfterQuitThreadHelper(QThread *thr) : thr(thr) {} +public slots: + void doIt() { thr->exit(0); } +}; + +class ExecAfterQuitThread: public QThread +{ +public: + int returnValue; + void run() + { + ExecAfterQuitThreadHelper obj(this); + + QMetaObject::invokeMethod(&obj, "doIt", Qt::QueuedConnection); + exit(1); + + // returnValue will be either 0 or 1, depending on which of the two + // above take effect. The correct value is 0, since exit(1) before + // exec() should have no effect + returnValue = exec(); + } +}; + tst_QThread::tst_QThread() { @@ -424,34 +453,52 @@ void tst_QThread::stackSize() void tst_QThread::exit() { - Exit_Thread thread; - thread.object = new Exit_Object; - thread.object->moveToThread(&thread); - thread.code = 42; - thread.result = 0; - QVERIFY(!thread.isFinished()); - QVERIFY(!thread.isRunning()); - QMutexLocker locker(&thread.mutex); - thread.start(); - QVERIFY(thread.isRunning()); - QVERIFY(!thread.isFinished()); - thread.cond.wait(locker.mutex()); - QVERIFY(thread.wait(five_minutes)); - QVERIFY(thread.isFinished()); - QVERIFY(!thread.isRunning()); - QCOMPARE(thread.result, thread.code); - delete thread.object; + { + Exit_Thread thread; + thread.object = new Exit_Object; + thread.object->moveToThread(&thread); + thread.code = 42; + thread.result = 0; + QVERIFY(!thread.isFinished()); + QVERIFY(!thread.isRunning()); - Exit_Thread thread2; - thread2.object = 0; - thread2.code = 53; - thread2.result = 0; - QMutexLocker locker2(&thread2.mutex); - thread2.start(); - thread2.exit(thread2.code); - thread2.cond.wait(locker2.mutex()); - QVERIFY(thread2.wait(five_minutes)); - QCOMPARE(thread2.result, thread2.code); + QMutexLocker locker(&thread.mutex); + thread.start(); + QVERIFY(thread.isRunning()); + QVERIFY(!thread.isFinished()); + // but the thread is not running the event loop yet (the mutex is locked) + + // start the event loop + thread.cond.wait(locker.mutex()); + + // the Exit_Object above will cause the thread to exit + QVERIFY(thread.wait(five_minutes)); + QVERIFY(thread.isFinished()); + QVERIFY(!thread.isRunning()); + QCOMPARE(thread.result, thread.code); + delete thread.object; + } + + { + Exit_Thread thread2; + thread2.object = 0; + thread2.code = 53; + thread2.result = 0; + QMutexLocker locker2(&thread2.mutex); + thread2.start(); + + // the mutex is locked, so the thread has *not* started running the event loop yet + // this will do nothing: + thread2.exit(thread2.code); + + // the thread will now start running + thread2.cond.wait(locker2.mutex()); + + // this will cause it to exit now + thread2.exit(++thread2.code); + QVERIFY(thread2.wait(five_minutes)); + QCOMPARE(thread2.result, thread2.code); + } } void tst_QThread::start() @@ -498,32 +545,59 @@ void tst_QThread::terminate() void tst_QThread::quit() { - Quit_Thread thread; - thread.object = new Quit_Object; - thread.object->moveToThread(&thread); - thread.result = -1; - QVERIFY(!thread.isFinished()); - QVERIFY(!thread.isRunning()); - QMutexLocker locker(&thread.mutex); - thread.start(); - QVERIFY(thread.isRunning()); - QVERIFY(!thread.isFinished()); - thread.cond.wait(locker.mutex()); - QVERIFY(thread.wait(five_minutes)); - QVERIFY(thread.isFinished()); - QVERIFY(!thread.isRunning()); - QCOMPARE(thread.result, 0); - delete thread.object; + // very similar to exit() above + { + Quit_Thread thread; + thread.object = new Quit_Object; + thread.object->moveToThread(&thread); + thread.result = -1; + QVERIFY(!thread.isFinished()); + QVERIFY(!thread.isRunning()); - Quit_Thread thread2; - thread2.object = 0; - thread2.result = -1; - QMutexLocker locker2(&thread2.mutex); - thread2.start(); - thread2.quit(); - thread2.cond.wait(locker2.mutex()); - QVERIFY(thread2.wait(five_minutes)); - QCOMPARE(thread2.result, 0); + // start the thread, but keep the event loop from starting + // (while the mutex is locked) + QMutexLocker locker(&thread.mutex); + thread.start(); + QVERIFY(thread.isRunning()); + QVERIFY(!thread.isFinished()); + + // unlock the mutex and let the event loop run + // the Quit_Object above will cause the thread to quit + thread.cond.wait(locker.mutex()); + QVERIFY(thread.wait(five_minutes)); + QVERIFY(thread.isFinished()); + QVERIFY(!thread.isRunning()); + QCOMPARE(thread.result, 0); + delete thread.object; + } + + { + Quit_Thread thread2; + thread2.object = 0; + thread2.result = -1; + + // start the thread, but keep the event loop from starting + // (while the mutex is locked) + QMutexLocker locker2(&thread2.mutex); + thread2.start(); + thread2.quit(); // does nothing, the event loop is not running! + + // unlock the mutex and let the event loop run + thread2.cond.wait(locker2.mutex()); + + // there's no Quit_Object so it won't quit on its own + thread2.quit(); + QVERIFY(thread2.wait(five_minutes)); + QCOMPARE(thread2.result, 0); + } +} + +void tst_QThread::execAfterQuit() +{ + ExecAfterQuitThread thread; + thread.start(); + QVERIFY(thread.wait()); + QCOMPARE(thread.returnValue, 0); } void tst_QThread::wait() @@ -994,8 +1068,17 @@ void tst_QThread::QTBUG15378_exitAndExec() Thread thread; thread.value = 0; thread.start(); - thread.exit(556); - thread.sem1.release(); //should exit the first loop + thread.exit(42); // will do nothing, this value should not appear + thread.sem1.release(); //should enter the first loop + + Exit_Object *exit_object = new Exit_Object; + exit_object->code = 556; + exit_object->thread = &thread; + QMetaObject::invokeMethod(exit_object, "slot", Qt::QueuedConnection); + exit_object->deleteLater(); + exit_object->moveToThread(&thread); // should exit the first loop + exit_object = 0; + thread.sem2.acquire(); int v = thread.value; QCOMPARE(v, 556); |