summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/declarative/qmldocument.qdoc2
-rw-r--r--doc/src/declarative/qmlformat.qdoc4
-rw-r--r--doc/src/declarative/qtbinding.qdoc (renamed from doc/src/declarative/binding.qdoc)9
-rw-r--r--doc/src/declarative/qtdeclarative.qdoc1
-rw-r--r--src/declarative/debugger/qmldebugclient.cpp2
-rw-r--r--src/declarative/fx/qfxitem.cpp28
-rw-r--r--src/declarative/fx/qfxlistview.cpp2
-rw-r--r--src/declarative/fx/qfxtext.cpp8
-rw-r--r--src/declarative/fx/qfxtextinput_p.h2
-rw-r--r--src/declarative/qml/qml.pri6
-rw-r--r--src/declarative/qml/qmlengine.cpp6
-rw-r--r--src/declarative/qml/qmlengine_p.h2
-rw-r--r--src/declarative/qml/qmlerror.cpp1
-rw-r--r--src/declarative/qml/qmlinfo.cpp4
-rw-r--r--src/declarative/qml/qmllistscriptclass.cpp141
-rw-r--r--src/declarative/qml/qmllistscriptclass_p.h85
-rw-r--r--src/declarative/qml/qmlmetaproperty.cpp1
-rw-r--r--src/declarative/qml/qmlobjectscriptclass.cpp12
-rw-r--r--src/declarative/qml/qmlrewrite.cpp88
-rw-r--r--src/declarative/qml/qmlrewrite_p.h22
-rw-r--r--src/declarative/qml/qmlscriptparser.cpp1
-rw-r--r--src/declarative/util/qmlstateoperations.cpp88
-rw-r--r--src/script/bridge/qscriptdeclarativeclass.cpp7
-rw-r--r--src/script/bridge/qscriptdeclarativeclass_p.h1
-rw-r--r--tests/auto/declarative/declarative.pro3
-rw-r--r--tests/auto/declarative/qmlecmascript/data/listProperties.qml44
-rw-r--r--tests/auto/declarative/qmlecmascript/testtypes.h13
-rw-r--r--tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp20
-rw-r--r--tests/auto/declarative/qmllanguage/data/I18nType30.qml (renamed from tests/auto/declarative/qmllanguage/data/I18nÁâãäå.qml)0
-rw-r--r--tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml5
-rw-r--r--tests/auto/declarative/qmllanguage/data/i18nType.qml2
-rw-r--r--tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp31
-rw-r--r--tests/auto/declarative/visual/ListView/data-X11/basic1.qml159
-rw-r--r--tests/auto/declarative/visual/ListView/data-X11/basic2.qml187
-rw-r--r--tests/auto/declarative/visual/ListView/data-X11/basic3.qml147
-rw-r--r--tests/auto/declarative/visual/ListView/data-X11/basic4.qml171
-rw-r--r--tests/auto/declarative/visual/flickable/data-X11/flickable.0.pngbin0 -> 115546 bytes
-rw-r--r--tests/auto/declarative/visual/flickable/data-X11/flickable.1.pngbin0 -> 115627 bytes
-rw-r--r--tests/auto/declarative/visual/flickable/data-X11/flickable.2.pngbin0 -> 116034 bytes
-rw-r--r--tests/auto/declarative/visual/flickable/data-X11/flickable.qml791
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test.0.pngbin0 -> 11521 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test.1.pngbin0 -> 11521 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test.2.pngbin0 -> 11503 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test.3.pngbin0 -> 11518 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test.4.pngbin0 -> 11518 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test.5.pngbin0 -> 11518 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test.qml1599
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test2.0.pngbin0 -> 4656 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test2.1.pngbin0 -> 4656 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test2.qml607
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.0.pngbin0 -> 10098 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.1.pngbin0 -> 10056 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.2.pngbin0 -> 9817 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.3.pngbin0 -> 9631 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.4.pngbin0 -> 9464 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.5.pngbin0 -> 9638 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.6.pngbin0 -> 9817 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.7.pngbin0 -> 10056 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.8.pngbin0 -> 10095 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.9.pngbin0 -> 10077 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data-X11/test3.qml2879
-rw-r--r--tests/auto/declarative/visual/focusscope/data/test3.0.png.reject.pngbin12616 -> 0 bytes
-rw-r--r--tests/auto/declarative/visual/focusscope/data/test3.1.png.reject.pngbin12539 -> 0 bytes
-rw-r--r--tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.pngbin0 -> 1012 bytes
-rw-r--r--tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.qml279
-rw-r--r--tests/auto/declarative/visual/qfxtext/elide/multilength.qml20
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic1.0.pngbin0 -> 1354 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic1.qml323
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic2.0.pngbin0 -> 1354 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic2.qml331
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic3.0.pngbin0 -> 1354 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic3.qml347
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic4.0.pngbin0 -> 1354 bytes
-rw-r--r--tests/auto/declarative/visual/repeater/data-X11/basic4.qml419
-rw-r--r--tests/auto/declarative/visual/tst_visual.cpp64
-rw-r--r--tools/qmldebugger/engine.cpp401
-rw-r--r--tools/qmldebugger/engine.h43
-rw-r--r--tools/qmldebugger/main.cpp175
-rw-r--r--tools/qmldebugger/objectpropertiesview.cpp176
-rw-r--r--tools/qmldebugger/objectpropertiesview.h47
-rw-r--r--tools/qmldebugger/objecttree.cpp168
-rw-r--r--tools/qmldebugger/objecttree.h51
-rw-r--r--tools/qmldebugger/propertyview.cpp117
-rw-r--r--tools/qmldebugger/propertyview.h40
-rw-r--r--tools/qmldebugger/qmldebugger.cpp125
-rw-r--r--tools/qmldebugger/qmldebugger.h47
-rw-r--r--tools/qmldebugger/qmldebugger.pri22
-rw-r--r--tools/qmldebugger/qmldebugger.pro16
-rw-r--r--tools/qmldebugger/watchtable.cpp (renamed from tools/qmldebugger/watchtablemodel.cpp)141
-rw-r--r--tools/qmldebugger/watchtable.h (renamed from tools/qmldebugger/watchtablemodel.h)67
90 files changed, 9752 insertions, 848 deletions
diff --git a/doc/src/declarative/qmldocument.qdoc b/doc/src/declarative/qmldocument.qdoc
index 84e7926..2775ea6 100644
--- a/doc/src/declarative/qmldocument.qdoc
+++ b/doc/src/declarative/qmldocument.qdoc
@@ -71,6 +71,8 @@ Rectangle {
}
\endcode
+QML documents are always encoded in UTF-8 format.
+
A QML document always begins with one or more import statements. To prevent elements
introduced in later versions from affecting existing QML programs, the element types
available within a document are controlled by the imported QML \l {Modules}. That is,
diff --git a/doc/src/declarative/qmlformat.qdoc b/doc/src/declarative/qmlformat.qdoc
index be1afa4..72bbe40 100644
--- a/doc/src/declarative/qmlformat.qdoc
+++ b/doc/src/declarative/qmlformat.qdoc
@@ -192,6 +192,10 @@ different property bindings.
\section1 Syntax
+\section2 Encoding
+
+QML files are always encoded in UTF-8 format.
+
\section2 Commenting
The commenting rules in QML are the same as for ECMAScript. Both \e {MultiLineComment} blocks and \e {SingleLineComment}'s are supported.
diff --git a/doc/src/declarative/binding.qdoc b/doc/src/declarative/qtbinding.qdoc
index 94465a1..e925227 100644
--- a/doc/src/declarative/binding.qdoc
+++ b/doc/src/declarative/qtbinding.qdoc
@@ -42,7 +42,14 @@
/*!
\page qtbinding.html
\target qtbinding
-\title QML/C++ Data Binding
+\title Using QML in C++ Applications
+
+\list
+\o QmlEngine and QmlComponent
+\o QmlContext and data
+\o QBindableMap
+\o QAbstractItemModel Data models
+\endlist
The QML mechanisms of data binding can also be used to bind Qt C++ objects.
diff --git a/doc/src/declarative/qtdeclarative.qdoc b/doc/src/declarative/qtdeclarative.qdoc
index 73814db..45f9347 100644
--- a/doc/src/declarative/qtdeclarative.qdoc
+++ b/doc/src/declarative/qtdeclarative.qdoc
@@ -77,6 +77,7 @@ completely new applications. QML is fully \l {Extending QML}{extensible from C+
\o \l {tutorials-declarative-contacts.html}{Tutorial: 'Introduction to QML'}
\o \l {advtutorial.html}{Advanced Tutorial: 'Same Game'}
\o \l {QML Examples and Walkthroughs}
+\o \l {Using QML in C++ Applications}
\endlist
\section1 Core QML Features:
diff --git a/src/declarative/debugger/qmldebugclient.cpp b/src/declarative/debugger/qmldebugclient.cpp
index d13de57..3171808 100644
--- a/src/declarative/debugger/qmldebugclient.cpp
+++ b/src/declarative/debugger/qmldebugclient.cpp
@@ -104,7 +104,7 @@ bool QmlDebugConnection::isConnected() const
class QmlDebugClientPrivate : public QObjectPrivate
{
- Q_DECLARE_PUBLIC(QmlDebugClient);
+ Q_DECLARE_PUBLIC(QmlDebugClient)
public:
QmlDebugClientPrivate();
diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp
index 6324724..903fad7 100644
--- a/src/declarative/fx/qfxitem.cpp
+++ b/src/declarative/fx/qfxitem.cpp
@@ -1483,8 +1483,8 @@ void QFxItemPrivate::resources_removeAt(int)
int QFxItemPrivate::resources_count() const
{
- // ###
- return 0;
+ Q_Q(const QFxItem);
+ return q->children().count();
}
void QFxItemPrivate::resources_append(QObject *o)
@@ -1498,10 +1498,14 @@ void QFxItemPrivate::resources_insert(int, QObject *)
// ###
}
-QObject *QFxItemPrivate::resources_at(int) const
+QObject *QFxItemPrivate::resources_at(int idx) const
{
- // ###
- return 0;
+ Q_Q(const QFxItem);
+ QObjectList children = q->children();
+ if (idx < children.count())
+ return children.at(idx);
+ else
+ return 0;
}
void QFxItemPrivate::resources_clear()
@@ -1516,8 +1520,8 @@ void QFxItemPrivate::children_removeAt(int)
int QFxItemPrivate::children_count() const
{
- // ###
- return 0;
+ Q_Q(const QFxItem);
+ return q->childItems().count();
}
void QFxItemPrivate::children_append(QFxItem *i)
@@ -1531,10 +1535,14 @@ void QFxItemPrivate::children_insert(int, QFxItem *)
// ###
}
-QFxItem *QFxItemPrivate::children_at(int) const
+QFxItem *QFxItemPrivate::children_at(int idx) const
{
- // ###
- return 0;
+ Q_Q(const QFxItem);
+ QList<QGraphicsItem *> children = q->childItems();
+ if (idx < children.count())
+ return qobject_cast<QFxItem *>(children.at(idx));
+ else
+ return 0;
}
void QFxItemPrivate::children_clear()
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index 604d16b..4fb0ec1 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -166,7 +166,7 @@ public:
class QFxListViewPrivate : public QFxFlickablePrivate
{
- Q_DECLARE_PUBLIC(QFxListView);
+ Q_DECLARE_PUBLIC(QFxListView)
public:
QFxListViewPrivate()
diff --git a/src/declarative/fx/qfxtext.cpp b/src/declarative/fx/qfxtext.cpp
index c26ed2c..4d02f0d 100644
--- a/src/declarative/fx/qfxtext.cpp
+++ b/src/declarative/fx/qfxtext.cpp
@@ -427,9 +427,13 @@ void QFxText::setTextFormat(TextFormat format)
This property cannot be used with wrap enabled or with rich text.
- Eliding can be ElideNone, ElideLeft, ElideMiddle, or ElideRight.
+ Eliding can be ElideNone (the default), ElideLeft, ElideMiddle, or ElideRight.
- ElideNone is the default.
+ If the text is a multi-length string, and the mode is not ElideNone,
+ the first string that fits will be used, otherwise the last will be elided.
+
+ Multi-length strings are ordered from longest to shortest, separated by the
+ Unicode "String Terminator" character U009C (write this in QML with "\\x9C").
*/
Qt::TextElideMode QFxText::elideMode() const
{
diff --git a/src/declarative/fx/qfxtextinput_p.h b/src/declarative/fx/qfxtextinput_p.h
index a2b45bb..3978be4 100644
--- a/src/declarative/fx/qfxtextinput_p.h
+++ b/src/declarative/fx/qfxtextinput_p.h
@@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE
class QFxTextInputPrivate : public QFxPaintedItemPrivate
{
- Q_DECLARE_PUBLIC(QFxTextInput);
+ Q_DECLARE_PUBLIC(QFxTextInput)
public:
QFxTextInputPrivate() : control(new QLineControl(QString())),
color((QRgb)0), style(QFxText::Normal),
diff --git a/src/declarative/qml/qml.pri b/src/declarative/qml/qml.pri
index 2e62a3b..58a18a2 100644
--- a/src/declarative/qml/qml.pri
+++ b/src/declarative/qml/qml.pri
@@ -44,7 +44,8 @@ SOURCES += qml/qmlparser.cpp \
qml/qmlcontextscriptclass.cpp \
qml/qmlglobalscriptclass.cpp \
qml/qmlvaluetypescriptclass.cpp \
- qml/qmltypenamescriptclass.cpp
+ qml/qmltypenamescriptclass.cpp \
+ qml/qmllistscriptclass.cpp
HEADERS += qml/qmlparser_p.h \
qml/qmlinstruction_p.h \
@@ -105,7 +106,8 @@ HEADERS += qml/qmlparser_p.h \
qml/qmlcontextscriptclass_p.h \
qml/qmlglobalscriptclass_p.h \
qml/qmlvaluetypescriptclass_p.h \
- qml/qmltypenamescriptclass_p.h
+ qml/qmltypenamescriptclass_p.h \
+ qml/qmllistscriptclass_p.h
# for qtscript debugger
contains(QT_CONFIG, scripttools):QT += scripttools
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp
index d5f64c2..528e8c9 100644
--- a/src/declarative/qml/qmlengine.cpp
+++ b/src/declarative/qml/qmlengine.cpp
@@ -86,6 +86,7 @@
#include <private/qmlxmlhttprequest_p.h>
#include <private/qmlsqldatabase_p.h>
#include <private/qmltypenamescriptclass_p.h>
+#include <private/qmllistscriptclass_p.h>
#ifdef Q_OS_WIN // for %APPDATA%
#include "qt_windows.h"
@@ -173,6 +174,8 @@ QmlEnginePrivate::~QmlEnginePrivate()
valueTypeClass = 0;
delete typeNameClass;
typeNameClass = 0;
+ delete listClass;
+ listClass = 0;
delete networkAccessManager;
networkAccessManager = 0;
delete nodeListClass;
@@ -218,6 +221,7 @@ void QmlEnginePrivate::init()
objectClass = new QmlObjectScriptClass(q);
valueTypeClass = new QmlValueTypeScriptClass(q);
typeNameClass = new QmlTypeNameScriptClass(q);
+ listClass = new QmlListScriptClass(q);
rootContext = new QmlContext(q,true);
#ifdef QT_SCRIPTTOOLS_LIB
if (qmlDebugger()){
@@ -1095,7 +1099,7 @@ public:
int slash = type.indexOf('/');
if (slash >= 0) {
while (!s) {
- s = set.value(QString::fromLatin1(type.left(slash)));
+ s = set.value(QString::fromUtf8(type.left(slash)));
int nslash = type.indexOf('/',slash+1);
if (nslash > 0)
slash = nslash;
diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h
index 4c90a80..a85ac55 100644
--- a/src/declarative/qml/qmlengine_p.h
+++ b/src/declarative/qml/qmlengine_p.h
@@ -96,6 +96,7 @@ class QScriptDeclarativeClass;
class QmlTypeNameScriptClass;
class QmlTypeNameCache;
class QmlComponentAttached;
+class QmlListScriptClass;
class QmlEnginePrivate : public QObjectPrivate
{
@@ -129,6 +130,7 @@ public:
QmlObjectScriptClass *objectClass;
QmlValueTypeScriptClass *valueTypeClass;
QmlTypeNameScriptClass *typeNameClass;
+ QmlListScriptClass *listClass;
// Global script class
QScriptClass *globalClass;
// Used by DOM Core 3 API
diff --git a/src/declarative/qml/qmlerror.cpp b/src/declarative/qml/qmlerror.cpp
index 5ee9144..514fe44 100644
--- a/src/declarative/qml/qmlerror.cpp
+++ b/src/declarative/qml/qmlerror.cpp
@@ -201,6 +201,7 @@ QDebug operator<<(QDebug debug, const QmlError &error)
if (f.open(QIODevice::ReadOnly)) {
QByteArray data = f.readAll();
QTextStream stream(data, QIODevice::ReadOnly);
+ stream.setCodec("UTF-8");
const QString code = stream.readAll();
const QStringList lines = code.split(QLatin1Char('\n'));
diff --git a/src/declarative/qml/qmlinfo.cpp b/src/declarative/qml/qmlinfo.cpp
index 862d6ba..119641f 100644
--- a/src/declarative/qml/qmlinfo.cpp
+++ b/src/declarative/qml/qmlinfo.cpp
@@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE
For example,
\code
- qmlInfo(object, tr("component property is a write-once property"));
+ qmlInfo(tr("component property is a write-once property"), object);
\endcode
prints
@@ -77,7 +77,7 @@ void qmlInfo(const QString& msg, QObject* object)
{
QString pos = QLatin1String("QML");
if (object) {
- pos += " ";
+ pos += QLatin1Char(' ');
pos += QLatin1String(object->metaObject()->className());
}
QmlDeclarativeData *ddata = QmlDeclarativeData::get(object);
diff --git a/src/declarative/qml/qmllistscriptclass.cpp b/src/declarative/qml/qmllistscriptclass.cpp
new file mode 100644
index 0000000..09bde8c
--- /dev/null
+++ b/src/declarative/qml/qmllistscriptclass.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module 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 either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** 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.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmllistscriptclass_p.h"
+#include <private/qmlengine_p.h>
+
+QT_BEGIN_NAMESPACE
+
+struct ListData : public QScriptDeclarativeClass::Object {
+ QGuard<QObject> object;
+ int propertyIdx;
+ QmlListScriptClass::ListType type;
+};
+
+QmlListScriptClass::QmlListScriptClass(QmlEngine *e)
+: QScriptDeclarativeClass(QmlEnginePrivate::getScriptEngine(e)), engine(e)
+{
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
+
+ m_lengthId = createPersistentIdentifier(QLatin1String("length"));
+}
+
+QmlListScriptClass::~QmlListScriptClass()
+{
+}
+
+QScriptValue QmlListScriptClass::newList(QObject *object, int propId, ListType type)
+{
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
+
+ if (!object || propId == -1)
+ return scriptEngine->nullValue();
+
+ ListData *data = new ListData;
+ data->object = object;
+ data->propertyIdx = propId;
+ data->type = type;
+
+ return newObject(scriptEngine, this, data);
+}
+
+QScriptClass::QueryFlags
+QmlListScriptClass::queryProperty(Object *object, const Identifier &name,
+ QScriptClass::QueryFlags flags)
+{
+ if (name == m_lengthId.identifier)
+ return QScriptClass::HandlesReadAccess;
+
+ bool ok = false;
+ quint32 idx = toArrayIndex(name, &ok);
+
+ if (ok) {
+ lastIndex = idx;
+ return QScriptClass::HandlesReadAccess;
+ } else {
+ return 0;
+ }
+}
+
+QScriptValue QmlListScriptClass::property(Object *obj, const Identifier &name)
+{
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
+ QmlEnginePrivate *enginePriv = QmlEnginePrivate::get(engine);
+
+ ListData *data = (ListData *)obj;
+ if (!data->object)
+ return scriptEngine->undefinedValue();
+
+ void *list = 0;
+ void *args[] = { &list, 0 };
+ QMetaObject::metacall(data->object, QMetaObject::ReadProperty,
+ data->propertyIdx, args);
+
+ if (!list)
+ return scriptEngine->undefinedValue();
+
+ if (data->type == QListPtr) {
+ const QList<QObject *> &qlist = *((QList<QObject *>*)list);
+
+ if (name == m_lengthId.identifier)
+ return qlist.count();
+ else if (lastIndex < qlist.count())
+ return enginePriv->objectClass->newQObject(qlist.at(lastIndex));
+ else
+ return scriptEngine->undefinedValue();
+
+ } else {
+ Q_ASSERT(data->type == QmlListPtr);
+ const QmlList<QObject *> &qmllist = *((QmlList<QObject *>*)list);
+
+ int count = qmllist.count();
+
+ if (name == m_lengthId.identifier)
+ return count;
+ else if (lastIndex < count)
+ return enginePriv->objectClass->newQObject(qmllist.at(lastIndex));
+ else
+ return scriptEngine->undefinedValue();
+ }
+}
+
+QT_END_NAMESPACE
+
diff --git a/src/declarative/qml/qmllistscriptclass_p.h b/src/declarative/qml/qmllistscriptclass_p.h
new file mode 100644
index 0000000..7592098
--- /dev/null
+++ b/src/declarative/qml/qmllistscriptclass_p.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module 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 either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** 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.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMLLISTSCRIPTCLASS_P_H
+#define QMLLISTSCRIPTCLASS_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qscriptdeclarativeclass_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QmlEngine;
+class QmlListScriptClass : public QScriptDeclarativeClass
+{
+public:
+ QmlListScriptClass(QmlEngine *);
+ ~QmlListScriptClass();
+
+ enum ListType { QListPtr, QmlListPtr };
+ QScriptValue newList(QObject *, int, ListType);
+
+protected:
+ virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &,
+ QScriptClass::QueryFlags flags);
+ virtual QScriptValue property(Object *, const Identifier &);
+
+private:
+ PersistentIdentifier m_lengthId;
+ QmlEngine *engine;
+
+ quint32 lastIndex;
+};
+
+QT_END_NAMESPACE
+
+#endif // QMLLISTSCRIPTCLASS_P_H
+
diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp
index 86116c7..5635016 100644
--- a/src/declarative/qml/qmlmetaproperty.cpp
+++ b/src/declarative/qml/qmlmetaproperty.cpp
@@ -906,7 +906,6 @@ void QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data
} else if (vt == listType ||
value.userType() == listType) {
QVariant listVar = prop.read(object);
- QmlMetaType::clear(listVar);
QmlMetaType::append(listVar, value);
}
diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp
index 80f2786..122db51 100644
--- a/src/declarative/qml/qmlobjectscriptclass.cpp
+++ b/src/declarative/qml/qmlobjectscriptclass.cpp
@@ -45,6 +45,7 @@
#include <private/qmlcontext_p.h>
#include <private/qmldeclarativedata_p.h>
#include <private/qmltypenamescriptclass_p.h>
+#include <private/qmllistscriptclass_p.h>
#include <QtDeclarative/qmlbinding.h>
#include <QtCore/qtimer.h>
@@ -64,8 +65,7 @@ QmlObjectScriptClass::QmlObjectScriptClass(QmlEngine *bindEngine)
: QScriptDeclarativeClass(QmlEnginePrivate::getScriptEngine(bindEngine)), lastData(0),
engine(bindEngine)
{
- engine = bindEngine;
- QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(bindEngine);
+ QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
m_destroy = scriptEngine->newFunction(destroy);
m_destroyId = createPersistentIdentifier(QLatin1String("destroy"));
@@ -214,7 +214,13 @@ QScriptValue QmlObjectScriptClass::property(QObject *obj, const Identifier &name
return enginePriv->valueTypeClass->newObject(obj, lastData->coreIndex, valueType);
}
- if (lastData->flags & QmlPropertyCache::Data::IsQObjectDerived) {
+ if (lastData->flags & QmlPropertyCache::Data::IsQList) {
+ return enginePriv->listClass->newList(obj, lastData->coreIndex,
+ QmlListScriptClass::QListPtr);
+ } else if (lastData->flags & QmlPropertyCache::Data::IsQmlList) {
+ return enginePriv->listClass->newList(obj, lastData->coreIndex,
+ QmlListScriptClass::QmlListPtr);
+ } if (lastData->flags & QmlPropertyCache::Data::IsQObjectDerived) {
QObject *rv = 0;
void *args[] = { &rv, 0 };
QMetaObject::metacall(obj, QMetaObject::ReadProperty, lastData->coreIndex, args);
diff --git a/src/declarative/qml/qmlrewrite.cpp b/src/declarative/qml/qmlrewrite.cpp
index 5166c96..19b88cc 100644
--- a/src/declarative/qml/qmlrewrite.cpp
+++ b/src/declarative/qml/qmlrewrite.cpp
@@ -40,9 +40,13 @@
****************************************************************************/
#include "qmlrewrite_p.h"
+#include <QtDeclarative/qfxglobal.h>
+#include <QtCore/qdebug.h>
QT_BEGIN_NAMESPACE
+DEFINE_BOOL_CONFIG_OPTION(rewriteDump, QML_REWRITE_DUMP);
+
namespace QmlRewrite {
QString RewriteBinding::operator()(const QString &code)
@@ -76,8 +80,20 @@ QString RewriteBinding::rewrite(QString code, unsigned position,
_writer->replace(startOfStatement, 0, QLatin1String("(function() { "));
_writer->replace(endOfStatement, 0, QLatin1String(" })"));
+ if (rewriteDump()) {
+ qWarning() << "=============================================================";
+ qWarning() << "Rewrote:";
+ qWarning() << qPrintable(code);
+ }
+
w.write(&code);
+ if (rewriteDump()) {
+ qWarning() << "To:";
+ qWarning() << qPrintable(code);
+ qWarning() << "=============================================================";
+ }
+
return code;
}
@@ -95,12 +111,80 @@ bool RewriteBinding::visit(AST::Block *ast)
bool RewriteBinding::visit(AST::ExpressionStatement *ast)
{
- unsigned startOfExpressionStatement = ast->firstSourceLocation().begin() - _position;
- _writer->replace(startOfExpressionStatement, 0, QLatin1String("return "));
+ if (_loopStack.isEmpty()) {
+ unsigned startOfExpressionStatement = ast->firstSourceLocation().begin() - _position;
+ _writer->replace(startOfExpressionStatement, 0, QLatin1String("return "));
+ }
return false;
}
+bool RewriteBinding::visit(AST::DoWhileStatement *ast)
+{
+ _loopStack.append(ast);
+ return true;
+}
+
+void RewriteBinding::endVisit(AST::DoWhileStatement *)
+{
+ _loopStack.removeLast();
+}
+
+bool RewriteBinding::visit(AST::WhileStatement *ast)
+{
+ _loopStack.append(ast);
+ return true;
+}
+
+void RewriteBinding::endVisit(AST::WhileStatement *)
+{
+ _loopStack.removeLast();
+}
+
+bool RewriteBinding::visit(AST::ForStatement *ast)
+{
+ _loopStack.append(ast);
+ return true;
+}
+
+void RewriteBinding::endVisit(AST::ForStatement *)
+{
+ _loopStack.removeLast();
+}
+
+bool RewriteBinding::visit(AST::LocalForStatement *ast)
+{
+ _loopStack.append(ast);
+ return true;
+}
+
+void RewriteBinding::endVisit(AST::LocalForStatement *)
+{
+ _loopStack.removeLast();
+}
+
+bool RewriteBinding::visit(AST::ForEachStatement *ast)
+{
+ _loopStack.append(ast);
+ return true;
+}
+
+void RewriteBinding::endVisit(AST::ForEachStatement *)
+{
+ _loopStack.removeLast();
+}
+
+bool RewriteBinding::visit(AST::LocalForEachStatement *ast)
+{
+ _loopStack.append(ast);
+ return true;
+}
+
+void RewriteBinding::endVisit(AST::LocalForEachStatement *)
+{
+ _loopStack.removeLast();
+}
+
} // namespace QmlRewrite
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qmlrewrite_p.h b/src/declarative/qml/qmlrewrite_p.h
index b6fe017..449b219 100644
--- a/src/declarative/qml/qmlrewrite_p.h
+++ b/src/declarative/qml/qmlrewrite_p.h
@@ -76,8 +76,30 @@ protected:
void accept(AST::Node *node);
QString rewrite(QString code, unsigned position, AST::Statement *node);
+
virtual bool visit(AST::Block *ast);
virtual bool visit(AST::ExpressionStatement *ast);
+
+ virtual bool visit(AST::DoWhileStatement *ast);
+ virtual void endVisit(AST::DoWhileStatement *ast);
+
+ virtual bool visit(AST::WhileStatement *ast);
+ virtual void endVisit(AST::WhileStatement *ast);
+
+ virtual bool visit(AST::ForStatement *ast);
+ virtual void endVisit(AST::ForStatement *ast);
+
+ virtual bool visit(AST::LocalForStatement *ast);
+ virtual void endVisit(AST::LocalForStatement *ast);
+
+ virtual bool visit(AST::ForEachStatement *ast);
+ virtual void endVisit(AST::ForEachStatement *ast);
+
+ virtual bool visit(AST::LocalForEachStatement *ast);
+ virtual void endVisit(AST::LocalForEachStatement *ast);
+
+private:
+ QList<AST::Statement *> _loopStack;
};
} // namespace QmlRewrite
diff --git a/src/declarative/qml/qmlscriptparser.cpp b/src/declarative/qml/qmlscriptparser.cpp
index 9cc12b3..6e5f315 100644
--- a/src/declarative/qml/qmlscriptparser.cpp
+++ b/src/declarative/qml/qmlscriptparser.cpp
@@ -870,6 +870,7 @@ bool QmlScriptParser::parse(const QByteArray &qmldata, const QUrl &url)
const QString fileName = url.toString();
QTextStream stream(qmldata, QIODevice::ReadOnly);
+ stream.setCodec("UTF-8");
const QString code = stream.readAll();
data = new QmlScriptParserJsASTData(fileName);
diff --git a/src/declarative/util/qmlstateoperations.cpp b/src/declarative/util/qmlstateoperations.cpp
index 716cec4..60fd421 100644
--- a/src/declarative/util/qmlstateoperations.cpp
+++ b/src/declarative/util/qmlstateoperations.cpp
@@ -48,11 +48,14 @@
#include <QtDeclarative/qmlinfo.h>
#include <private/qfxanchors_p.h>
#include <private/qfxitem_p.h>
+#include <QtGui/qgraphicsitem.h>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE
class QmlParentChangePrivate : public QObjectPrivate
{
+ Q_DECLARE_PUBLIC(QmlParentChange)
public:
QmlParentChangePrivate() : target(0), parent(0), origParent(0), origStackBefore(0) {}
@@ -67,53 +70,37 @@ public:
void QmlParentChangePrivate::doChange(QFxItem *targetParent, QFxItem *stackBefore)
{
if (targetParent && target && target->parentItem()) {
- QPointF me = target->parentItem()->mapToScene(QPointF(0,0));
- QPointF them = targetParent->mapToScene(QPointF(0,0));
-
- QPointF themx = targetParent->mapToScene(QPointF(1,0));
- QPointF themy = targetParent->mapToScene(QPointF(0,1));
-
- themx -= them;
- themy -= them;
-
- target->setParentItem(targetParent);
-
- // XXX - this is silly and will only work in a few cases
-
- /*
- xDiff = rx * themx_x + ry * themy_x
- yDiff = rx * themx_y + ry * themy_y
- */
-
- qreal rx = 0;
- qreal ry = 0;
- qreal xDiff = them.x() - me.x();
- qreal yDiff = them.y() - me.y();
-
-
- if (themx.x() == 0.) {
- ry = xDiff / themy.x();
- rx = (yDiff - ry * themy.y()) / themx.y();
- } else if (themy.x() == 0.) {
- rx = xDiff / themx.x();
- ry = (yDiff - rx * themx.y()) / themy.y();
- } else if (themx.y() == 0.) {
- ry = yDiff / themy.y();
- rx = (xDiff - ry * themy.x()) / themx.x();
- } else if (themy.y() == 0.) {
- rx = yDiff / themx.y();
- ry = (xDiff - rx * themx.x()) / themy.x();
- } else {
- qreal div = (themy.x() * themx.y() - themy.y() * themx.x());
-
- if (div != 0.)
- rx = (themx.y() * xDiff - themx.x() * yDiff) / div;
-
- if (themy.y() != 0.) ry = (yDiff - rx * themx.y()) / themy.y();
+ //### for backwards direction, we can just restore original x, y, scale, rotation
+ Q_Q(QmlParentChange);
+ const QTransform &transform = target->itemTransform(targetParent);
+ if (transform.type() >= QTransform::TxShear) {
+ qmlInfo(QObject::tr("Unable to preserve appearance under complex transform"), q);
}
- target->setX(target->x() - rx);
- target->setY(target->y() - ry);
+ qreal scale = 1;
+ qreal rotation = 0;
+ if (transform.type() != QTransform::TxRotate) {
+ if (transform.m11() == transform.m22())
+ scale = transform.m11();
+ else
+ qmlInfo(QObject::tr("Unable to preserve appearance under non-uniform scale"), q);
+ } else if (transform.type() == QTransform::TxRotate) {
+ if (transform.m11() == transform.m22())
+ scale = qSqrt(transform.m11()*transform.m11() + transform.m12()*transform.m12());
+ else
+ qmlInfo(QObject::tr("Unable to preserve appearance under non-uniform scale"), q);
+
+ if (scale != 0)
+ rotation = atan2(transform.m12()/scale, transform.m11()/scale) * 180/M_PI;
+ else
+ qmlInfo(QObject::tr("Unable to preserve appearance under scale of 0"), q);
+ }
+ target->setParentItem(targetParent);
+ //qDebug() << transform.dx() << transform.dy() << rotation << scale;
+ target->setX(transform.dx());
+ target->setY(transform.dy());
+ target->setRotation(rotation);
+ target->setScale(scale);
} else if (target) {
target->setParentItem(targetParent);
}
@@ -127,7 +114,16 @@ void QmlParentChangePrivate::doChange(QFxItem *targetParent, QFxItem *stackBefor
/*!
\preliminary
\qmlclass ParentChange
- \brief The ParentChange element allows you to reparent an object in a state.
+ \brief The ParentChange element allows you to reparent an Item in a state change.
+
+ ParentChange reparents an Item while preserving its visual appearance (position, rotation,
+ and scale) on screen. You can then specify a transition to move/rotate/scale the Item to
+ its final intended appearance.
+
+ ParentChange can only preserve visual appearance if no complex transforms are involved.
+ More specifically, it will not work if the transform property has been set for any
+ Items involved in the reparenting (defined as any Items in the common ancestor tree
+ for the original and new parent).
*/
QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,ParentChange,QmlParentChange)
diff --git a/src/script/bridge/qscriptdeclarativeclass.cpp b/src/script/bridge/qscriptdeclarativeclass.cpp
index d019839..1e59f66 100644
--- a/src/script/bridge/qscriptdeclarativeclass.cpp
+++ b/src/script/bridge/qscriptdeclarativeclass.cpp
@@ -258,6 +258,13 @@ QString QScriptDeclarativeClass::toString(const Identifier &identifier)
return QString((QChar *)r->data(), r->size());
}
+quint32 QScriptDeclarativeClass::toArrayIndex(const Identifier &identifier, bool *ok)
+{
+ JSC::UString::Rep *r = (JSC::UString::Rep *)identifier;
+ JSC::UString s(r);
+ return s.toArrayIndex(ok);
+}
+
QScriptClass::QueryFlags
QScriptDeclarativeClass::queryProperty(Object *object, const Identifier &name,
QScriptClass::QueryFlags flags)
diff --git a/src/script/bridge/qscriptdeclarativeclass_p.h b/src/script/bridge/qscriptdeclarativeclass_p.h
index b28209a..559e842 100644
--- a/src/script/bridge/qscriptdeclarativeclass_p.h
+++ b/src/script/bridge/qscriptdeclarativeclass_p.h
@@ -103,6 +103,7 @@ public:
PersistentIdentifier createPersistentIdentifier(const Identifier &);
QString toString(const Identifier &);
+ quint32 toArrayIndex(const Identifier &, bool *ok);
virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &,
QScriptClass::QueryFlags flags);
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index eef9da7..b51e285 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -25,9 +25,6 @@ SUBDIRS += anchors \
states \
visual
-SUBDIRS -= examples # Human-interactive
-
# Tests which should run in Pulse
PULSE_TESTS = $$SUBDIRS
-PULSE_TESTS -= visual # All except 'visual' tests, allegedly too flaky
diff --git a/tests/auto/declarative/qmlecmascript/data/listProperties.qml b/tests/auto/declarative/qmlecmascript/data/listProperties.qml
new file mode 100644
index 0000000..73a1d6f
--- /dev/null
+++ b/tests/auto/declarative/qmlecmascript/data/listProperties.qml
@@ -0,0 +1,44 @@
+import Qt.test 1.0
+import Qt 4.6
+
+MyQmlObject {
+ id: root
+
+ objectListProperty: [
+ Object { property int a: 10 },
+ Object { property int a: 11 }
+ ]
+
+ objectQmlListProperty: [
+ Object { property int a: 10 },
+ Object { property int a: 1 },
+ Object { property int a: 39 }
+ ]
+
+ Script {
+ function calcTest1() {
+ var rv = 0;
+ for (var ii = 0; ii < root.objectListProperty.length; ++ii) {
+ rv += root.objectListProperty[ii].a;
+ }
+ return rv;
+ }
+
+ function calcTest2() {
+ var rv = 0;
+ for (var ii = 0; ii < root.objectQmlListProperty.length; ++ii) {
+ rv += root.objectQmlListProperty[ii].a;
+ }
+ return rv;
+ }
+ }
+
+ property int test1: calcTest1();
+ property int test2: root.objectListProperty.length
+ property int test3: calcTest2();
+ property int test4: root.objectQmlListProperty.length
+ property bool test5: root.objectQmlListProperty[1] != undefined
+ property bool test6: root.objectQmlListProperty[100] == undefined
+ property bool test7: root.objectListProperty[1] != undefined
+ property bool test8: root.objectListProperty[100] == undefined
+}
diff --git a/tests/auto/declarative/qmlecmascript/testtypes.h b/tests/auto/declarative/qmlecmascript/testtypes.h
index e6c2c20..ae3a954 100644
--- a/tests/auto/declarative/qmlecmascript/testtypes.h
+++ b/tests/auto/declarative/qmlecmascript/testtypes.h
@@ -6,6 +6,7 @@
#include <QtDeclarative/qmlexpression.h>
#include <QtCore/qpoint.h>
#include <QtCore/qsize.h>
+#include <QtDeclarative/qmllist.h>
#include <QtCore/qrect.h>
class MyQmlAttachedObject : public QObject
@@ -23,11 +24,14 @@ class MyQmlObject : public QObject
Q_OBJECT
Q_ENUMS(MyEnum)
Q_ENUMS(MyEnum2)
- Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet);
+ Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet)
Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT)
Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT)
Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged)
- Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged);
+ Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged)
+ Q_PROPERTY(QmlList<QObject *> *objectQmlListProperty READ objectQmlListProperty CONSTANT)
+ Q_PROPERTY(QList<QObject *> *objectListProperty READ objectListProperty CONSTANT)
+
public:
MyQmlObject(): m_methodCalled(false), m_methodIntCalled(false), m_object(0) {}
@@ -54,6 +58,9 @@ public:
emit objectChanged();
}
+ QmlList<QObject *> *objectQmlListProperty() { return &m_objectQmlList; }
+ QList<QObject *> *objectListProperty() { return &m_objectQList; }
+
bool methodCalled() const { return m_methodCalled; }
bool methodIntCalled() const { return m_methodIntCalled; }
@@ -84,6 +91,8 @@ private:
QObject *m_object;
QString m_string;
+ QmlConcreteList<QObject *> m_objectQmlList;
+ QList<QObject *> m_objectQList;
};
QML_DECLARE_TYPE(MyQmlObject);
diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
index 7fb1703..f24882a 100644
--- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
+++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
@@ -63,6 +63,7 @@ private slots:
void extendedObjectPropertyLookup();
void scriptErrors();
void signalTriggeredBindings();
+ void listProperties();
private:
QmlEngine engine;
@@ -787,6 +788,25 @@ void tst_qmlecmascript::signalTriggeredBindings()
QCOMPARE(object->property("test2").toReal(), 400.);
}
+/*
+Test that list properties can be iterated from ECMAScript
+*/
+void tst_qmlecmascript::listProperties()
+{
+ QmlComponent component(&engine, TEST_FILE("listProperties.qml"));
+ MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("test1").toInt(), 21);
+ QCOMPARE(object->property("test2").toInt(), 2);
+ QCOMPARE(object->property("test3").toInt(), 50);
+ QCOMPARE(object->property("test4").toInt(), 3);
+ QCOMPARE(object->property("test5").toBool(), true);
+ QCOMPARE(object->property("test6").toBool(), true);
+ QCOMPARE(object->property("test7").toBool(), true);
+ QCOMPARE(object->property("test8").toBool(), true);
+}
+
QTEST_MAIN(tst_qmlecmascript)
#include "tst_qmlecmascript.moc"
diff --git a/tests/auto/declarative/qmllanguage/data/I18nÁâãäå.qml b/tests/auto/declarative/qmllanguage/data/I18nType30.qml
index 42dbc69..42dbc69 100644
--- a/tests/auto/declarative/qmllanguage/data/I18nÁâãäå.qml
+++ b/tests/auto/declarative/qmllanguage/data/I18nType30.qml
diff --git a/tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml b/tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml
new file mode 100644
index 0000000..c0b2f94
--- /dev/null
+++ b/tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml
@@ -0,0 +1,5 @@
+import Test 1.0 as Áâãäå
+
+Áâãäå.MyTypeObject {
+ stringProperty: "Test áâãäå: 40"
+}
diff --git a/tests/auto/declarative/qmllanguage/data/i18nType.qml b/tests/auto/declarative/qmllanguage/data/i18nType.qml
index 11ef895..d7954ef 100644
--- a/tests/auto/declarative/qmllanguage/data/i18nType.qml
+++ b/tests/auto/declarative/qmllanguage/data/i18nType.qml
@@ -1 +1 @@
-I18nÁâãäå { }
+I18nTypeÁâãäå { }
diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp
index b99d040..8d4ae65 100644
--- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp
+++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp
@@ -24,6 +24,8 @@ public:
}
private slots:
+ void initTestCase();
+ void cleanupTestCase();
void errors_data();
void errors();
@@ -116,6 +118,24 @@ inline QUrl TEST_FILE(const char *filename)
return TEST_FILE(QLatin1String(filename));
}
+void tst_qmllanguage::initTestCase()
+{
+ // Create locale-specific file
+ // For POSIX, this will just be data/I18nType.qml, since POSIX is 7-bit
+ // For iso8859-1 locale, this will just be data/I18nType?????.qml where ????? is 5 8-bit characters
+ // For utf-8 locale, this will be data/I18nType??????????.qml where ?????????? is 5 8-bit characters, UTF-8 encoded
+ QFile in(TEST_FILE(QLatin1String("I18nType30.qml")).toLocalFile());
+ QVERIFY(in.open(QIODevice::ReadOnly));
+ QFile out(TEST_FILE(QString::fromUtf8("I18nType\303\201\303\242\303\243\303\244\303\245.qml")).toLocalFile());
+ QVERIFY(out.open(QIODevice::WriteOnly));
+ out.write(in.readAll());
+}
+
+void tst_qmllanguage::cleanupTestCase()
+{
+ QVERIFY(QFile::remove(TEST_FILE(QString::fromUtf8("I18nType\303\201\303\242\303\243\303\244\303\245.qml")).toLocalFile()));
+}
+
void tst_qmllanguage::errors_data()
{
QTest::addColumn<QString>("file");
@@ -686,11 +706,12 @@ void tst_qmllanguage::i18n_data()
{
QTest::addColumn<QString>("file");
QTest::addColumn<QString>("stringProperty");
- QTest::newRow("i18nStrings") << "i18nStrings.qml" << QString::fromUtf8("Test áâãäå (5 accented 'a' letters)");
- QTest::newRow("i18nDeclaredPropertyNames") << "i18nDeclaredPropertyNames.qml" << QString::fromUtf8("Test áâãäå: 10");
- QTest::newRow("i18nDeclaredPropertyUse") << "i18nDeclaredPropertyUse.qml" << QString::fromUtf8("Test áâãäå: 15");
- QTest::newRow("i18nScript") << "i18nScript.qml" << QString::fromUtf8("Test áâãäå: 20");
- QTest::newRow("i18nType") << "i18nType.qml" << QString::fromUtf8("Test áâãäå: 30");
+ QTest::newRow("i18nStrings") << "i18nStrings.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245 (5 accented 'a' letters)");
+ QTest::newRow("i18nDeclaredPropertyNames") << "i18nDeclaredPropertyNames.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 10");
+ QTest::newRow("i18nDeclaredPropertyUse") << "i18nDeclaredPropertyUse.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 15");
+ QTest::newRow("i18nScript") << "i18nScript.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 20");
+ QTest::newRow("i18nType") << "i18nType.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 30");
+ QTest::newRow("i18nNameSpace") << "i18nNameSpace.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 40");
}
void tst_qmllanguage::i18n()
diff --git a/tests/auto/declarative/visual/ListView/data-X11/basic1.qml b/tests/auto/declarative/visual/ListView/data-X11/basic1.qml
new file mode 100644
index 0000000..ae59b14
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/data-X11/basic1.qml
@@ -0,0 +1,159 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 32
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 48
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 64
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 80
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 96
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 112
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 128
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 144
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 160
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 176
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 192
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 208
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 224
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 240
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 256
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 272
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 288
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 304
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 320
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 336
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 352
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 368
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 384
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 400
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 416
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 432
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 448
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 464
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 480
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 496
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 512
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 528
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 544
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 560
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 576
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+}
diff --git a/tests/auto/declarative/visual/ListView/data-X11/basic2.qml b/tests/auto/declarative/visual/ListView/data-X11/basic2.qml
new file mode 100644
index 0000000..ff19d22
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/data-X11/basic2.qml
@@ -0,0 +1,187 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 32
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 48
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 64
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 80
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 96
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 112
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 128
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 144
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 160
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 176
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 192
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 208
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 224
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 240
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 256
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 272
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 288
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 304
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 320
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 336
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 352
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 368
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 384
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 400
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 416
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 432
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 448
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 464
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 480
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 496
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 512
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 528
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 544
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 560
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 576
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 592
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 608
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 624
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 640
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 656
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 672
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 688
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+}
diff --git a/tests/auto/declarative/visual/ListView/data-X11/basic3.qml b/tests/auto/declarative/visual/ListView/data-X11/basic3.qml
new file mode 100644
index 0000000..2f33cae
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/data-X11/basic3.qml
@@ -0,0 +1,147 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 32
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 48
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 64
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 80
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 96
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 112
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 128
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 144
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 160
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 176
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 192
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 208
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 224
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 240
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 256
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 272
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 288
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 304
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 320
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 336
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 352
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 368
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 384
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 400
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 416
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 432
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 448
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 464
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 480
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 496
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 512
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 528
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+}
diff --git a/tests/auto/declarative/visual/ListView/data-X11/basic4.qml b/tests/auto/declarative/visual/ListView/data-X11/basic4.qml
new file mode 100644
index 0000000..4b1c5cf
--- /dev/null
+++ b/tests/auto/declarative/visual/ListView/data-X11/basic4.qml
@@ -0,0 +1,171 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 32
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 48
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 64
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 80
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 96
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 112
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 128
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 144
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 160
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 176
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 192
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 208
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 224
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 240
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 256
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 272
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 288
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 304
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 320
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 336
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 352
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 368
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 384
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 400
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 416
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 432
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 448
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 464
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 480
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 496
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 512
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 528
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 544
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 560
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 576
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 592
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 608
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+ Frame {
+ msec: 624
+ hash: "c0dc2737283d8dfa62631e0cbb948b99"
+ }
+}
diff --git a/tests/auto/declarative/visual/flickable/data-X11/flickable.0.png b/tests/auto/declarative/visual/flickable/data-X11/flickable.0.png
new file mode 100644
index 0000000..5da2f2a
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/data-X11/flickable.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flickable/data-X11/flickable.1.png b/tests/auto/declarative/visual/flickable/data-X11/flickable.1.png
new file mode 100644
index 0000000..1c33ca6
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/data-X11/flickable.1.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flickable/data-X11/flickable.2.png b/tests/auto/declarative/visual/flickable/data-X11/flickable.2.png
new file mode 100644
index 0000000..67cdf8f
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/data-X11/flickable.2.png
Binary files differ
diff --git a/tests/auto/declarative/visual/flickable/data-X11/flickable.qml b/tests/auto/declarative/visual/flickable/data-X11/flickable.qml
new file mode 100644
index 0000000..6a60409
--- /dev/null
+++ b/tests/auto/declarative/visual/flickable/data-X11/flickable.qml
@@ -0,0 +1,791 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 32
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 48
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 64
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 80
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 96
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 112
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 128
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 144
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 160
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 176
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 192
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 208
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 224
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 240
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 256
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 272
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 288
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 304
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 320
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 336
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 352
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 368
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 384
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 400
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 416
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 432
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 448
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 464
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 480
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 496
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 512
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 528
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 544
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 560
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 576
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 592
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 608
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 624
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 640
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 656
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 672
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 688
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 704
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Frame {
+ msec: 720
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 517; y: 154
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 736
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Mouse {
+ type: 5
+ button: 1
+ buttons: 1
+ x: 514; y: 154
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 752
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Mouse {
+ type: 5
+ button: 1
+ buttons: 1
+ x: 509; y: 155
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 768
+ hash: "2a07f4ab51ed6ac07c2efecfd561cdff"
+ }
+ Mouse {
+ type: 5
+ button: 1
+ buttons: 1
+ x: 497; y: 155
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 784
+ hash: "4f30ebc802a38cd4ad05018b6bc429a4"
+ }
+ Mouse {
+ type: 5
+ button: 1
+ buttons: 1
+ x: 480; y: 155
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 800
+ hash: "8d2e349b2aad07d98f11a30a33a5b409"
+ }
+ Mouse {
+ type: 5
+ button: 1
+ buttons: 1
+ x: 443; y: 155
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 816
+ hash: "09647796906da54345fffa18eb1b1f91"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 443; y: 155
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 832
+ hash: "09647796906da54345fffa18eb1b1f91"
+ }
+ Frame {
+ msec: 848
+ hash: "4a7dd2931129756437e38b3516474aa1"
+ }
+ Frame {
+ msec: 864
+ hash: "bbec3d9d7ca38599b03e44ed3c2b68b6"
+ }
+ Frame {
+ msec: 880
+ hash: "07214f888dba9ea84eae306cf92a0f7f"
+ }
+ Frame {
+ msec: 896
+ hash: "0feac7c874f8caf11db319c13ed2250e"
+ }
+ Frame {
+ msec: 912
+ hash: "7de76db129b4e9d17836d17fff687b99"
+ }
+ Frame {
+ msec: 928
+ hash: "7f3414d54148afd7b01ed0fe54b60ba2"
+ }
+ Frame {
+ msec: 944
+ hash: "692cde1197a0f37bee5a4e57160bff8b"
+ }
+ Frame {
+ msec: 960
+ image: "flickable.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "d0b879cb63d003c0fd00c14160e7d1a4"
+ }
+ Frame {
+ msec: 992
+ hash: "9a0879e4e9b23ad3c9340d7c28eb6386"
+ }
+ Frame {
+ msec: 1008
+ hash: "2b6f4cb48284a835f77bc6368566c187"
+ }
+ Frame {
+ msec: 1024
+ hash: "53c094e3aa4f841195b2ce4e0fa34fae"
+ }
+ Frame {
+ msec: 1040
+ hash: "3ef7530199a136d339adf677cf98f035"
+ }
+ Frame {
+ msec: 1056
+ hash: "1a707788b43773ffa05d0ad88e6f156d"
+ }
+ Frame {
+ msec: 1072
+ hash: "e51dc6702e59c68e6a34f4a8f6c5b5c5"
+ }
+ Frame {
+ msec: 1088
+ hash: "1fe6d9b517ad1b9aaf16d005577ab45d"
+ }
+ Frame {
+ msec: 1104
+ hash: "fac02bdb63d4aa7749a66f6aa91a7035"
+ }
+ Frame {
+ msec: 1120
+ hash: "4bad8d93cee30c76a4b263981adc0c2f"
+ }
+ Frame {
+ msec: 1136
+ hash: "8bcee1ab8a1ab66b22d59d975a265906"
+ }
+ Frame {
+ msec: 1152
+ hash: "a68fa84e32d4ba44d4d53b476505ff6e"
+ }
+ Frame {
+ msec: 1168
+ hash: "d7258071d6673ef22a8836a8fdc6c5a6"
+ }
+ Frame {
+ msec: 1184
+ hash: "c708f62342663a4a879c86cd97448b75"
+ }
+ Frame {
+ msec: 1200
+ hash: "2e28d213283f4791d051177f468d9246"
+ }
+ Frame {
+ msec: 1216
+ hash: "beb36da1d54eedc62b65c47ba7c43f59"
+ }
+ Frame {
+ msec: 1232
+ hash: "2cea7b5571c563a709e211fbb5684a9d"
+ }
+ Frame {
+ msec: 1248
+ hash: "9ef0bafe8a9d52bc2fb7732c02ea9304"
+ }
+ Frame {
+ msec: 1264
+ hash: "7a489611578c9590aaf1b85763d8ae2c"
+ }
+ Frame {
+ msec: 1280
+ hash: "31b8e33b788821922d6d437f40c7811c"
+ }
+ Frame {
+ msec: 1296
+ hash: "421ae01b4d757996aefb35641f167c2d"
+ }
+ Frame {
+ msec: 1312
+ hash: "175c93fde4cb520881802a57bf10be5f"
+ }
+ Frame {
+ msec: 1328
+ hash: "11602a6ca746c83c857524eafc4d9570"
+ }
+ Frame {
+ msec: 1344
+ hash: "4f10b74a1bb8d65f3d371cc613a1641a"
+ }
+ Frame {
+ msec: 1360
+ hash: "d8505ce7ad73683817ed4e3a7f3ab610"
+ }
+ Frame {
+ msec: 1376
+ hash: "a800684370e06817e1a2a34ceb2fc651"
+ }
+ Frame {
+ msec: 1392
+ hash: "267e184af16c63eefe290c6659917b34"
+ }
+ Frame {
+ msec: 1408
+ hash: "354c5b04c0ed2288c23064debb4e261e"
+ }
+ Frame {
+ msec: 1424
+ hash: "67d300a0f15f0642c4ba0c8bd7662c01"
+ }
+ Frame {
+ msec: 1440
+ hash: "2fe12d1625140c2da1f0af17e1bf548b"
+ }
+ Frame {
+ msec: 1456
+ hash: "fef2140a272d78f5c0e93ec3a4c6e6c9"
+ }
+ Frame {
+ msec: 1472
+ hash: "b9331a586bad1619e51794bc66bf36fc"
+ }
+ Frame {
+ msec: 1488
+ hash: "8ba04c015ca8c150e0bbb09769955b5d"
+ }
+ Frame {
+ msec: 1504
+ hash: "09f573e1465533e67fa0d504e5481c8b"
+ }
+ Frame {
+ msec: 1520
+ hash: "fe3e919aa08ddd51ee7b81ef405b10f4"
+ }
+ Frame {
+ msec: 1536
+ hash: "e5d85427a2e02dd83d2932205e7aa6ac"
+ }
+ Frame {
+ msec: 1552
+ hash: "4e97fda26cbb0273dd69e50cf134a147"
+ }
+ Frame {
+ msec: 1568
+ hash: "7e13b494b5397b747eb6065f7555acce"
+ }
+ Frame {
+ msec: 1584
+ hash: "fe9567c08f776bed903a74c9c21a18bb"
+ }
+ Frame {
+ msec: 1600
+ hash: "086dd974228d51513e732c96c69dd07f"
+ }
+ Frame {
+ msec: 1616
+ hash: "b43d5b4f44df55b1099c7ba339df1799"
+ }
+ Frame {
+ msec: 1632
+ hash: "ce0e82fc42ff0017b40278e323682348"
+ }
+ Frame {
+ msec: 1648
+ hash: "e28b9cee2047774d70df6510c83e9dfe"
+ }
+ Frame {
+ msec: 1664
+ hash: "568d97ff98ac2d867981eb7330b831b1"
+ }
+ Frame {
+ msec: 1680
+ hash: "10f38a5f95a91bc7380a13f5aa30f22f"
+ }
+ Frame {
+ msec: 1696
+ hash: "2f9ec9b1843f2970fa8225f313781404"
+ }
+ Frame {
+ msec: 1712
+ hash: "bdd8405a889ff9a6e33cce65416bdc43"
+ }
+ Frame {
+ msec: 1728
+ hash: "9f57f8460ade9e6ff3db7a0a8d044f07"
+ }
+ Frame {
+ msec: 1744
+ hash: "36d1e95a006c00b183b24a05c2acf12f"
+ }
+ Frame {
+ msec: 1760
+ hash: "78d7f8b056c0341b442c0eabbf6da90b"
+ }
+ Frame {
+ msec: 1776
+ hash: "f5786d9a77a28796908fcb376af2cc1f"
+ }
+ Frame {
+ msec: 1792
+ hash: "38cfaf7a356163f8ff9708ba625907b7"
+ }
+ Frame {
+ msec: 1808
+ hash: "989922a8c5e3c000811a994bfe183d7f"
+ }
+ Frame {
+ msec: 1824
+ hash: "989922a8c5e3c000811a994bfe183d7f"
+ }
+ Frame {
+ msec: 1840
+ hash: "989922a8c5e3c000811a994bfe183d7f"
+ }
+ Frame {
+ msec: 1856
+ hash: "f5786d9a77a28796908fcb376af2cc1f"
+ }
+ Frame {
+ msec: 1872
+ hash: "014cfc6573eb0a89acacd6f154098202"
+ }
+ Frame {
+ msec: 1888
+ hash: "247fead2e4139421cb6e5f7a97fa1768"
+ }
+ Frame {
+ msec: 1904
+ hash: "bdd8405a889ff9a6e33cce65416bdc43"
+ }
+ Frame {
+ msec: 1920
+ image: "flickable.1.png"
+ }
+ Frame {
+ msec: 1936
+ hash: "d64f65edf900912158634c88b5c0b5ca"
+ }
+ Frame {
+ msec: 1952
+ hash: "d714183774f603269335b0675e0656f8"
+ }
+ Frame {
+ msec: 1968
+ hash: "24f9e90f7789a7c5db65d59312d49fe1"
+ }
+ Frame {
+ msec: 1984
+ hash: "ce0e82fc42ff0017b40278e323682348"
+ }
+ Frame {
+ msec: 2000
+ hash: "f564293ff63ccc952597ac228c6437dc"
+ }
+ Frame {
+ msec: 2016
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2032
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2048
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2064
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2080
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2096
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2112
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2128
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2144
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2160
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2176
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2192
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2208
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2224
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2240
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2256
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2272
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2288
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2304
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2320
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2336
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2352
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2368
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2384
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2400
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2416
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2432
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2448
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2464
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2480
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2496
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2512
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2528
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2544
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2560
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2576
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2592
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2608
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2624
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2640
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2656
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2672
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2688
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2704
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2720
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2736
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2752
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2768
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2784
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2800
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2816
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2832
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2848
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2864
+ hash: "555d97eac7e8b06cb81f4af74098ce65"
+ }
+ Frame {
+ msec: 2880
+ image: "flickable.2.png"
+ }
+}
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test.0.png b/tests/auto/declarative/visual/focusscope/data-X11/test.0.png
new file mode 100644
index 0000000..d0fb8a0
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test.1.png b/tests/auto/declarative/visual/focusscope/data-X11/test.1.png
new file mode 100644
index 0000000..d0fb8a0
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test.1.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test.2.png b/tests/auto/declarative/visual/focusscope/data-X11/test.2.png
new file mode 100644
index 0000000..f25f27c
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test.2.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test.3.png b/tests/auto/declarative/visual/focusscope/data-X11/test.3.png
new file mode 100644
index 0000000..74a9b3f
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test.3.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test.4.png b/tests/auto/declarative/visual/focusscope/data-X11/test.4.png
new file mode 100644
index 0000000..74a9b3f
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test.4.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test.5.png b/tests/auto/declarative/visual/focusscope/data-X11/test.5.png
new file mode 100644
index 0000000..74a9b3f
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test.5.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test.qml b/tests/auto/declarative/visual/focusscope/data-X11/test.qml
new file mode 100644
index 0000000..5c66034
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test.qml
@@ -0,0 +1,1599 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 32
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 48
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 64
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 80
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 96
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 112
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 128
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 144
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 160
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 176
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 192
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 208
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 224
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 240
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 256
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 272
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 288
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 304
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 320
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 336
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 352
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 368
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 384
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 400
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 416
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 432
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 448
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 464
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 480
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 496
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 512
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 528
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 544
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 560
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 576
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 592
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 608
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 624
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 640
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 656
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 672
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 688
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 704
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 720
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 736
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 752
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 768
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 784
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 800
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 816
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 832
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 848
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 864
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 880
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 896
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 912
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 928
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 944
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 960
+ image: "test.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 992
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1008
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1024
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1040
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1056
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1072
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1088
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1104
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1120
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1136
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1152
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1168
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1184
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1200
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1216
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1232
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1248
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1264
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1280
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1296
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1312
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1328
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1344
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1360
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1376
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1392
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1408
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1424
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1440
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1456
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1472
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1488
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1504
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1520
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1536
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1552
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1568
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1584
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1600
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1616
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1632
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1648
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1664
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1680
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1696
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1712
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1728
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1744
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1760
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1776
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1792
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 1808
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1824
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1840
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1856
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1872
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1888
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1904
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1920
+ image: "test.1.png"
+ }
+ Frame {
+ msec: 1936
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1952
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1968
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 1984
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2000
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2016
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2032
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2048
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2064
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2080
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2096
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2112
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2128
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2144
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2160
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2176
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2192
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2208
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2224
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2240
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2256
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2272
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2288
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2304
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2320
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2336
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 2352
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Key {
+ type: 6
+ key: 16777237
+ modifiers: 536870912
+ text: "1f"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2368
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2384
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2400
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2416
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2432
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2448
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2464
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Key {
+ type: 7
+ key: 16777237
+ modifiers: 536870912
+ text: "1f"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2480
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2496
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2512
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2528
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2544
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2560
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2576
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2592
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2608
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2624
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2640
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2656
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2672
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2688
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2704
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2720
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2736
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2752
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2768
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2784
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2800
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2816
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2832
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2848
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2864
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2880
+ image: "test.2.png"
+ }
+ Frame {
+ msec: 2896
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2912
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2928
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2944
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2960
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 2976
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Key {
+ type: 6
+ key: 16777235
+ modifiers: 536870912
+ text: "1e"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2992
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3008
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3024
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3040
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3056
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3072
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3088
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Key {
+ type: 7
+ key: 16777235
+ modifiers: 536870912
+ text: "1e"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 3104
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3120
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3136
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3152
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3168
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3184
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3200
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3216
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3232
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3248
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3264
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3280
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3296
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3312
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3328
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3344
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3360
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3376
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3392
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3408
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3424
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3440
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3456
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3472
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3488
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3504
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3520
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Frame {
+ msec: 3536
+ hash: "e608f3483071562580bf492da25a4104"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 3552
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3568
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3584
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3600
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3616
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3632
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3648
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 3664
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3680
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3696
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3712
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3728
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3744
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3760
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3776
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3792
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3808
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3824
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3840
+ image: "test.3.png"
+ }
+ Frame {
+ msec: 3856
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3872
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3888
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3904
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3920
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3936
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3952
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3968
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 3984
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4000
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4016
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4032
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4048
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4064
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4080
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4096
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4112
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4128
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4144
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4160
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4176
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Key {
+ type: 6
+ key: 16777237
+ modifiers: 536870912
+ text: "1f"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 4192
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4208
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4224
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4240
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4256
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4272
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Key {
+ type: 7
+ key: 16777237
+ modifiers: 536870912
+ text: "1f"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 4288
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4304
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4320
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4336
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4352
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4368
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4384
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4400
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4416
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4432
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4448
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4464
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4480
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4496
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4512
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4528
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4544
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4560
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4576
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4592
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4608
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4624
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4640
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4656
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4672
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4688
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4704
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4720
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4736
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4752
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4768
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Frame {
+ msec: 4784
+ hash: "231a20ad55d5ba3be9baf46a80ec86f4"
+ }
+ Key {
+ type: 6
+ key: 16777235
+ modifiers: 536870912
+ text: "1e"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 4800
+ image: "test.4.png"
+ }
+ Frame {
+ msec: 4816
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4832
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4848
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4864
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4880
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4896
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Key {
+ type: 7
+ key: 16777235
+ modifiers: 536870912
+ text: "1e"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 4912
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4928
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4944
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4960
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4976
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 4992
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5008
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5024
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5040
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5056
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5072
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5088
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5104
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5120
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5136
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5152
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5168
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5184
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5200
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5216
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5232
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5248
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5264
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5280
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5296
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5312
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5328
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5344
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5360
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5376
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5392
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5408
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5424
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5440
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5456
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5472
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5488
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5504
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5520
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5536
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5552
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5568
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5584
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5600
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5616
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5632
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5648
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5664
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5680
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5696
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5712
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5728
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5744
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5760
+ image: "test.5.png"
+ }
+ Frame {
+ msec: 5776
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5792
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 5808
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5824
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5840
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5856
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5872
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+ Frame {
+ msec: 5888
+ hash: "383edfe8be8621d456162cc1cd88ae1a"
+ }
+}
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test2.0.png b/tests/auto/declarative/visual/focusscope/data-X11/test2.0.png
new file mode 100644
index 0000000..6be7aef
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test2.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test2.1.png b/tests/auto/declarative/visual/focusscope/data-X11/test2.1.png
new file mode 100644
index 0000000..6be7aef
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test2.1.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test2.qml b/tests/auto/declarative/visual/focusscope/data-X11/test2.qml
new file mode 100644
index 0000000..7170907
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test2.qml
@@ -0,0 +1,607 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 32
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 48
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 64
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 80
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 96
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 112
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 128
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 144
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 160
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 176
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 192
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 208
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 224
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 240
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 256
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 272
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 288
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 304
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 320
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 336
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 352
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 368
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 384
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 400
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 416
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 432
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 448
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 464
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 480
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 496
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 512
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 528
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 544
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 560
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 576
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 592
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 608
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 624
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 640
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 656
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 672
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 688
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 704
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 720
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 736
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 752
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 768
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 784
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 800
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 816
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 832
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 848
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 864
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 880
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 896
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 912
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 928
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 944
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 960
+ image: "test2.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 992
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1008
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1024
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1040
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1056
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1072
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1088
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1104
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1120
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1136
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1152
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1168
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1184
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1200
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1216
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1232
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1248
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1264
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1280
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1296
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1312
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1328
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1344
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1360
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1376
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1392
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1408
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1424
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1440
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1456
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1472
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1488
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1504
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1520
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1536
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1552
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1568
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1584
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1600
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1616
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1632
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1648
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1664
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1680
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1696
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1712
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1728
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1744
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1760
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1776
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1792
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1808
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1824
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1840
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1856
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1872
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1888
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1904
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1920
+ image: "test2.1.png"
+ }
+ Frame {
+ msec: 1936
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1952
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1968
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 1984
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2000
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2016
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2032
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2048
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2064
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2080
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2096
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2112
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2128
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2144
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2160
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2176
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2192
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2208
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2224
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2240
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2256
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2272
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2288
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2304
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2320
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2336
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2352
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+ Frame {
+ msec: 2368
+ hash: "529409797f67656145ea88544bb8cc9f"
+ }
+}
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.0.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.0.png
new file mode 100644
index 0000000..2821112
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.1.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.1.png
new file mode 100644
index 0000000..d3aeb93
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.1.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.2.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.2.png
new file mode 100644
index 0000000..d7b647f
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.2.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.3.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.3.png
new file mode 100644
index 0000000..551efc8
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.3.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.4.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.4.png
new file mode 100644
index 0000000..5e59cbe
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.4.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.5.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.5.png
new file mode 100644
index 0000000..622c768
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.5.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.6.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.6.png
new file mode 100644
index 0000000..d7b647f
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.6.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.7.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.7.png
new file mode 100644
index 0000000..d3aeb93
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.7.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.8.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.8.png
new file mode 100644
index 0000000..891a10a
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.8.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.9.png b/tests/auto/declarative/visual/focusscope/data-X11/test3.9.png
new file mode 100644
index 0000000..c346260
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.9.png
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data-X11/test3.qml b/tests/auto/declarative/visual/focusscope/data-X11/test3.qml
new file mode 100644
index 0000000..e7cb67c
--- /dev/null
+++ b/tests/auto/declarative/visual/focusscope/data-X11/test3.qml
@@ -0,0 +1,2879 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 32
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 48
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 64
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 80
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 96
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 112
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 128
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 144
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 160
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 176
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 192
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 208
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 224
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 240
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 256
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 272
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 288
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 304
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 320
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 336
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 352
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 368
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 384
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 400
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 416
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 432
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 448
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 464
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 480
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 496
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 512
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 528
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 544
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 560
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 576
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 592
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 608
+ hash: "70404a8e19cee8dad4a7dc16b3b018e2"
+ }
+ Frame {
+ msec: 624
+ hash: "70404a8e19cee8dad4a7dc16b3b018e2"
+ }
+ Frame {
+ msec: 640
+ hash: "42ede0774612c5ce72bcb17c1f8c53fb"
+ }
+ Frame {
+ msec: 656
+ hash: "acbf5d05e87e456b49636a8e533b8819"
+ }
+ Frame {
+ msec: 672
+ hash: "1c3adf6475d5bbf23c83dda77614834f"
+ }
+ Frame {
+ msec: 688
+ hash: "b047088d7d135614c7de5d6b1fe6447c"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 704
+ hash: "59393e79f5571c1b0b54ceb96c570afd"
+ }
+ Frame {
+ msec: 720
+ hash: "2657a9db93dab4180ddf5a3d928fa83c"
+ }
+ Frame {
+ msec: 736
+ hash: "bd012a5b982553780ef81ea273381988"
+ }
+ Frame {
+ msec: 752
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 768
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 784
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 800
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 816
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 832
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 848
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 864
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 880
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 896
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 912
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 928
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 944
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 960
+ image: "test3.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 992
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 1008
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 1024
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 1040
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 1056
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 1072
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 1088
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1104
+ hash: "3ba7daa96383cc7fcd2f3e15b9b46bea"
+ }
+ Frame {
+ msec: 1120
+ hash: "3ba7daa96383cc7fcd2f3e15b9b46bea"
+ }
+ Frame {
+ msec: 1136
+ hash: "c097e88ae5cea1203735aba2de753b35"
+ }
+ Frame {
+ msec: 1152
+ hash: "309058119191341625c797e14b1d68fd"
+ }
+ Frame {
+ msec: 1168
+ hash: "d2d44135892d56e556b6343e0d2177df"
+ }
+ Frame {
+ msec: 1184
+ hash: "8f77166dfb871d1ad3c4b21e9626dcf8"
+ }
+ Frame {
+ msec: 1200
+ hash: "b6bd7476decc62d295414eea18f21ffb"
+ }
+ Frame {
+ msec: 1216
+ hash: "8ca06a6b2787a3e684b6a0614baf057f"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1232
+ hash: "119130d0bde37eb6038e4fbcea54d619"
+ }
+ Frame {
+ msec: 1248
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1264
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1280
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1296
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1312
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1328
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1344
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1360
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1376
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1392
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1408
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1424
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1440
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1456
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1472
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1488
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1504
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 1520
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1536
+ hash: "d36e8e689b999046f5671cce03ec98b9"
+ }
+ Frame {
+ msec: 1552
+ hash: "d36e8e689b999046f5671cce03ec98b9"
+ }
+ Frame {
+ msec: 1568
+ hash: "1ae470df65b1637dfed5ed330bf6f2cc"
+ }
+ Frame {
+ msec: 1584
+ hash: "fd98bff5f8c97cf0644aca6d205720b3"
+ }
+ Frame {
+ msec: 1600
+ hash: "6c97607356ec22d77da6170de94ed1b8"
+ }
+ Frame {
+ msec: 1616
+ hash: "ee49691989ffada50e3b82df960ec1cb"
+ }
+ Frame {
+ msec: 1632
+ hash: "fba046a966f5ebdc17a73c33fb2fb1af"
+ }
+ Frame {
+ msec: 1648
+ hash: "5031c1c466e14e7daf39be6af1a9c402"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1664
+ hash: "508c31a76bbb9ae50ec44484ea889289"
+ }
+ Frame {
+ msec: 1680
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1696
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1712
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1728
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1744
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1760
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1776
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1792
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1808
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1824
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1840
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1856
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1872
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1888
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1904
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1920
+ image: "test3.1.png"
+ }
+ Frame {
+ msec: 1936
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1952
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1968
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 1984
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 2000
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2016
+ hash: "c79134dc4b03885c0c2139e9f1949968"
+ }
+ Frame {
+ msec: 2032
+ hash: "c79134dc4b03885c0c2139e9f1949968"
+ }
+ Frame {
+ msec: 2048
+ hash: "6f29381e25034bcb9177033fdaf1ee4c"
+ }
+ Frame {
+ msec: 2064
+ hash: "e9668338280735ed6cf1e71f02d28f04"
+ }
+ Frame {
+ msec: 2080
+ hash: "ecd5a887981d564c6e40c215ebb867d2"
+ }
+ Frame {
+ msec: 2096
+ hash: "0960f7192633036319aa3500dbf38d2b"
+ }
+ Frame {
+ msec: 2112
+ hash: "22ececdfdd7eb5a8999df153de47c2e6"
+ }
+ Frame {
+ msec: 2128
+ hash: "f77abe52bd76bca4b728415c4dfd52dc"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2144
+ hash: "6d19c9df56ed8037dd5a123945b6fea0"
+ }
+ Frame {
+ msec: 2160
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2176
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2192
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2208
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2224
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2240
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2256
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2272
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2288
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2304
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2320
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2336
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2352
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2368
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2384
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2400
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2416
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2432
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2448
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2464
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2480
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2496
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 2512
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2528
+ hash: "3e0fa3d0d36a4ea51e9e89933d91e58a"
+ }
+ Frame {
+ msec: 2544
+ hash: "3e0fa3d0d36a4ea51e9e89933d91e58a"
+ }
+ Frame {
+ msec: 2560
+ hash: "eea826901b19fb3c7aff8594d8030acb"
+ }
+ Frame {
+ msec: 2576
+ hash: "a673c5dbc0b1b7bf585319a923db6478"
+ }
+ Frame {
+ msec: 2592
+ hash: "c9fa9bdb8c8ad8c1144feb4a7f9ae96e"
+ }
+ Frame {
+ msec: 2608
+ hash: "646601d0aabe76467c3317fb12e785e5"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2624
+ hash: "a88500a959cd4127528a74af4979d83a"
+ }
+ Frame {
+ msec: 2640
+ hash: "ab288556e0bff85a48be364ee7a61b18"
+ }
+ Frame {
+ msec: 2656
+ hash: "db5d053fd16f3bd6e3048f1d7f123027"
+ }
+ Frame {
+ msec: 2672
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2688
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2704
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2720
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2736
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2752
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2768
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2784
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2800
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2816
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2832
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2848
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2864
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2880
+ image: "test3.2.png"
+ }
+ Frame {
+ msec: 2896
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2912
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2928
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2944
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2960
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 2976
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 2992
+ hash: "dfc6df49c4340429529e88e877940158"
+ }
+ Frame {
+ msec: 3008
+ hash: "dfc6df49c4340429529e88e877940158"
+ }
+ Frame {
+ msec: 3024
+ hash: "e44644da7159bfde1a1cf6148d268c53"
+ }
+ Frame {
+ msec: 3040
+ hash: "f0045733c7f4e799c4ca49ec28c7c652"
+ }
+ Frame {
+ msec: 3056
+ hash: "8b0ded24c343556849ea67d191c03a17"
+ }
+ Frame {
+ msec: 3072
+ hash: "0c50a579850c3eb43c4824bf7e8b1d12"
+ }
+ Frame {
+ msec: 3088
+ hash: "747d2205db14cf72dc5989e92b8076ab"
+ }
+ Frame {
+ msec: 3104
+ hash: "a0a9196cb896eadf411cbcccaa069f10"
+ }
+ Frame {
+ msec: 3120
+ hash: "c682ad7747f7245b4e213fc078d51e8f"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 3136
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3152
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3168
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3184
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3200
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3216
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3232
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3248
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3264
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3280
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3296
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3312
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3328
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3344
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3360
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3376
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3392
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3408
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3424
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3440
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3456
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3472
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 3488
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 3504
+ hash: "115b81c715a58e66c3d1f09bb03fe97f"
+ }
+ Frame {
+ msec: 3520
+ hash: "115b81c715a58e66c3d1f09bb03fe97f"
+ }
+ Frame {
+ msec: 3536
+ hash: "a994e45c41afe0a4ab7d65c27139f3d8"
+ }
+ Frame {
+ msec: 3552
+ hash: "b02ecf8c3413752aa1d2bfa6e08184ca"
+ }
+ Frame {
+ msec: 3568
+ hash: "85ef0bedcb66676ca658068561d8df8e"
+ }
+ Frame {
+ msec: 3584
+ hash: "435bce6119a6542ce9ad743baa70ceb0"
+ }
+ Frame {
+ msec: 3600
+ hash: "5918c9c068ca62795d7b97ac818d79d5"
+ }
+ Frame {
+ msec: 3616
+ hash: "ff3ebc0c6f7eb39bbc10fad07b671d82"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 3632
+ hash: "0426b9666ccd84aa0d095e47a9379bd7"
+ }
+ Frame {
+ msec: 3648
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3664
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3680
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3696
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3712
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3728
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3744
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3760
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3776
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3792
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3808
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3824
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3840
+ image: "test3.3.png"
+ }
+ Frame {
+ msec: 3856
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3872
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3888
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3904
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3920
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3936
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3952
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3968
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 3984
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Key {
+ type: 6
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 4000
+ hash: "30901e72d40975b92c9d96c0f52b458c"
+ }
+ Frame {
+ msec: 4016
+ hash: "30901e72d40975b92c9d96c0f52b458c"
+ }
+ Frame {
+ msec: 4032
+ hash: "f4f84cb8e42e269b121b2ffa9204db38"
+ }
+ Frame {
+ msec: 4048
+ hash: "41e9198277d0d590d176fd9972bfbf58"
+ }
+ Frame {
+ msec: 4064
+ hash: "664bddf12068363afc89f8fc52d133c0"
+ }
+ Frame {
+ msec: 4080
+ hash: "18a12504f09551bd6e3013ef1bbf40f9"
+ }
+ Frame {
+ msec: 4096
+ hash: "95717e24255e442d955d3c64691576e0"
+ }
+ Frame {
+ msec: 4112
+ hash: "7cb9b9a71bfb1cd3061efde86e57ff34"
+ }
+ Key {
+ type: 7
+ key: 16777236
+ modifiers: 536870912
+ text: "1d"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 4128
+ hash: "a090d2c37080361240769198f1032b7a"
+ }
+ Frame {
+ msec: 4144
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4160
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4176
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4192
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4208
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4224
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4240
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4256
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4272
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4288
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4304
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4320
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4336
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4352
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4368
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4384
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4400
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4416
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4432
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4448
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4464
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4480
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4496
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4512
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4528
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4544
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4560
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4576
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4592
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4608
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4624
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4640
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4656
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4672
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4688
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4704
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4720
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4736
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4752
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4768
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4784
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4800
+ image: "test3.4.png"
+ }
+ Frame {
+ msec: 4816
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4832
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4848
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4864
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4880
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4896
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4912
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4928
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4944
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4960
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4976
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 4992
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 5008
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 5024
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 5040
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 5056
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 5072
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 5088
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Frame {
+ msec: 5104
+ hash: "c37a8dc01901eb4a1fb0d6ac3c91fca0"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 5120
+ hash: "0a524f53903aa1651152fd4a6068c14c"
+ }
+ Frame {
+ msec: 5136
+ hash: "0a524f53903aa1651152fd4a6068c14c"
+ }
+ Frame {
+ msec: 5152
+ hash: "bbef86b80161702653b88f6cfa88528c"
+ }
+ Frame {
+ msec: 5168
+ hash: "26de302dde8fb22e509c0b3c8cb37abd"
+ }
+ Frame {
+ msec: 5184
+ hash: "9f3ec01bf5ae12383a58a716d462d479"
+ }
+ Frame {
+ msec: 5200
+ hash: "cbfa90ccd871ba1ab12f75e8e5f2e11e"
+ }
+ Frame {
+ msec: 5216
+ hash: "c5ba4fd178429a1cb44ec96da8a1a404"
+ }
+ Frame {
+ msec: 5232
+ hash: "fb87133ef012abe68491be1cc627d580"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 5248
+ hash: "0f8147bf9cd92eec88ea6f8b9f2ad5eb"
+ }
+ Frame {
+ msec: 5264
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5280
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5296
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5312
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5328
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5344
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5360
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5376
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5392
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5408
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5424
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5440
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5456
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5472
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5488
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5504
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5520
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5536
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5552
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5568
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5584
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5600
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5616
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5632
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5648
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5664
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5680
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5696
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Frame {
+ msec: 5712
+ hash: "f2ca9897c874faa97f2d959964da4bd1"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 5728
+ hash: "f78a62f7143dbf86e0b153fe08a9bf6e"
+ }
+ Frame {
+ msec: 5744
+ hash: "f78a62f7143dbf86e0b153fe08a9bf6e"
+ }
+ Frame {
+ msec: 5760
+ image: "test3.5.png"
+ }
+ Frame {
+ msec: 5776
+ hash: "e89f6d4727cf92ce87e4c48eb34074a6"
+ }
+ Frame {
+ msec: 5792
+ hash: "eb7761ac018dbb93b72acd3126a7eace"
+ }
+ Frame {
+ msec: 5808
+ hash: "a70638789eeaada677afa68a7dcc1f97"
+ }
+ Frame {
+ msec: 5824
+ hash: "bb709f17058d1f41b34831d1055195cc"
+ }
+ Frame {
+ msec: 5840
+ hash: "3b459f10eb299712180fed277c75ca22"
+ }
+ Frame {
+ msec: 5856
+ hash: "8f77a04a3690f7cbfae4858c8fff1a24"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 5872
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 5888
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 5904
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 5920
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 5936
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 5952
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 5968
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 5984
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6000
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6016
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6032
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6048
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6064
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6080
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6096
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6112
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6128
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6144
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6160
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6176
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6192
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6208
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6224
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6240
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6256
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Frame {
+ msec: 6272
+ hash: "0d20e56256c2aa305c487c7875249c45"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 6288
+ hash: "80a729efc25a86d09977f6abe4b96e77"
+ }
+ Frame {
+ msec: 6304
+ hash: "80a729efc25a86d09977f6abe4b96e77"
+ }
+ Frame {
+ msec: 6320
+ hash: "75e57461badc3fd9c38548c751a86b62"
+ }
+ Frame {
+ msec: 6336
+ hash: "b0f49c8a67bdf1285334514d78a6b613"
+ }
+ Frame {
+ msec: 6352
+ hash: "564bca050cfc30f19b77989a1e3a26d8"
+ }
+ Frame {
+ msec: 6368
+ hash: "caca4855c581f42b26623bf717302884"
+ }
+ Frame {
+ msec: 6384
+ hash: "89db7709fcec729023c910608b504665"
+ }
+ Frame {
+ msec: 6400
+ hash: "5501f75f4b8b3229a7db38df4e9cc938"
+ }
+ Frame {
+ msec: 6416
+ hash: "505d12f5900fa920f47c650d24745ec5"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 6432
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6448
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6464
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6480
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6496
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6512
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6528
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6544
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6560
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6576
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6592
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6608
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6624
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6640
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6656
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6672
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6688
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6704
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6720
+ image: "test3.6.png"
+ }
+ Frame {
+ msec: 6736
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6752
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6768
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6784
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6800
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6816
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6832
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Frame {
+ msec: 6848
+ hash: "4e9b6719737e92ef409b76772a9d6b4a"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 6864
+ hash: "240f48d1c5aa1c23bf1c660a0a468283"
+ }
+ Frame {
+ msec: 6880
+ hash: "240f48d1c5aa1c23bf1c660a0a468283"
+ }
+ Frame {
+ msec: 6896
+ hash: "e1ba9a4edfd19acffdf25e51dbbc94a5"
+ }
+ Frame {
+ msec: 6912
+ hash: "e40877ef6876be3f44db947af54287bc"
+ }
+ Frame {
+ msec: 6928
+ hash: "a72d66c4691d03e7b9a12df9df3d4b4d"
+ }
+ Frame {
+ msec: 6944
+ hash: "26cda82027725475f2be660a8e8b2463"
+ }
+ Frame {
+ msec: 6960
+ hash: "233e9b1c58cc338d22e3d3ca8669a33a"
+ }
+ Frame {
+ msec: 6976
+ hash: "316788ce1340cb0e151d12d244a48068"
+ }
+ Frame {
+ msec: 6992
+ hash: "6213c8fde998ae5b819f9e3f7f7ea857"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 7008
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7024
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7040
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7056
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7072
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7088
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7104
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7120
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7136
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7152
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7168
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7184
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7200
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7216
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7232
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7248
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7264
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7280
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7296
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7312
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7328
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7344
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7360
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7376
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7392
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7408
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7424
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Frame {
+ msec: 7440
+ hash: "316d165df776e906015714372e67f452"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 7456
+ hash: "37bfd610be786be852b78bdb933b9a01"
+ }
+ Frame {
+ msec: 7472
+ hash: "37bfd610be786be852b78bdb933b9a01"
+ }
+ Frame {
+ msec: 7488
+ hash: "05b41d669cdb7821d3db181c444f9667"
+ }
+ Frame {
+ msec: 7504
+ hash: "2ddf3b590860a1db12d04ab4dde830a3"
+ }
+ Frame {
+ msec: 7520
+ hash: "ecc85633bf413d41da38b87d21c92653"
+ }
+ Frame {
+ msec: 7536
+ hash: "829b18a6568680d9fbf720926ec65954"
+ }
+ Frame {
+ msec: 7552
+ hash: "04f844fe5b2f944d435a9c66d93d2907"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 7568
+ hash: "49680fff1a16c74de135a72c6b13d156"
+ }
+ Frame {
+ msec: 7584
+ hash: "a4b4e3a49ce12e8a8a1a43a808555243"
+ }
+ Frame {
+ msec: 7600
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7616
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7632
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7648
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7664
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7680
+ image: "test3.7.png"
+ }
+ Frame {
+ msec: 7696
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7712
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7728
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7744
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7760
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7776
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7792
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7808
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7824
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7840
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7856
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7872
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7888
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7904
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7920
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7936
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7952
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Frame {
+ msec: 7968
+ hash: "aa35e3c7afbb686aca85da5f4d3dc17b"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 7984
+ hash: "0211b4e4fe18757e34bec35eab5fde3b"
+ }
+ Frame {
+ msec: 8000
+ hash: "0211b4e4fe18757e34bec35eab5fde3b"
+ }
+ Frame {
+ msec: 8016
+ hash: "abbd3f1a519e8f667b2eebe75c9b4cb3"
+ }
+ Frame {
+ msec: 8032
+ hash: "803607ec60ef51b54444a184462beb0f"
+ }
+ Frame {
+ msec: 8048
+ hash: "e0b670a80137b3fa8ca9ae8fab5aa123"
+ }
+ Frame {
+ msec: 8064
+ hash: "a291881f5d7a42973ac4a6054418259a"
+ }
+ Frame {
+ msec: 8080
+ hash: "c5ed7f0b91af1bf0eba6c149bccb72ab"
+ }
+ Frame {
+ msec: 8096
+ hash: "25b094fc7f6e8442ae672439a5b10a79"
+ }
+ Frame {
+ msec: 8112
+ hash: "9bc4a4dc68228a400b9e87d645e29828"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 8128
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8144
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8160
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8176
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8192
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8208
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8224
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8240
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8256
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8272
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8288
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8304
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8320
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8336
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8352
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8368
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8384
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8400
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8416
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8432
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8448
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8464
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8480
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Frame {
+ msec: 8496
+ hash: "4baf177df487bf872c7edd4ab4561120"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 8512
+ hash: "2eabf99cadf1ded6a355bdf39715ad57"
+ }
+ Frame {
+ msec: 8528
+ hash: "2eabf99cadf1ded6a355bdf39715ad57"
+ }
+ Frame {
+ msec: 8544
+ hash: "7e70fd7a53929ef47f69c63273818ee1"
+ }
+ Frame {
+ msec: 8560
+ hash: "e76066a86a120d7abf0d645c804c9e69"
+ }
+ Frame {
+ msec: 8576
+ hash: "e79a0e6badc18ded04e07ce6b805b493"
+ }
+ Frame {
+ msec: 8592
+ hash: "67891f5078a0c34a3fb17bbc325b9011"
+ }
+ Frame {
+ msec: 8608
+ hash: "6533d214e86aa581da50d26cc1bcd34e"
+ }
+ Frame {
+ msec: 8624
+ hash: "c649e873c3ce3fe5639e8d9b9912eafe"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 8640
+ image: "test3.8.png"
+ }
+ Frame {
+ msec: 8656
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8672
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8688
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8704
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8720
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8736
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8752
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8768
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8784
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8800
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8816
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8832
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8848
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8864
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8880
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8896
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8912
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8928
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8944
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8960
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8976
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 8992
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 9008
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 9024
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 9040
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Frame {
+ msec: 9056
+ hash: "3b0e8ae88404e6c12e7918bfc30dc49e"
+ }
+ Key {
+ type: 6
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 9072
+ hash: "72494522826c29edd9a763342d8ee909"
+ }
+ Frame {
+ msec: 9088
+ hash: "72494522826c29edd9a763342d8ee909"
+ }
+ Frame {
+ msec: 9104
+ hash: "ecba7d108741a940d77920db52f6bc47"
+ }
+ Frame {
+ msec: 9120
+ hash: "6aa456342c3bb8b6071c28c5d550929e"
+ }
+ Frame {
+ msec: 9136
+ hash: "bd94dbfa0651b9060cacdbe9a9adc38c"
+ }
+ Frame {
+ msec: 9152
+ hash: "bb6e75073be7b1e9f3c66761b72611b2"
+ }
+ Frame {
+ msec: 9168
+ hash: "11bfc218dd57a9909b1fd7f021577cfa"
+ }
+ Frame {
+ msec: 9184
+ hash: "d2fbc4d380862423ad2d3a33468b417d"
+ }
+ Frame {
+ msec: 9200
+ hash: "0ca09d4275b1c36575e484d79a7d8d2a"
+ }
+ Key {
+ type: 7
+ key: 16777234
+ modifiers: 536870912
+ text: "1c"
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 9216
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9232
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9248
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9264
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9280
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9296
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9312
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9328
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9344
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9360
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9376
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9392
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9408
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9424
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9440
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9456
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9472
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9488
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9504
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9520
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9536
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9552
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9568
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9584
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9600
+ image: "test3.9.png"
+ }
+ Frame {
+ msec: 9616
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9632
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9648
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9664
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9680
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9696
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9712
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9728
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9744
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9760
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9776
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9792
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9808
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9824
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9840
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9856
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9872
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9888
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9904
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9920
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9936
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9952
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9968
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 9984
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10000
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10016
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10032
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10048
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10064
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10080
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10096
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10112
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10128
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10144
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10160
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10176
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10192
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10208
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10224
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10240
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10256
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10272
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10288
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10304
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10320
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10336
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10352
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10368
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 10384
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10400
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10416
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+ Frame {
+ msec: 10432
+ hash: "d157fdaf13170250e66768364e90e820"
+ }
+}
diff --git a/tests/auto/declarative/visual/focusscope/data/test3.0.png.reject.png b/tests/auto/declarative/visual/focusscope/data/test3.0.png.reject.png
deleted file mode 100644
index 374acf5..0000000
--- a/tests/auto/declarative/visual/focusscope/data/test3.0.png.reject.png
+++ /dev/null
Binary files differ
diff --git a/tests/auto/declarative/visual/focusscope/data/test3.1.png.reject.png b/tests/auto/declarative/visual/focusscope/data/test3.1.png.reject.png
deleted file mode 100644
index 795071b..0000000
--- a/tests/auto/declarative/visual/focusscope/data/test3.1.png.reject.png
+++ /dev/null
Binary files differ
diff --git a/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.png b/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.png
new file mode 100644
index 0000000..b2734e4
--- /dev/null
+++ b/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.qml b/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.qml
new file mode 100644
index 0000000..d5f1cff
--- /dev/null
+++ b/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.qml
@@ -0,0 +1,279 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 32
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 48
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 64
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 80
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 96
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 112
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 128
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 144
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 160
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 176
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 192
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 208
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 224
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 240
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 256
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 272
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 288
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 304
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 320
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 336
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 352
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 368
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 384
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 400
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 416
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 432
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 448
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 464
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 480
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 496
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 512
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 528
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 544
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 560
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 576
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 592
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 608
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 624
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 640
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 656
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 672
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 688
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 704
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 720
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 736
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 752
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 768
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 784
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 800
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 816
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 832
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 848
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 864
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 880
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 896
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 912
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 928
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 944
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 960
+ image: "elide.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 992
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 1008
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 1024
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 1040
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+ Frame {
+ msec: 1056
+ hash: "dd213807dd517c25972f0f6f42b01c17"
+ }
+}
diff --git a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml
new file mode 100644
index 0000000..6cd37b4
--- /dev/null
+++ b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml
@@ -0,0 +1,20 @@
+import Qt 4.6
+
+Rectangle {
+ width: 500
+ height: 50
+ color: "lightBlue"
+ Rectangle {
+ width: MyText.width
+ height: MyText.height
+ color: "white"
+ anchors.centerIn: parent
+ Text {
+ id: MyText
+ width: NumberAnimation { from: 500; to: 0; running: true; repeat: true; duration: 1000 }
+ elide: "ElideRight"
+ text: "aaaaaaa bbbbbbb ccccccc\x9Caaaaa bbbbb ccccc\x9Caaa bbb ccc\x9Ca b c"
+ text: "Brevity is the soul of wit, and tediousness the limbs and outward flourishes.\x9CBrevity is a great charm of eloquence.\x9CBe concise!\x9CSHHHHHHHHHHHHHHHHHHHHHHHHHHHH"
+ }
+ }
+}
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic1.0.png b/tests/auto/declarative/visual/repeater/data-X11/basic1.0.png
new file mode 100644
index 0000000..18ab543
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic1.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic1.qml b/tests/auto/declarative/visual/repeater/data-X11/basic1.qml
new file mode 100644
index 0000000..bf215ca
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic1.qml
@@ -0,0 +1,323 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 32
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 48
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 64
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 80
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 96
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 112
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 128
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 144
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 160
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 176
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 192
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 208
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 224
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 240
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 256
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 272
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 288
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 304
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 320
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 336
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 352
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 368
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 384
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 400
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 416
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 432
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 448
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 464
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 480
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 496
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 512
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 528
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 544
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 560
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 576
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 592
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 608
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 624
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 640
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 656
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 672
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 688
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 704
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 720
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 736
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 752
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 768
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 784
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 800
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 816
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 832
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 848
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 864
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 880
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 896
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 912
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 928
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 944
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 960
+ image: "basic1.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 992
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1008
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1024
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1040
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1056
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1072
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1088
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1104
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1120
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1136
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1152
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1168
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1184
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1200
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1216
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1232
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+}
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic2.0.png b/tests/auto/declarative/visual/repeater/data-X11/basic2.0.png
new file mode 100644
index 0000000..18ab543
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic2.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic2.qml b/tests/auto/declarative/visual/repeater/data-X11/basic2.qml
new file mode 100644
index 0000000..cb6b46c
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic2.qml
@@ -0,0 +1,331 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 32
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 48
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 64
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 80
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 96
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 112
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 128
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 144
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 160
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 176
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 192
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 208
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 224
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 240
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 256
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 272
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 288
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 304
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 320
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 336
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 352
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 368
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 384
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 400
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 416
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 432
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 448
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 464
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 480
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 496
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 512
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 528
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 544
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 560
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 576
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 592
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 608
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 624
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 640
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 656
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 672
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 688
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 704
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 720
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 736
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 752
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 768
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 784
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 800
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 816
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 832
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 848
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 864
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 880
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 896
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 912
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 928
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 944
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 960
+ image: "basic2.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 992
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1008
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1024
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1040
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1056
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1072
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1088
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1104
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1120
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1136
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1152
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1168
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1184
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1200
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1216
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1232
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1248
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1264
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+}
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic3.0.png b/tests/auto/declarative/visual/repeater/data-X11/basic3.0.png
new file mode 100644
index 0000000..18ab543
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic3.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic3.qml b/tests/auto/declarative/visual/repeater/data-X11/basic3.qml
new file mode 100644
index 0000000..9545fa9
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic3.qml
@@ -0,0 +1,347 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 32
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 48
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 64
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 80
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 96
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 112
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 128
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 144
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 160
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 176
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 192
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 208
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 224
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 240
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 256
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 272
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 288
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 304
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 320
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 336
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 352
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 368
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 384
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 400
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 416
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 432
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 448
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 464
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 480
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 496
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 512
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 528
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 544
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 560
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 576
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 592
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 608
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 624
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 640
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 656
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 672
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 688
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 704
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 720
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 736
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 752
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 768
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 784
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 800
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 816
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 832
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 848
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 864
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 880
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 896
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 912
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 928
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 944
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 960
+ image: "basic3.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 992
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1008
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1024
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1040
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1056
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1072
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1088
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1104
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1120
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1136
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1152
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1168
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1184
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1200
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1216
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1232
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1248
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1264
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1280
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1296
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1312
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1328
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+}
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic4.0.png b/tests/auto/declarative/visual/repeater/data-X11/basic4.0.png
new file mode 100644
index 0000000..18ab543
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic4.0.png
Binary files differ
diff --git a/tests/auto/declarative/visual/repeater/data-X11/basic4.qml b/tests/auto/declarative/visual/repeater/data-X11/basic4.qml
new file mode 100644
index 0000000..4839206
--- /dev/null
+++ b/tests/auto/declarative/visual/repeater/data-X11/basic4.qml
@@ -0,0 +1,419 @@
+import Qt.VisualTest 4.6
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 32
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 48
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 64
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 80
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 96
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 112
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 128
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 144
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 160
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 176
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 192
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 208
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 224
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 240
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 256
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 272
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 288
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 304
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 320
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 336
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 352
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 368
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 384
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 400
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 416
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 432
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 448
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 464
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 480
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 496
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 512
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 528
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 544
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 560
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 576
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 592
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 608
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 624
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 640
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 656
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 672
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 688
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 704
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 720
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 736
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 752
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 768
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 784
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 800
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 816
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 832
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 848
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 864
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 880
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 896
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 912
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 928
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 944
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 960
+ image: "basic4.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 992
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1008
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1024
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1040
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1056
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1072
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1088
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1104
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1120
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1136
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1152
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1168
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1184
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1200
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1216
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1232
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1248
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1264
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1280
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1296
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1312
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1328
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1344
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1360
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1376
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1392
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1408
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Key {
+ type: 6
+ key: 16777249
+ modifiers: 0
+ text: ""
+ autorep: false
+ count: 1
+ }
+ Frame {
+ msec: 1424
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1440
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1456
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1472
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1488
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1504
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1520
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1536
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1552
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1568
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1584
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1600
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+ Frame {
+ msec: 1616
+ hash: "71dedc2f057c660fa5089de2dd6313a4"
+ }
+}
diff --git a/tests/auto/declarative/visual/tst_visual.cpp b/tests/auto/declarative/visual/tst_visual.cpp
index d95fa5b..cb32085 100644
--- a/tests/auto/declarative/visual/tst_visual.cpp
+++ b/tests/auto/declarative/visual/tst_visual.cpp
@@ -7,6 +7,8 @@
#include <QProcess>
#include <QFile>
+enum Mode { Record, Play, TestVisuals, UpdateVisuals, UpdatePlatformVisuals, Test };
+
static QString testdir;
class tst_visual : public QObject
{
@@ -14,7 +16,7 @@ class tst_visual : public QObject
public:
tst_visual();
- static QString toTestScript(const QString &);
+ static QString toTestScript(const QString &, Mode=Test);
static QString viewer();
private slots:
@@ -84,7 +86,7 @@ void tst_visual::visual()
QCOMPARE(p.exitCode(), 0);
}
-QString tst_visual::toTestScript(const QString &file)
+QString tst_visual::toTestScript(const QString &file, Mode mode)
{
if (!file.endsWith(".qml"))
return QString();
@@ -93,9 +95,43 @@ QString tst_visual::toTestScript(const QString &file)
if (index == -1)
return QString();
+ const char* platformsuffix=0; // platforms with different fonts
+#if defined(Q_WS_MACX)
+ platformsuffix = "-MAC";
+#elif defined(Q_WS_X11)
+ platformsuffix = "-X11";
+#elif defined(Q_WS_WIN32)
+ platformsuffix = "-WIN";
+#elif defined(Q_WS_QWS)
+ platformsuffix = "-QWS";
+#elif defined(Q_WS_S60)
+ platformsuffix = "-S60";
+#endif
+
QString testdata = file.left(index + 1) +
- QString("data") + QDir::separator() +
- file.mid(index + 1, file.length() - index - 5);
+ QString("data");
+ QString testname = file.mid(index + 1, file.length() - index - 5);
+
+ if (platformsuffix && (mode == UpdatePlatformVisuals || QFile::exists(testdata+QLatin1String(platformsuffix)+QDir::separator()+testname))) {
+ QString platformdir = testdata + QLatin1String(platformsuffix);
+ if (mode == UpdatePlatformVisuals) {
+ Q_ASSERT(QDir().mkpath(platformdir));
+ // Copy from base
+ QDir dir(testdata,testname+".*");
+ dir.setFilter(QDir::Files);
+ QFileInfoList list = dir.entryInfoList();
+ for (int i = 0; i < list.size(); ++i) {
+ QFile in(list.at(i).filePath());
+ Q_ASSERT(in.open(QIODevice::ReadOnly));
+ QFile out(platformdir + QDir::separator() + list.at(i).fileName());
+ Q_ASSERT(out.open(QIODevice::WriteOnly));
+ out.write(in.readAll());
+ }
+ }
+ testdata = platformdir;
+ }
+
+ testdata += QDir::separator() + testname;
return testdata;
}
@@ -115,7 +151,7 @@ QStringList tst_visual::findQmlFiles(const QDir &d)
QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot |
QDir::NoSymLinks);
foreach (const QString &dir, dirs) {
- if (dir == "data")
+ if (dir.left(4) == "data")
continue;
QDir sub = d;
@@ -126,13 +162,11 @@ QStringList tst_visual::findQmlFiles(const QDir &d)
return rv;
}
-enum Mode { Record, Play, TestVisuals, UpdateVisuals, Test };
-
void action(Mode mode, const QString &file)
{
Q_ASSERT(mode != Test);
- QString testdata = tst_visual::toTestScript(file);
+ QString testdata = tst_visual::toTestScript(file,mode);
if (Record == mode) {
QStringList arguments;
@@ -161,7 +195,7 @@ void action(Mode mode, const QString &file)
p.setProcessChannelMode(QProcess::ForwardedChannels);
p.start(tst_visual::viewer(), arguments);
p.waitForFinished();
- } else if (UpdateVisuals == mode) {
+ } else if (UpdateVisuals == mode || UpdatePlatformVisuals == mode) {
QStringList arguments;
arguments << "-script" << testdata
<< "-scriptopts" << "play,record,exitoncomplete,saveonexit"
@@ -177,10 +211,11 @@ void usage()
{
fprintf(stderr, "\n");
fprintf(stderr, "QML related options\n");
- fprintf(stderr, " -record file : record new test data for file\n");
- fprintf(stderr, " -play file : playback test data for file, printing errors\n");
- fprintf(stderr, " -testvisuals file : playback test data for file, without errors\n");
- fprintf(stderr, " -updatevisuals file : playback test data for file, accept new visuals for file\n");
+ fprintf(stderr, " -record file : record new test data for file\n");
+ fprintf(stderr, " -play file : playback test data for file, printing errors\n");
+ fprintf(stderr, " -testvisuals file : playback test data for file, without errors\n");
+ fprintf(stderr, " -updatevisuals file : playback test data for file, accept new visuals for file\n");
+ fprintf(stderr, " -updateplatformvisuals file : playback test data for file, accept new visuals for file only on current platform (MacOSX/Win32/X11/QWS/S60)\n");
}
int main(int argc, char **argv)
@@ -209,6 +244,9 @@ int main(int argc, char **argv)
} else if (arg == "-updatevisuals" && (ii + 1) < argc) {
mode = UpdateVisuals;
file = argv[++ii];
+ } else if (arg == "-updateplatformvisuals" && (ii + 1) < argc) {
+ mode = UpdatePlatformVisuals;
+ file = argv[++ii];
} else {
newArgv[newArgc++] = argv[ii];
}
diff --git a/tools/qmldebugger/engine.cpp b/tools/qmldebugger/engine.cpp
index 321f5e0..fac10f3 100644
--- a/tools/qmldebugger/engine.cpp
+++ b/tools/qmldebugger/engine.cpp
@@ -1,144 +1,21 @@
-#include "engine.h"
-#include "propertyview.h"
-#include "watchtablemodel.h"
-#include <QtDeclarative/qmldebugclient.h>
-#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
-#include <QLineEdit>
-#include <QTreeWidget>
-#include <QTableWidget>
#include <QSplitter>
#include <QTabWidget>
-#include <QMouseEvent>
-#include <QAction>
-#include <QMenu>
-#include <QInputDialog>
#include <QFile>
-#include <QHeaderView>
-#include <QPointer>
+
#include <private/qmlenginedebug_p.h>
+#include <QtDeclarative/qmldebugclient.h>
#include <QtDeclarative/qmlcomponent.h>
#include <QtDeclarative/qfxitem.h>
#include <QtDeclarative/qmldebugservice.h>
-QT_BEGIN_NAMESPACE
-
-
-class QmlObjectTree : public QTreeWidget
-{
- Q_OBJECT
-public:
- enum AdditionalRoles {
- ContextIdRole = Qt::UserRole + 1
- };
-
- QmlObjectTree(QWidget *parent = 0);
-
- QTreeWidgetItem *findItemByObjectId(int debugId) const;
-
-signals:
- void addExpressionWatch(int debugId, const QString &);
-
-protected:
- virtual void mousePressEvent(QMouseEvent *);
-
-private:
- QTreeWidgetItem *findItem(QTreeWidgetItem *item, int debugId) const;
-};
-
-QmlObjectTree::QmlObjectTree(QWidget *parent)
-: QTreeWidget(parent)
-{
-}
-
-QTreeWidgetItem *QmlObjectTree::findItemByObjectId(int debugId) const
-{
- for (int i=0; i<topLevelItemCount(); i++) {
- QTreeWidgetItem *item = findItem(topLevelItem(i), debugId);
- if (item)
- return item;
- }
-
- return 0;
-}
-
-QTreeWidgetItem *QmlObjectTree::findItem(QTreeWidgetItem *item, int debugId) const
-{
- if (item->data(0, Qt::UserRole).toInt() == debugId)
- return item;
-
- QTreeWidgetItem *child;
- for (int i=0; i<item->childCount(); i++) {
- child = findItem(item->child(i), debugId);
- if (child)
- return child;
- }
-
- return 0;
-}
-
-void QmlObjectTree::mousePressEvent(QMouseEvent *me)
-{
- QTreeWidget::mousePressEvent(me);
- if (!currentItem())
- return;
- if(me->button() == Qt::RightButton && me->type() == QEvent::MouseButtonPress) {
- QAction action(tr("Add watch..."), 0);
- QList<QAction *> actions;
- actions << &action;
- int debugId = currentItem()->data(0, Qt::UserRole).toInt();
- if (debugId >= 0 && QMenu::exec(actions, me->globalPos())) {
- bool ok = false;
- QString watch = QInputDialog::getText(this, tr("Watch expression"),
- tr("Expression:"), QLineEdit::Normal, QString(), &ok);
- if (ok && !watch.isEmpty())
- emit addExpressionWatch(debugId, watch);
- }
- }
-}
-
-
-class WatchTableHeaderView : public QHeaderView
-{
- Q_OBJECT
-public:
- WatchTableHeaderView(QTableView *parent);
-
-signals:
- void stopWatching(int column);
-
-protected:
- void mousePressEvent(QMouseEvent *me);
-
-private:
- QTableView *m_table;
-};
-
-WatchTableHeaderView::WatchTableHeaderView(QTableView *parent)
- : QHeaderView(Qt::Horizontal, parent), m_table(parent)
-{
- QObject::connect(this, SIGNAL(sectionClicked(int)),
- m_table, SLOT(selectColumn(int)));
- setClickable(true);
-}
+#include "engine.h"
+#include "objectpropertiesview.h"
+#include "objecttree.h"
+#include "watchtable.h"
-void WatchTableHeaderView::mousePressEvent(QMouseEvent *me)
-{
- QHeaderView::mousePressEvent(me);
-
- if (me->button() == Qt::RightButton && me->type() == QEvent::MouseButtonPress) {
- int col = logicalIndexAt(me->pos());
- if (col >= 0) {
- m_table->selectColumn(col);
- QAction action(tr("Stop watching"), 0);
- QList<QAction *> actions;
- actions << &action;
- if (QMenu::exec(actions, me->globalPos()))
- emit stopWatching(col);
- }
- }
-}
+QT_BEGIN_NAMESPACE
class DebuggerEngineItem : public QObject
@@ -159,14 +36,12 @@ private:
int m_engineId;
};
-EnginePane::EnginePane(QmlDebugConnection *client, QWidget *parent)
-: QWidget(parent), m_client(client), m_engines(0), m_context(0), m_object(0), m_watchedObject(0), m_watchTableModel(0)
+EnginePane::EnginePane(QmlDebugConnection *conn, QWidget *parent)
+: QWidget(parent), m_client(new QmlEngineDebug(conn, this)), m_engines(0), m_context(0), m_watchTableModel(0)
{
- QVBoxLayout *layout = new QVBoxLayout;
+ QVBoxLayout *layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
- setLayout(layout);
-
QFile enginesFile(":/engines.qml");
enginesFile.open(QFile::ReadOnly);
Q_ASSERT(enginesFile.isOpen());
@@ -187,30 +62,34 @@ EnginePane::EnginePane(QmlDebugConnection *client, QWidget *parent)
QSplitter *splitter = new QSplitter;
- m_objTree = new QmlObjectTree(this);
- m_objTree->setHeaderHidden(true);
- connect(m_objTree, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(itemClicked(QTreeWidgetItem *)));
- connect(m_objTree, SIGNAL(addExpressionWatch(int,QString)), this, SLOT(addExpressionWatch(int,QString)));
- splitter->addWidget(m_objTree);
+ m_objTree = new ObjectTree(m_client, this);
+ m_propertiesView = new ObjectPropertiesView(m_client);
+ m_watchTableModel = new WatchTableModel(m_client, this);
+
+ m_watchTableView = new WatchTableView(m_watchTableModel);
+ m_watchTableView->setModel(m_watchTableModel);
+ WatchTableHeaderView *header = new WatchTableHeaderView(m_watchTableModel);
+ m_watchTableView->setHorizontalHeader(header);
+
+ connect(m_objTree, SIGNAL(objectSelected(QmlDebugObjectReference)),
+ m_propertiesView, SLOT(reload(QmlDebugObjectReference)));
+ connect(m_objTree, SIGNAL(expressionWatchRequested(QmlDebugObjectReference,QString)),
+ m_watchTableModel, SLOT(expressionWatchRequested(QmlDebugObjectReference,QString)));
+
+ connect(m_propertiesView, SIGNAL(activated(QmlDebugObjectReference,QmlDebugPropertyReference)),
+ m_watchTableModel, SLOT(togglePropertyWatch(QmlDebugObjectReference,QmlDebugPropertyReference)));
- m_propView = new PropertyView(this);
- connect(m_propView, SIGNAL(propertyActivated(QmlDebugPropertyReference)),
- this, SLOT(propertyActivated(QmlDebugPropertyReference)));
+ connect(m_watchTableModel, SIGNAL(watchCreated(QmlDebugWatch*)),
+ m_propertiesView, SLOT(watchCreated(QmlDebugWatch*)));
- m_watchTableModel = new WatchTableModel(this);
- m_watchTable = new QTableView(this);
- m_watchTable->setModel(m_watchTableModel);
- QObject::connect(m_watchTable, SIGNAL(activated(QModelIndex)),
- this, SLOT(watchedItemActivated(QModelIndex)));
- WatchTableHeaderView *header = new WatchTableHeaderView(m_watchTable);
- m_watchTable->setHorizontalHeader(header);
- QObject::connect(header, SIGNAL(stopWatching(int)),
- this, SLOT(stopWatching(int)));
+ connect(m_watchTableView, SIGNAL(objectActivated(int)),
+ m_objTree, SLOT(selectObject(int)));
m_tabs = new QTabWidget(this);
- m_tabs->addTab(m_propView, tr("Properties"));
- m_tabs->addTab(m_watchTable, tr("Watched"));
+ m_tabs->addTab(m_propertiesView, tr("Properties"));
+ m_tabs->addTab(m_watchTableView, tr("Watched"));
+ splitter->addWidget(m_objTree);
splitter->addWidget(m_tabs);
splitter->setStretchFactor(1, 2);
layout->addWidget(splitter);
@@ -222,128 +101,6 @@ void EnginePane::engineSelected(int id)
queryContext(id);
}
-void EnginePane::itemClicked(QTreeWidgetItem *item)
-{
- m_propView->clear();
-
- if (m_object) {
- delete m_object;
- m_object = 0;
- }
-
- m_object = m_client.queryObjectRecursive(QmlDebugObjectReference(item->data(0, Qt::UserRole).toInt()), this);
- if (!m_object->isWaiting())
- showProperties();
- else
- QObject::connect(m_object, SIGNAL(stateChanged(State)),
- this, SLOT(showProperties()));
-}
-
-void EnginePane::showProperties()
-{
- QmlDebugObjectReference obj = m_object->object();
- m_propView->setObject(obj);
-
- if (m_watchedObject) {
- m_client.removeWatch(m_watchedObject);
- delete m_watchedObject;
- m_watchedObject = 0;
- }
-
- QmlDebugWatch *watch = m_client.addWatch(obj, this);
- if (watch->state() != QmlDebugWatch::Dead) {
- m_watchedObject = watch;
- QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)),
- this, SLOT(valueChanged(QByteArray,QVariant)));
- }
-
- delete m_object; m_object = 0;
-}
-
-void EnginePane::addExpressionWatch(int debugId, const QString &expr)
-{
- QmlDebugWatch *watch = m_client.addWatch(QmlDebugObjectReference(debugId), expr, this);
-
- if (watch->state() != QmlDebugWatch::Dead) {
- QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)),
- this, SLOT(valueChanged(QByteArray,QVariant)));
- m_watchTableModel->addWatch(watch, expr);
- m_watchTable->resizeColumnsToContents();
- }
-}
-
-void EnginePane::valueChanged(const QByteArray &propertyName, const QVariant &value)
-{
- QmlDebugWatch *watch = qobject_cast<QmlDebugWatch*>(sender());
-
- m_watchTableModel->updateWatch(watch, value);
-
- if (!propertyName.isEmpty()) {
- if (watch->objectDebugId() == m_propView->object().debugId())
- m_propView->updateProperty(propertyName, value);
- }
-}
-
-void EnginePane::propertyActivated(const QmlDebugPropertyReference &property)
-{
- PropertyView *view = qobject_cast<PropertyView*>(sender());
- if (!view)
- return;
-
- QmlDebugObjectReference object = view->object();
- QmlDebugWatch *watch = m_watchTableModel->findWatch(object.debugId(), property.name());
- if (watch) {
- m_client.removeWatch(watch);
- delete watch;
- watch = 0;
- } else {
- QmlDebugWatch *watch = m_client.addWatch(property, this);
- if (watch->state() != QmlDebugWatch::Dead) {
- QObject::connect(watch, SIGNAL(stateChanged(State)),
- this, SLOT(propertyWatchStateChanged()));
- QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)),
- this, SLOT(valueChanged(QByteArray,QVariant)));
- QString desc = property.name()
- + QLatin1String(" on\n")
- + object.className()
- + QLatin1String(": ")
- + (object.name().isEmpty() ? QLatin1String("<unnamed>") : object.name());
- m_watchTableModel->addWatch(watch, desc);
- m_watchTable->resizeColumnsToContents();
- }
- }
-}
-
-void EnginePane::propertyWatchStateChanged()
-{
- QmlDebugPropertyWatch *watch = qobject_cast<QmlDebugPropertyWatch*>(sender());
- if (watch && watch->objectDebugId() == m_propView->object().debugId())
- m_propView->setPropertyIsWatched(watch->name(), watch->state() == QmlDebugWatch::Active);
-}
-
-void EnginePane::stopWatching(int column)
-{
- QmlDebugWatch *watch = m_watchTableModel->findWatch(column);
- if (watch) {
- m_client.removeWatch(watch);
- delete watch;
- watch = 0;
- }
-}
-
-void EnginePane::watchedItemActivated(const QModelIndex &index)
-{
- QmlDebugWatch *watch = m_watchTableModel->findWatch(index.column());
- if (!watch)
- return;
- QTreeWidgetItem *item = m_objTree->findItemByObjectId(watch->objectDebugId());
- if (item) {
- m_objTree->setCurrentItem(item);
- m_objTree->scrollToItem(item);
- item->setExpanded(true);
- }
-}
-
void EnginePane::queryContext(int id)
{
if (m_context) {
@@ -351,88 +108,30 @@ void EnginePane::queryContext(int id)
m_context = 0;
}
- m_context = m_client.queryRootContexts(QmlDebugEngineReference(id), this);
+ m_context = m_client->queryRootContexts(QmlDebugEngineReference(id), this);
if (!m_context->isWaiting())
contextChanged();
else
- QObject::connect(m_context, SIGNAL(stateChanged(State)),
+ QObject::connect(m_context, SIGNAL(stateChanged(State)),
this, SLOT(contextChanged()));
}
void EnginePane::contextChanged()
{
- dump(m_context->rootContext(), 0);
+ //dump(m_context->rootContext(), 0);
+
foreach (const QmlDebugObjectReference &object, m_context->rootContext().objects())
- fetchObject(object.debugId());
+ m_objTree->reload(object.debugId());
delete m_context; m_context = 0;
}
-void EnginePane::dump(const QmlDebugContextReference &ctxt, int ind)
-{
- QByteArray indent(ind * 4, ' ');
- qWarning().nospace() << indent.constData() << ctxt.debugId() << " "
- << qPrintable(ctxt.name());
-
- for (int ii = 0; ii < ctxt.contexts().count(); ++ii)
- dump(ctxt.contexts().at(ii), ind + 1);
-
- for (int ii = 0; ii < ctxt.objects().count(); ++ii)
- dump(ctxt.objects().at(ii), ind);
-}
-
-void EnginePane::dump(const QmlDebugObjectReference &obj, int ind)
-{
- QByteArray indent(ind * 4, ' ');
- qWarning().nospace() << indent.constData() << qPrintable(obj.className())
- << " " << qPrintable(obj.name()) << " "
- << obj.debugId();
-
- for (int ii = 0; ii < obj.children().count(); ++ii)
- dump(obj.children().at(ii), ind + 1);
-}
-
-
-void EnginePane::buildTree(const QmlDebugObjectReference &obj, QTreeWidgetItem *parent)
-{
- if (!parent)
- m_objTree->clear();
-
- QTreeWidgetItem *item = parent ? new QTreeWidgetItem(parent) : new QTreeWidgetItem(m_objTree);
- item->setText(0, obj.className());
- item->setData(0, Qt::UserRole, obj.debugId());
- item->setData(0, QmlObjectTree::ContextIdRole, obj.contextDebugId());
-
- if (parent && obj.contextDebugId() >= 0
- && obj.contextDebugId() != parent->data(0, QmlObjectTree::ContextIdRole).toInt()) {
- QmlDebugFileReference source = obj.source();
- if (!source.url().isEmpty()) {
- QString toolTipString = QLatin1String("URL: ") + source.url().toString();
- item->setToolTip(0, toolTipString);
- }
- item->setForeground(0, QColor("orange"));
- } else {
- item->setExpanded(true);
- }
-
- if (obj.contextDebugId() < 0)
- item->setForeground(0, Qt::lightGray);
-
- for (int ii = 0; ii < obj.children().count(); ++ii)
- buildTree(obj.children().at(ii), item);
-}
-
void EnginePane::refreshEngines()
{
if (m_engines)
return;
- QList<QmlDebugWatch *> watches = m_watchTableModel->watches();
- for (int i=0; i<watches.count(); i++)
- m_client.removeWatch(watches[i]);
- qDeleteAll(watches);
-
- m_engines = m_client.queryAvailableEngines(this);
+ m_engines = m_client->queryAvailableEngines(this);
if (!m_engines->isWaiting())
enginesChanged();
else
@@ -462,28 +161,6 @@ void EnginePane::enginesChanged()
engineSelected(qobject_cast<DebuggerEngineItem*>(m_engineItems.at(0))->engineId());
}
-void EnginePane::fetchObject(int id)
-{
- if (m_object) {
- delete m_object;
- m_object = 0;
- }
-
- m_object = m_client.queryObjectRecursive(QmlDebugObjectReference(id), this);
- if (!m_object->isWaiting())
- objectFetched();
- else
- QObject::connect(m_object, SIGNAL(stateChanged(State)),
- this, SLOT(objectFetched()));
-}
-
-void EnginePane::objectFetched()
-{
- dump(m_object->object(), 0);
- buildTree(m_object->object(), 0);
- delete m_object; m_object = 0;
-}
-
#include "engine.moc"
diff --git a/tools/qmldebugger/engine.h b/tools/qmldebugger/engine.h
index c7707ed..8e8c0f2 100644
--- a/tools/qmldebugger/engine.h
+++ b/tools/qmldebugger/engine.h
@@ -10,21 +10,15 @@
QT_BEGIN_NAMESPACE
+class ObjectPropertiesView;
class QmlDebugConnection;
class QmlDebugPropertyReference;
class QmlDebugWatch;
-class QmlObjectTree;
-class EngineClientPlugin;
-class PropertyView;
+class ObjectTree;
class WatchTableModel;
-class QLineEdit;
-class QModelIndex;
-class QTreeWidget;
-class QTreeWidgetItem;
+class WatchTableView;
+
class QTabWidget;
-class QTableWidget;
-class QTableView;
-class QTableWidgetItem;
class EnginePane : public QWidget
{
@@ -41,42 +35,23 @@ private slots:
void queryContext(int);
void contextChanged();
- void fetchObject(int);
- void objectFetched();
-
void engineSelected(int);
- void itemClicked(QTreeWidgetItem *);
- void showProperties();
- void addExpressionWatch(int debugId, const QString &expr);
-
- void valueChanged(const QByteArray &property, const QVariant &value);
-
- void propertyActivated(const QmlDebugPropertyReference &property);
- void propertyWatchStateChanged();
- void watchedItemActivated(const QModelIndex &index);
- void stopWatching(int column);
-
private:
- void dump(const QmlDebugContextReference &, int);
- void dump(const QmlDebugObjectReference &, int);
- void buildTree(const QmlDebugObjectReference &, QTreeWidgetItem *parent);
-
- QmlEngineDebug m_client;
+ QmlEngineDebug *m_client;
QmlDebugEnginesQuery *m_engines;
QmlDebugRootContextQuery *m_context;
- QmlDebugObjectQuery *m_object;
- QmlObjectTree *m_objTree;
+ ObjectTree *m_objTree;
QTabWidget *m_tabs;
- PropertyView *m_propView;
- QTableView *m_watchTable;
+ WatchTableView *m_watchTableView;
QmlView *m_engineView;
QList<QObject *> m_engineItems;
- QmlDebugWatch *m_watchedObject;
WatchTableModel *m_watchTableModel;
+
+ ObjectPropertiesView *m_propertiesView;
};
QT_END_NAMESPACE
diff --git a/tools/qmldebugger/main.cpp b/tools/qmldebugger/main.cpp
index ccd3761..c9983cd 100644
--- a/tools/qmldebugger/main.cpp
+++ b/tools/qmldebugger/main.cpp
@@ -1,154 +1,6 @@
-#include <QtNetwork/qtcpsocket.h>
#include <QtGui/qapplication.h>
-#include <QtGui/qwidget.h>
-#include <QtGui/qpainter.h>
-#include <QtGui/qscrollbar.h>
-#include <QtDeclarative/qmldebugclient.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qdatastream.h>
-#include <QtCore/qtimer.h>
-#include "canvasframerate.h"
-#include "engine.h"
-#include <QVBoxLayout>
-#include <QPushButton>
-#include <QLineEdit>
-#include <QTabWidget>
-#include <QSpinBox>
-#include <QLabel>
-class Shell : public QWidget
-{
-Q_OBJECT
-public:
- Shell(QWidget * = 0);
-
- void setHost(const QString &host);
- void setPort(quint16 port);
- void showEngineTab();
-
-public slots:
- void connectToHost();
- void disconnectFromHost();
-
-private slots:
- void connectionStateChanged();
-
-private:
- QmlDebugConnection client;
-
- QLabel *m_connectionState;
- QLineEdit *m_host;
- QSpinBox *m_port;
- QPushButton *m_connectButton;
- QPushButton *m_disconnectButton;
-
- EnginePane *m_enginePane;
- QTabWidget *m_tabs;
-};
-
-Shell::Shell(QWidget *parent)
-: QWidget(parent)
-{
- QVBoxLayout *layout = new QVBoxLayout;
- setLayout(layout);
-
-
- QHBoxLayout *connectLayout = new QHBoxLayout;
- layout->addLayout(connectLayout);
- connectLayout->addStretch(2);
-
- m_connectionState = new QLabel(this);
- connectLayout->addWidget(m_connectionState);
- m_host = new QLineEdit(this);
- m_host->setText("127.0.0.1");
- connectLayout->addWidget(m_host);
- m_port = new QSpinBox(this);
- m_port->setMinimum(1024);
- m_port->setMaximum(20000);
- m_port->setValue(3768);
- connectLayout->addWidget(m_port);
- m_connectButton = new QPushButton(tr("Connect"), this);
- QObject::connect(m_connectButton, SIGNAL(clicked()),
- this, SLOT(connectToHost()));
- connectLayout->addWidget(m_connectButton);
- m_disconnectButton = new QPushButton(tr("Disconnect"), this);
- QObject::connect(m_disconnectButton, SIGNAL(clicked()),
- this, SLOT(disconnectFromHost()));
- m_disconnectButton->setEnabled(false);
- connectLayout->addWidget(m_disconnectButton);
-
- m_tabs = new QTabWidget(this);
- layout->addWidget(m_tabs);
-
- CanvasFrameRate *cfr = new CanvasFrameRate(&client, this);
- m_tabs->addTab(cfr, tr("Frame Rate"));
-
- m_enginePane = new EnginePane(&client, this);
- m_tabs->addTab(m_enginePane, tr("QML Engine"));
-
- QObject::connect(&client, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(connectionStateChanged()));
- connectionStateChanged();
-}
-
-void Shell::setHost(const QString &host)
-{
- m_host->setText(host);
-}
-
-void Shell::setPort(quint16 port)
-{
- m_port->setValue(port);
-}
-
-void Shell::showEngineTab()
-{
- m_tabs->setCurrentWidget(m_enginePane);
-}
-
-void Shell::connectionStateChanged()
-{
- switch (client.state()) {
- default:
- case QAbstractSocket::UnconnectedState:
- m_connectionState->setText(tr("Disconnected"));
- m_connectButton->setEnabled(true);
- m_disconnectButton->setEnabled(false);
- break;
- case QAbstractSocket::HostLookupState:
- m_connectionState->setText(tr("Resolving"));
- m_connectButton->setEnabled(false);
- m_disconnectButton->setEnabled(true);
- break;
- case QAbstractSocket::ConnectingState:
- m_connectionState->setText(tr("Connecting"));
- m_connectButton->setEnabled(false);
- m_disconnectButton->setEnabled(true);
- break;
- case QAbstractSocket::ConnectedState:
- m_connectionState->setText(tr("Connected"));
- m_connectButton->setEnabled(false);
- m_disconnectButton->setEnabled(true);
-
- QTimer::singleShot(0, m_enginePane, SLOT(refreshEngines()));
- break;
- case QAbstractSocket::ClosingState:
- m_connectionState->setText(tr("Closing"));
- m_connectButton->setEnabled(false);
- m_disconnectButton->setEnabled(false);
- break;
- }
-}
-
-void Shell::connectToHost()
-{
- client.connectToHost(m_host->text(), m_port->value());
-}
-
-void Shell::disconnectFromHost()
-{
- client.disconnectFromHost();
-}
+#include "qmldebugger.h"
int main(int argc, char ** argv)
{
@@ -156,24 +8,27 @@ int main(int argc, char ** argv)
QStringList args = app.arguments();
- Shell shell;
+ QmlDebugger win;
if (args.contains("--engine"))
- shell.showEngineTab();
+ win.showEngineTab();
- if (args.count() > 1 && args.at(1).contains(':')) {
- QStringList hostAndPort = args.at(1).split(':');
+ for (int i=0; i<args.count(); i++) {
+ if (!args[i].contains(':'))
+ continue;
+ QStringList hostAndPort = args[i].split(':');
bool ok = false;
- quint16 port = hostAndPort[1].toInt(&ok);
+ quint16 port = hostAndPort.value(1).toInt(&ok);
if (ok) {
- shell.setHost(hostAndPort[0]);
- shell.setPort(port);
- shell.connectToHost();
+ qWarning() << "qmldebugger connecting to"
+ << hostAndPort[0] << port << "...";
+ win.setHost(hostAndPort[0]);
+ win.setPort(port);
+ win.connectToHost();
+ break;
}
}
- shell.show();
+ win.show();
return app.exec();
}
-
-#include "main.moc"
diff --git a/tools/qmldebugger/objectpropertiesview.cpp b/tools/qmldebugger/objectpropertiesview.cpp
new file mode 100644
index 0000000..f725194
--- /dev/null
+++ b/tools/qmldebugger/objectpropertiesview.cpp
@@ -0,0 +1,176 @@
+#include <QtCore/qdebug.h>
+
+#include <QtGui/qtreewidget.h>
+#include <QtGui/qlayout.h>
+
+#include <QtDeclarative/qmldebugservice.h>
+#include <QtDeclarative/qmldebug.h>
+#include <QtDeclarative/qmldebugclient.h>
+
+#include "objectpropertiesview.h"
+
+QT_BEGIN_NAMESPACE
+
+class PropertiesViewItem : public QObject, public QTreeWidgetItem
+{
+ Q_OBJECT
+public:
+ PropertiesViewItem(QTreeWidget *widget);
+ PropertiesViewItem(QTreeWidgetItem *parent);
+
+ QmlDebugPropertyReference property;
+};
+
+PropertiesViewItem::PropertiesViewItem(QTreeWidget *widget)
+: QTreeWidgetItem(widget)
+{
+}
+
+PropertiesViewItem::PropertiesViewItem(QTreeWidgetItem *parent)
+: QTreeWidgetItem(parent)
+{
+}
+
+ObjectPropertiesView::ObjectPropertiesView(QmlEngineDebug *client, QWidget *parent)
+ : QWidget(parent),
+ m_client(client),
+ m_query(0),
+ m_watch(0)
+{
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+ setLayout(layout);
+
+ m_tree = new QTreeWidget(this);
+ m_tree->setExpandsOnDoubleClick(false);
+ m_tree->setHeaderLabels(QStringList() << tr("Property") << tr("Value"));
+ QObject::connect(m_tree, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
+ this, SLOT(itemActivated(QTreeWidgetItem *)));
+
+ m_tree->setColumnCount(2);
+
+ layout->addWidget(m_tree);
+}
+
+void ObjectPropertiesView::reload(const QmlDebugObjectReference &obj)
+{
+ if (m_query)
+ delete m_query;
+
+ m_query = m_client->queryObjectRecursive(obj, this);
+ if (!m_query->isWaiting())
+ queryFinished();
+ else
+ QObject::connect(m_query, SIGNAL(stateChanged(State)),
+ this, SLOT(queryFinished()));
+}
+
+void ObjectPropertiesView::queryFinished()
+{
+ if (!m_query)
+ return;
+
+ QmlDebugObjectReference obj = m_query->object();
+
+ QmlDebugWatch *watch = m_client->addWatch(obj, this);
+ if (watch->state() == QmlDebugWatch::Dead) {
+ delete watch;
+ watch = 0;
+ } else {
+ if (m_watch) {
+ m_client->removeWatch(m_watch);
+ delete m_watch;
+ }
+ m_watch = watch;
+ QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)),
+ this, SLOT(valueChanged(QByteArray,QVariant)));
+ }
+
+ delete m_query;
+ m_query = 0;
+
+ setObject(obj);
+}
+
+void ObjectPropertiesView::setObject(const QmlDebugObjectReference &object)
+{
+ m_object = object;
+ m_tree->clear();
+
+
+ QList<QmlDebugPropertyReference> properties = object.properties();
+ for (int i=0; i<properties.count(); i++) {
+ const QmlDebugPropertyReference &p = properties[i];
+
+ PropertiesViewItem *item = new PropertiesViewItem(m_tree);
+ item->property = p;
+
+ item->setText(0, p.name());
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ if (!p.hasNotifySignal())
+ item->setForeground(0, Qt::lightGray);
+
+ if (!p.binding().isEmpty()) {
+ PropertiesViewItem *binding = new PropertiesViewItem(item);
+ binding->setText(1, p.binding());
+ binding->setForeground(1, Qt::darkGreen);
+ }
+
+ item->setExpanded(true);
+ }
+
+ m_tree->resizeColumnToContents(0);
+}
+
+void ObjectPropertiesView::watchCreated(QmlDebugWatch *watch)
+{
+ if (watch->objectDebugId() == m_object.debugId()
+ && qobject_cast<QmlDebugPropertyWatch*>(watch)) {
+ connect(watch, SIGNAL(stateChanged(State)), SLOT(watchStateChanged()));
+ setWatched(qobject_cast<QmlDebugPropertyWatch*>(watch)->name(), true);
+ }
+}
+
+void ObjectPropertiesView::watchStateChanged()
+{
+ QmlDebugWatch *watch = qobject_cast<QmlDebugWatch*>(sender());
+
+ if (watch->objectDebugId() == m_object.debugId()
+ && qobject_cast<QmlDebugPropertyWatch*>(watch)
+ && watch->state() == QmlDebugWatch::Inactive) {
+ setWatched(qobject_cast<QmlDebugPropertyWatch*>(watch)->name(), false);
+ }
+}
+
+void ObjectPropertiesView::setWatched(const QString &property, bool watched)
+{
+ for (int i=0; i<m_tree->topLevelItemCount(); i++) {
+ PropertiesViewItem *item = static_cast<PropertiesViewItem *>(m_tree->topLevelItem(i));
+ if (item->property.name() == property && item->property.hasNotifySignal()) {
+ QFont font = m_tree->font();
+ font.setBold(watched);
+ item->setFont(0, font);
+ }
+ }
+}
+
+void ObjectPropertiesView::valueChanged(const QByteArray &name, const QVariant &value)
+{
+ for (int i=0; i<m_tree->topLevelItemCount(); i++) {
+ PropertiesViewItem *item = static_cast<PropertiesViewItem *>(m_tree->topLevelItem(i));
+ if (item->property.name() == name)
+ item->setText(1, value.toString());
+ }
+}
+
+void ObjectPropertiesView::itemActivated(QTreeWidgetItem *i)
+{
+ PropertiesViewItem *item = static_cast<PropertiesViewItem *>(i);
+ if (!item->property.name().isEmpty() && item->property.hasNotifySignal())
+ emit activated(m_object, item->property);
+}
+
+QT_END_NAMESPACE
+
+#include "objectpropertiesview.moc"
diff --git a/tools/qmldebugger/objectpropertiesview.h b/tools/qmldebugger/objectpropertiesview.h
new file mode 100644
index 0000000..0f72ff4
--- /dev/null
+++ b/tools/qmldebugger/objectpropertiesview.h
@@ -0,0 +1,47 @@
+#ifndef PROPERTIESTABLEMODEL_H
+#define PROPERTIESTABLEMODEL_H
+
+#include <QtDeclarative/qmldebug.h>
+
+#include <QtGui/qwidget.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTreeWidget;
+class QTreeWidgetItem;
+
+class ObjectPropertiesView : public QWidget
+{
+ Q_OBJECT
+public:
+ ObjectPropertiesView(QmlEngineDebug *client, QWidget *parent = 0);
+
+signals:
+ void activated(const QmlDebugObjectReference &, const QmlDebugPropertyReference &);
+
+public slots:
+ void reload(const QmlDebugObjectReference &);
+ void watchCreated(QmlDebugWatch *);
+
+private slots:
+ void queryFinished();
+ void watchStateChanged();
+ void valueChanged(const QByteArray &name, const QVariant &value);
+ void itemActivated(QTreeWidgetItem *i);
+
+private:
+ void setObject(const QmlDebugObjectReference &object);
+ void setWatched(const QString &property, bool watched);
+
+ QmlEngineDebug *m_client;
+ QmlDebugObjectQuery *m_query;
+ QmlDebugWatch *m_watch;
+
+ QTreeWidget *m_tree;
+ QmlDebugObjectReference m_object;
+};
+
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/tools/qmldebugger/objecttree.cpp b/tools/qmldebugger/objecttree.cpp
new file mode 100644
index 0000000..f68e7f1
--- /dev/null
+++ b/tools/qmldebugger/objecttree.cpp
@@ -0,0 +1,168 @@
+#include <QtGui/qevent.h>
+#include <QtGui/qmenu.h>
+#include <QtGui/qaction.h>
+
+#include <QInputDialog>
+
+#include <QtDeclarative/qmldebugservice.h>
+#include <QtDeclarative/qmldebug.h>
+#include <QtDeclarative/qmldebugclient.h>
+
+#include "objecttree.h"
+
+Q_DECLARE_METATYPE(QmlDebugObjectReference)
+
+ObjectTree::ObjectTree(QmlEngineDebug *client, QWidget *parent)
+ : QTreeWidget(parent),
+ m_client(client),
+ m_query(0)
+{
+ setHeaderHidden(true);
+
+ connect(this, SIGNAL(itemClicked(QTreeWidgetItem *, int)),
+ this, SLOT(handleItemClicked(QTreeWidgetItem *)));
+}
+
+void ObjectTree::reload(int objectDebugId)
+{
+ if (m_query) {
+ delete m_query;
+ m_query = 0;
+ }
+
+ m_query = m_client->queryObjectRecursive(QmlDebugObjectReference(objectDebugId), this);
+ if (!m_query->isWaiting())
+ objectFetched();
+ else
+ QObject::connect(m_query, SIGNAL(stateChanged(State)),
+ this, SLOT(objectFetched()));
+}
+
+void ObjectTree::selectObject(int debugId)
+{
+ QTreeWidgetItem *item = findItemByObjectId(debugId);
+ if (item) {
+ setCurrentItem(item);
+ scrollToItem(item);
+ item->setExpanded(true);
+ }
+}
+
+void ObjectTree::objectFetched()
+{
+ dump(m_query->object(), 0);
+ buildTree(m_query->object(), 0);
+
+ delete m_query;
+ m_query = 0;
+}
+
+void ObjectTree::handleItemClicked(QTreeWidgetItem *item)
+{
+ QmlDebugObjectReference obj = item->data(0, Qt::UserRole).value<QmlDebugObjectReference>();
+ if (obj.debugId() < 0) {
+ qWarning("QML Object Tree: bad object id");
+ return;
+ }
+ emit objectSelected(obj);
+}
+
+void ObjectTree::buildTree(const QmlDebugObjectReference &obj, QTreeWidgetItem *parent)
+{
+ if (!parent)
+ clear();
+
+ QTreeWidgetItem *item = parent ? new QTreeWidgetItem(parent) : new QTreeWidgetItem(this);
+ item->setText(0, obj.className());
+ item->setData(0, Qt::UserRole, qVariantFromValue(obj));
+
+ if (parent && obj.contextDebugId() >= 0
+ && obj.contextDebugId() != parent->data(0, Qt::UserRole
+ ).value<QmlDebugObjectReference>().contextDebugId()) {
+ QmlDebugFileReference source = obj.source();
+ if (!source.url().isEmpty()) {
+ QString toolTipString = QLatin1String("URL: ") + source.url().toString();
+ item->setToolTip(0, toolTipString);
+ }
+ item->setForeground(0, QColor("orange"));
+ } else {
+ item->setExpanded(true);
+ }
+
+ if (obj.contextDebugId() < 0)
+ item->setForeground(0, Qt::lightGray);
+
+ for (int ii = 0; ii < obj.children().count(); ++ii)
+ buildTree(obj.children().at(ii), item);
+}
+
+void ObjectTree::dump(const QmlDebugContextReference &ctxt, int ind)
+{
+ QByteArray indent(ind * 4, ' ');
+ qWarning().nospace() << indent.constData() << ctxt.debugId() << " "
+ << qPrintable(ctxt.name());
+
+ for (int ii = 0; ii < ctxt.contexts().count(); ++ii)
+ dump(ctxt.contexts().at(ii), ind + 1);
+
+ for (int ii = 0; ii < ctxt.objects().count(); ++ii)
+ dump(ctxt.objects().at(ii), ind);
+}
+
+void ObjectTree::dump(const QmlDebugObjectReference &obj, int ind)
+{
+ QByteArray indent(ind * 4, ' ');
+ qWarning().nospace() << indent.constData() << qPrintable(obj.className())
+ << " " << qPrintable(obj.name()) << " "
+ << obj.debugId();
+
+ for (int ii = 0; ii < obj.children().count(); ++ii)
+ dump(obj.children().at(ii), ind + 1);
+}
+
+QTreeWidgetItem *ObjectTree::findItemByObjectId(int debugId) const
+{
+ for (int i=0; i<topLevelItemCount(); i++) {
+ QTreeWidgetItem *item = findItem(topLevelItem(i), debugId);
+ if (item)
+ return item;
+ }
+
+ return 0;
+}
+
+QTreeWidgetItem *ObjectTree::findItem(QTreeWidgetItem *item, int debugId) const
+{
+ if (item->data(0, Qt::UserRole).value<QmlDebugObjectReference>().debugId() == debugId)
+ return item;
+
+ QTreeWidgetItem *child;
+ for (int i=0; i<item->childCount(); i++) {
+ child = findItem(item->child(i), debugId);
+ if (child)
+ return child;
+ }
+
+ return 0;
+}
+
+void ObjectTree::mousePressEvent(QMouseEvent *me)
+{
+ QTreeWidget::mousePressEvent(me);
+ if (!currentItem())
+ return;
+ if(me->button() == Qt::RightButton && me->type() == QEvent::MouseButtonPress) {
+ QAction action(tr("Add watch..."), 0);
+ QList<QAction *> actions;
+ actions << &action;
+ QmlDebugObjectReference obj =
+ currentItem()->data(0, Qt::UserRole).value<QmlDebugObjectReference>();
+ if (QMenu::exec(actions, me->globalPos())) {
+ bool ok = false;
+ QString watch = QInputDialog::getText(this, tr("Watch expression"),
+ tr("Expression:"), QLineEdit::Normal, QString(), &ok);
+ if (ok && !watch.isEmpty())
+ emit expressionWatchRequested(obj, watch);
+ }
+ }
+}
diff --git a/tools/qmldebugger/objecttree.h b/tools/qmldebugger/objecttree.h
new file mode 100644
index 0000000..bba6c08
--- /dev/null
+++ b/tools/qmldebugger/objecttree.h
@@ -0,0 +1,51 @@
+#ifndef OBJECTTREE_H
+#define OBJECTTREE_H
+
+#include <QtGui/qtreewidget.h>
+
+QT_BEGIN_NAMESPACE
+
+class QTreeWidgetItem;
+
+class QmlEngineDebug;
+class QmlDebugObjectReference;
+class QmlDebugObjectQuery;
+class QmlDebugContextReference;
+
+
+class ObjectTree : public QTreeWidget
+{
+ Q_OBJECT
+public:
+ ObjectTree(QmlEngineDebug *client, QWidget *parent = 0);
+
+signals:
+ void objectSelected(const QmlDebugObjectReference &);
+ void expressionWatchRequested(const QmlDebugObjectReference &, const QString &);
+
+public slots:
+ void reload(int objectDebugId);
+ void selectObject(int debugId);
+
+protected:
+ virtual void mousePressEvent(QMouseEvent *);
+
+private slots:
+ void objectFetched();
+ void handleItemClicked(QTreeWidgetItem *);
+
+private:
+ QTreeWidgetItem *findItemByObjectId(int debugId) const;
+ QTreeWidgetItem *findItem(QTreeWidgetItem *item, int debugId) const;
+ void dump(const QmlDebugContextReference &, int);
+ void dump(const QmlDebugObjectReference &, int);
+ void buildTree(const QmlDebugObjectReference &, QTreeWidgetItem *parent);
+
+ QmlEngineDebug *m_client;
+ QmlDebugObjectQuery *m_query;
+};
+
+QT_END_NAMESPACE
+
+
+#endif
diff --git a/tools/qmldebugger/propertyview.cpp b/tools/qmldebugger/propertyview.cpp
deleted file mode 100644
index 44e406b..0000000
--- a/tools/qmldebugger/propertyview.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#include "propertyview.h"
-#include <QtCore/qdebug.h>
-#include <QtGui/qboxlayout.h>
-#include <QtGui/qtreewidget.h>
-
-QT_BEGIN_NAMESPACE
-
-PropertyView::PropertyView(QWidget *parent)
-: QWidget(parent), m_tree(0)
-{
- QVBoxLayout *layout = new QVBoxLayout;
- layout->setContentsMargins(0, 0, 0, 0);
- layout->setSpacing(0);
- setLayout(layout);
-
- m_tree = new QTreeWidget(this);
- m_tree->setExpandsOnDoubleClick(false);
- m_tree->setHeaderLabels(QStringList() << tr("Property") << tr("Value"));
- QObject::connect(m_tree, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
- this, SLOT(itemActivated(QTreeWidgetItem *)));
-
- m_tree->setColumnCount(2);
-
- layout->addWidget(m_tree);
-}
-
-class PropertyViewItem : public QObject, public QTreeWidgetItem
-{
- Q_OBJECT
-public:
- PropertyViewItem(QTreeWidget *widget);
- PropertyViewItem(QTreeWidgetItem *parent);
-
- QmlDebugPropertyReference property;
-};
-
-PropertyViewItem::PropertyViewItem(QTreeWidget *widget)
-: QTreeWidgetItem(widget)
-{
-}
-
-PropertyViewItem::PropertyViewItem(QTreeWidgetItem *parent)
-: QTreeWidgetItem(parent)
-{
-}
-
-
-void PropertyView::setObject(const QmlDebugObjectReference &object)
-{
- m_object = object;
- m_tree->clear();
-
- QList<QmlDebugPropertyReference> properties = object.properties();
- for (int i=0; i<properties.count(); i++) {
- const QmlDebugPropertyReference &p = properties[i];
-
- PropertyViewItem *item = new PropertyViewItem(m_tree);
- item->property = p;
-
- item->setText(0, p.name());
- item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
- if (!p.hasNotifySignal())
- item->setForeground(0, Qt::lightGray);
-
- if (!p.binding().isEmpty()) {
- PropertyViewItem *binding = new PropertyViewItem(item);
- binding->setText(1, p.binding());
- binding->setForeground(1, Qt::darkGreen);
- }
-
- item->setExpanded(true);
- }
-
- m_tree->resizeColumnToContents(0);
-}
-
-const QmlDebugObjectReference &PropertyView::object() const
-{
- return m_object;
-}
-
-void PropertyView::clear()
-{
- setObject(QmlDebugObjectReference());
-}
-
-void PropertyView::updateProperty(const QString &name, const QVariant &value)
-{
- for (int i=0; i<m_tree->topLevelItemCount(); i++) {
- PropertyViewItem *item = static_cast<PropertyViewItem *>(m_tree->topLevelItem(i));
- if (item->property.name() == name)
- item->setText(1, value.toString());
- }
-}
-
-void PropertyView::setPropertyIsWatched(const QString &name, bool watched)
-{
- for (int i=0; i<m_tree->topLevelItemCount(); i++) {
- PropertyViewItem *item = static_cast<PropertyViewItem *>(m_tree->topLevelItem(i));
- if (item->property.name() == name && item->property.hasNotifySignal()) {
- QFont font = m_tree->font();
- font.setBold(watched);
- item->setFont(0, font);
- }
- }
-}
-
-void PropertyView::itemActivated(QTreeWidgetItem *i)
-{
- PropertyViewItem *item = static_cast<PropertyViewItem *>(i);
- if (!item->property.name().isEmpty() && item->property.hasNotifySignal())
- emit propertyActivated(item->property);
-}
-
-QT_END_NAMESPACE
-
-#include "propertyview.moc"
diff --git a/tools/qmldebugger/propertyview.h b/tools/qmldebugger/propertyview.h
deleted file mode 100644
index 6b69bdf..0000000
--- a/tools/qmldebugger/propertyview.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef PROPERTYVIEW_H
-#define PROPERTYVIEW_H
-
-#include <QtGui/qwidget.h>
-#include <QtCore/qpointer.h>
-#include <QtDeclarative/qmldebug.h>
-
-QT_BEGIN_NAMESPACE
-
-class QTreeWidget;
-class QTreeWidgetItem;
-
-class PropertyView : public QWidget
-{
- Q_OBJECT
-public:
- PropertyView(QWidget *parent = 0);
-
- void setObject(const QmlDebugObjectReference &object);
- const QmlDebugObjectReference &object() const;
-
- void updateProperty(const QString &name, const QVariant &value);
- void setPropertyIsWatched(const QString &name, bool watched);
-
- void clear();
-
-signals:
- void propertyActivated(const QmlDebugPropertyReference &property);
-
-private slots:
- void itemActivated(QTreeWidgetItem *);
-
-private:
- QmlDebugObjectReference m_object;
- QTreeWidget *m_tree;
-};
-
-QT_END_NAMESPACE
-
-#endif // PROPERTYVIEW_H
diff --git a/tools/qmldebugger/qmldebugger.cpp b/tools/qmldebugger/qmldebugger.cpp
new file mode 100644
index 0000000..0f0fc03
--- /dev/null
+++ b/tools/qmldebugger/qmldebugger.cpp
@@ -0,0 +1,125 @@
+#include <QtCore/qtimer.h>
+#include <QtCore/qdebug.h>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QLineEdit>
+#include <QTabWidget>
+#include <QSpinBox>
+#include <QLabel>
+
+#include "canvasframerate.h"
+#include "engine.h"
+#include "qmldebugger.h"
+
+QmlDebugger::QmlDebugger(QWidget *parent)
+: QWidget(parent)
+{
+ QVBoxLayout *layout = new QVBoxLayout;
+ setLayout(layout);
+
+
+ QHBoxLayout *connectLayout = new QHBoxLayout;
+ layout->addLayout(connectLayout);
+ connectLayout->addStretch(2);
+
+ m_connectionState = new QLabel(this);
+ connectLayout->addWidget(m_connectionState);
+ m_host = new QLineEdit(this);
+ m_host->setText("127.0.0.1");
+ connectLayout->addWidget(m_host);
+ m_port = new QSpinBox(this);
+ m_port->setMinimum(1024);
+ m_port->setMaximum(20000);
+ m_port->setValue(3768);
+ connectLayout->addWidget(m_port);
+ m_connectButton = new QPushButton(tr("Connect"), this);
+ QObject::connect(m_connectButton, SIGNAL(clicked()),
+ this, SLOT(connectToHost()));
+ connectLayout->addWidget(m_connectButton);
+ m_disconnectButton = new QPushButton(tr("Disconnect"), this);
+ QObject::connect(m_disconnectButton, SIGNAL(clicked()),
+ this, SLOT(disconnectFromHost()));
+ m_disconnectButton->setEnabled(false);
+ connectLayout->addWidget(m_disconnectButton);
+
+ m_tabs = new QTabWidget(this);
+ layout->addWidget(m_tabs);
+
+ CanvasFrameRate *cfr = new CanvasFrameRate(&client, this);
+ m_tabs->addTab(cfr, tr("Frame Rate"));
+
+ m_enginePane = new EnginePane(&client, this);
+ m_tabs->addTab(m_enginePane, tr("QML Engine"));
+
+ QObject::connect(&client, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
+ this, SLOT(connectionStateChanged()));
+ connectionStateChanged();
+
+ QObject::connect(&client, SIGNAL(error(QAbstractSocket::SocketError)),
+ this, SLOT(connectionError(QAbstractSocket::SocketError)));
+}
+
+void QmlDebugger::setHost(const QString &host)
+{
+ m_host->setText(host);
+}
+
+void QmlDebugger::setPort(quint16 port)
+{
+ m_port->setValue(port);
+}
+
+void QmlDebugger::showEngineTab()
+{
+ m_tabs->setCurrentWidget(m_enginePane);
+}
+
+void QmlDebugger::connectionStateChanged()
+{
+ switch (client.state()) {
+ default:
+ case QAbstractSocket::UnconnectedState:
+ m_connectionState->setText(tr("Disconnected"));
+ m_connectButton->setEnabled(true);
+ m_disconnectButton->setEnabled(false);
+ break;
+ case QAbstractSocket::HostLookupState:
+ m_connectionState->setText(tr("Resolving"));
+ m_connectButton->setEnabled(false);
+ m_disconnectButton->setEnabled(true);
+ break;
+ case QAbstractSocket::ConnectingState:
+ m_connectionState->setText(tr("Connecting"));
+ m_connectButton->setEnabled(false);
+ m_disconnectButton->setEnabled(true);
+ break;
+ case QAbstractSocket::ConnectedState:
+ m_connectionState->setText(tr("Connected"));
+ m_connectButton->setEnabled(false);
+ m_disconnectButton->setEnabled(true);
+
+ QTimer::singleShot(0, m_enginePane, SLOT(refreshEngines()));
+ break;
+ case QAbstractSocket::ClosingState:
+ m_connectionState->setText(tr("Closing"));
+ m_connectButton->setEnabled(false);
+ m_disconnectButton->setEnabled(false);
+ break;
+ }
+}
+
+void QmlDebugger::connectionError(QAbstractSocket::SocketError socketError)
+{
+ qWarning() << "qmldebugger cannot connect:" << socketError
+ << client.errorString();
+}
+
+void QmlDebugger::connectToHost()
+{
+ client.connectToHost(m_host->text(), m_port->value());
+}
+
+void QmlDebugger::disconnectFromHost()
+{
+ client.disconnectFromHost();
+}
diff --git a/tools/qmldebugger/qmldebugger.h b/tools/qmldebugger/qmldebugger.h
new file mode 100644
index 0000000..9203e33
--- /dev/null
+++ b/tools/qmldebugger/qmldebugger.h
@@ -0,0 +1,47 @@
+#ifndef QMLDEBUGGER_H
+#define QMLDEBUGGER_H
+
+#include <QtDeclarative/qmldebugclient.h>
+#include <QtNetwork/qtcpsocket.h>
+#include <QtGui/qwidget.h>
+
+class QLabel;
+class QLineEdit;
+class QSpinBox;
+class QPushButton;
+class QTabWidget;
+
+class EnginePane;
+
+class QmlDebugger : public QWidget
+{
+ Q_OBJECT
+public:
+ QmlDebugger(QWidget * = 0);
+
+ void setHost(const QString &host);
+ void setPort(quint16 port);
+ void showEngineTab();
+
+public slots:
+ void connectToHost();
+ void disconnectFromHost();
+
+private slots:
+ void connectionStateChanged();
+ void connectionError(QAbstractSocket::SocketError socketError);
+
+private:
+ QmlDebugConnection client;
+
+ QLabel *m_connectionState;
+ QLineEdit *m_host;
+ QSpinBox *m_port;
+ QPushButton *m_connectButton;
+ QPushButton *m_disconnectButton;
+
+ EnginePane *m_enginePane;
+ QTabWidget *m_tabs;
+};
+
+#endif
diff --git a/tools/qmldebugger/qmldebugger.pri b/tools/qmldebugger/qmldebugger.pri
new file mode 100644
index 0000000..ce36381
--- /dev/null
+++ b/tools/qmldebugger/qmldebugger.pri
@@ -0,0 +1,22 @@
+QT += network declarative
+contains(QT_CONFIG, opengles2)|contains(QT_CONFIG, opengles1): QT += opengl
+
+# Input
+HEADERS += $$PWD/qmldebugger.h \
+ $$PWD/canvasframerate.h \
+ $$PWD/watchtable.h \
+ $$PWD/engine.h \
+ $$PWD/objecttree.h \
+ $$PWD/objectpropertiesview.h
+
+SOURCES += $$PWD/qmldebugger.cpp \
+ $$PWD/main.cpp \
+ $$PWD/canvasframerate.cpp \
+ $$PWD/watchtable.cpp \
+ $$PWD/engine.cpp \
+ $$PWD/objecttree.cpp \
+ $$PWD/objectpropertiesview.cpp
+
+RESOURCES += $$PWD/qmldebugger.qrc
+
+OTHER_FILES += $$PWD/engines.qml
diff --git a/tools/qmldebugger/qmldebugger.pro b/tools/qmldebugger/qmldebugger.pro
index b177875..4cdfd18 100644
--- a/tools/qmldebugger/qmldebugger.pro
+++ b/tools/qmldebugger/qmldebugger.pro
@@ -1,20 +1,6 @@
DESTDIR = ../../bin
-QT += network declarative
-contains(QT_CONFIG, opengles2)|contains(QT_CONFIG, opengles1): QT += opengl
-# Input
-HEADERS += canvasframerate.h \
- watchtablemodel.h \
- propertyview.h \
- engine.h
-SOURCES += main.cpp \
- canvasframerate.cpp \
- watchtablemodel.cpp \
- propertyview.cpp \
- engine.cpp
-RESOURCES += qmldebugger.qrc
-
-OTHER_FILES += engines.qml
+include(qmldebugger.pri)
target.path=$$[QT_INSTALL_BINS]
INSTALLS += target
diff --git a/tools/qmldebugger/watchtablemodel.cpp b/tools/qmldebugger/watchtable.cpp
index 9d3ca1e..e4163dc 100644
--- a/tools/qmldebugger/watchtablemodel.cpp
+++ b/tools/qmldebugger/watchtable.cpp
@@ -1,25 +1,38 @@
-#include "watchtablemodel.h"
+#include "watchtable.h"
#include <QtCore/qdebug.h>
+#include <QtGui/qevent.h>
+#include <QtGui/qaction.h>
+#include <QtGui/qmenu.h>
+
#include <QtDeclarative/qmldebug.h>
#include <QtDeclarative/qmlmetatype.h>
QT_BEGIN_NAMESPACE
-WatchTableModel::WatchTableModel(QObject *parent)
- : QAbstractTableModel(parent)
+WatchTableModel::WatchTableModel(QmlEngineDebug *client, QObject *parent)
+ : QAbstractTableModel(parent),
+ m_client(client)
{
}
+WatchTableModel::~WatchTableModel()
+{
+ for (int i=0; i<m_columns.count(); i++)
+ delete m_columns[i].watch;
+}
+
void WatchTableModel::addWatch(QmlDebugWatch *watch, const QString &title)
{
QString property;
if (qobject_cast<QmlDebugPropertyWatch *>(watch))
property = qobject_cast<QmlDebugPropertyWatch *>(watch)->name();
- // Watch will be automatically removed when its state is Inactive
- QObject::connect(watch, SIGNAL(stateChanged(State)), SLOT(watchStateChanged()));
+ connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)),
+ SLOT(watchedValueChanged(QByteArray,QVariant)));
+
+ connect(watch, SIGNAL(stateChanged(State)), SLOT(watchStateChanged()));
int col = columnCount(QModelIndex());
beginInsertColumns(QModelIndex(), col, col);
@@ -87,14 +100,6 @@ QmlDebugWatch *WatchTableModel::findWatch(int objectDebugId, const QString &prop
return 0;
}
-QList<QmlDebugWatch *> WatchTableModel::watches() const
-{
- QList<QmlDebugWatch *> watches;
- for (int i=0; i<m_columns.count(); i++)
- watches << m_columns[i].watch;
- return watches;
-}
-
int WatchTableModel::rowCount(const QModelIndex &) const
{
return m_values.count();
@@ -156,8 +161,11 @@ QVariant WatchTableModel::data(const QModelIndex &idx, int role) const
void WatchTableModel::watchStateChanged()
{
QmlDebugWatch *watch = qobject_cast<QmlDebugWatch*>(sender());
- if (watch && watch->state() == QmlDebugWatch::Inactive)
+
+ if (watch && watch->state() == QmlDebugWatch::Inactive) {
removeWatch(watch);
+ watch->deleteLater();
+ }
}
int WatchTableModel::columnForWatch(QmlDebugWatch *watch) const
@@ -183,4 +191,109 @@ void WatchTableModel::addValue(int column, const QVariant &value)
endInsertRows();
}
+void WatchTableModel::togglePropertyWatch(const QmlDebugObjectReference &object, const QmlDebugPropertyReference &property)
+{
+ QmlDebugWatch *watch = findWatch(object.debugId(), property.name());
+ if (watch) {
+ // watch will be deleted in watchStateChanged()
+ m_client->removeWatch(watch);
+ return;
+ }
+
+ watch = m_client->addWatch(property, this);
+ if (watch->state() == QmlDebugWatch::Dead) {
+ delete watch;
+ watch = 0;
+ } else {
+ QString desc = property.name()
+ + QLatin1String(" on\n")
+ + object.className()
+ + QLatin1String(": ")
+ + (object.name().isEmpty() ? QLatin1String("<unnamed>") : object.name());
+ addWatch(watch, desc);
+ emit watchCreated(watch);
+ }
+}
+
+void WatchTableModel::watchedValueChanged(const QByteArray &propertyName, const QVariant &value)
+{
+ Q_UNUSED(propertyName);
+ QmlDebugWatch *watch = qobject_cast<QmlDebugWatch*>(sender());
+ if (watch)
+ updateWatch(watch, value);
+}
+
+void WatchTableModel::expressionWatchRequested(const QmlDebugObjectReference &obj, const QString &expr)
+{
+ QmlDebugWatch *watch = m_client->addWatch(obj, expr, this);
+
+ if (watch->state() == QmlDebugWatch::Dead) {
+ delete watch;
+ watch = 0;
+ } else {
+ addWatch(watch, expr);
+ emit watchCreated(watch);
+ }
+}
+
+void WatchTableModel::stopWatching(int column)
+{
+ QmlDebugWatch *watch = findWatch(column);
+ if (watch) {
+ m_client->removeWatch(watch);
+ delete watch;
+ watch = 0;
+ }
+}
+
+
+//----------------------------------------------
+
+WatchTableHeaderView::WatchTableHeaderView(WatchTableModel *model, QWidget *parent)
+ : QHeaderView(Qt::Horizontal, parent),
+ m_model(model)
+{
+ setClickable(true);
+}
+
+void WatchTableHeaderView::mousePressEvent(QMouseEvent *me)
+{
+ QHeaderView::mousePressEvent(me);
+
+ if (me->button() == Qt::RightButton && me->type() == QEvent::MouseButtonPress) {
+ int col = logicalIndexAt(me->pos());
+ if (col >= 0) {
+ QAction action(tr("Stop watching"), 0);
+ QList<QAction *> actions;
+ actions << &action;
+ if (QMenu::exec(actions, me->globalPos()))
+ m_model->stopWatching(col);
+ }
+ }
+}
+
+
+//----------------------------------------------
+
+WatchTableView::WatchTableView(WatchTableModel *model, QWidget *parent)
+ : QTableView(parent),
+ m_model(model)
+{
+ connect(model, SIGNAL(watchCreated(QmlDebugWatch*)), SLOT(watchCreated(QmlDebugWatch*)));
+ connect(this, SIGNAL(activated(QModelIndex)), SLOT(indexActivated(QModelIndex)));
+}
+
+void WatchTableView::indexActivated(const QModelIndex &index)
+{
+ QmlDebugWatch *watch = m_model->findWatch(index.column());
+ if (watch)
+ emit objectActivated(watch->objectDebugId());
+}
+
+void WatchTableView::watchCreated(QmlDebugWatch *watch)
+{
+ int column = m_model->columnForWatch(watch);
+ resizeColumnToContents(column);
+}
+
QT_END_NAMESPACE
diff --git a/tools/qmldebugger/watchtablemodel.h b/tools/qmldebugger/watchtable.h
index 306b9d8..abada2b 100644
--- a/tools/qmldebugger/watchtablemodel.h
+++ b/tools/qmldebugger/watchtable.h
@@ -1,41 +1,57 @@
#ifndef WATCHTABLEMODEL_H
#define WATCHTABLEMODEL_H
-#include <QWidget>
#include <QtCore/qpointer.h>
#include <QtCore/qlist.h>
+
+#include <QWidget>
+#include <QHeaderView>
#include <QAbstractTableModel>
+#include <QTableView>
QT_BEGIN_NAMESPACE
class QmlDebugWatch;
+class QmlEngineDebug;
+class QmlDebugPropertyReference;
+class QmlDebugObjectReference;
class WatchTableModel : public QAbstractTableModel
{
Q_OBJECT
public:
- WatchTableModel(QObject *parent = 0);
-
- void addWatch(QmlDebugWatch *watch, const QString &title);
- void updateWatch(QmlDebugWatch *watch, const QVariant &value);
+ WatchTableModel(QmlEngineDebug *client, QObject *parent = 0);
+ ~WatchTableModel();
QmlDebugWatch *findWatch(int column) const;
- QmlDebugWatch *findWatch(int objectDebugId, const QString &property) const;
+ int columnForWatch(QmlDebugWatch *watch) const;
- QList<QmlDebugWatch *> watches() const;
+ void stopWatching(int column);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+signals:
+ void watchCreated(QmlDebugWatch *watch);
+
+public slots:
+ void togglePropertyWatch(const QmlDebugObjectReference &obj, const QmlDebugPropertyReference &prop);
+ void expressionWatchRequested(const QmlDebugObjectReference &, const QString &);
+
private slots:
void watchStateChanged();
+ void watchedValueChanged(const QByteArray &propertyName, const QVariant &value);
private:
- int columnForWatch(QmlDebugWatch *watch) const;
- void addValue(int column, const QVariant &value);
+ void addWatch(QmlDebugWatch *watch, const QString &title);
void removeWatch(QmlDebugWatch *watch);
+ void updateWatch(QmlDebugWatch *watch, const QVariant &value);
+
+ QmlDebugWatch *findWatch(int objectDebugId, const QString &property) const;
+
+ void addValue(int column, const QVariant &value);
struct WatchedEntity
{
@@ -51,11 +67,44 @@ private:
bool first;
};
+ QmlEngineDebug *m_client;
QList<WatchedEntity> m_columns;
QList<Value> m_values;
};
+class WatchTableHeaderView : public QHeaderView
+{
+ Q_OBJECT
+public:
+ WatchTableHeaderView(WatchTableModel *model, QWidget *parent = 0);
+
+protected:
+ void mousePressEvent(QMouseEvent *me);
+
+private:
+ WatchTableModel *m_model;
+};
+
+
+class WatchTableView : public QTableView
+{
+ Q_OBJECT
+public:
+ WatchTableView(WatchTableModel *model, QWidget *parent = 0);
+
+signals:
+ void objectActivated(int objectDebugId);
+
+private slots:
+ void indexActivated(const QModelIndex &index);
+ void watchCreated(QmlDebugWatch *watch);
+
+private:
+ WatchTableModel *m_model;
+};
+
+
QT_END_NAMESPACE
#endif // WATCHTABLEMODEL_H