From f303d6e3a44de30b9b1dc869c9a54c60cb383f8a Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Wed, 14 Oct 2009 14:31:18 +1000 Subject: Split the various debugger widgets out into their own files. The debugger interface remains unchanged. --- tools/qmldebugger/engine.cpp | 401 +++-------------------------- tools/qmldebugger/engine.h | 43 +--- tools/qmldebugger/main.cpp | 175 ++----------- tools/qmldebugger/objectpropertiesview.cpp | 166 ++++++++++++ tools/qmldebugger/objectpropertiesview.h | 47 ++++ tools/qmldebugger/objecttree.cpp | 168 ++++++++++++ tools/qmldebugger/objecttree.h | 55 ++++ tools/qmldebugger/propertyview.cpp | 117 --------- tools/qmldebugger/propertyview.h | 40 --- tools/qmldebugger/qmldebugger.cpp | 125 +++++++++ tools/qmldebugger/qmldebugger.h | 47 ++++ tools/qmldebugger/qmldebugger.pri | 22 ++ tools/qmldebugger/qmldebugger.pro | 16 +- tools/qmldebugger/watchtable.cpp | 299 +++++++++++++++++++++ tools/qmldebugger/watchtable.h | 110 ++++++++ tools/qmldebugger/watchtablemodel.cpp | 186 ------------- tools/qmldebugger/watchtablemodel.h | 61 ----- 17 files changed, 1103 insertions(+), 975 deletions(-) create mode 100644 tools/qmldebugger/objectpropertiesview.cpp create mode 100644 tools/qmldebugger/objectpropertiesview.h create mode 100644 tools/qmldebugger/objecttree.cpp create mode 100644 tools/qmldebugger/objecttree.h delete mode 100644 tools/qmldebugger/propertyview.cpp delete mode 100644 tools/qmldebugger/propertyview.h create mode 100644 tools/qmldebugger/qmldebugger.cpp create mode 100644 tools/qmldebugger/qmldebugger.h create mode 100644 tools/qmldebugger/qmldebugger.pri create mode 100644 tools/qmldebugger/watchtable.cpp create mode 100644 tools/qmldebugger/watchtable.h delete mode 100644 tools/qmldebugger/watchtablemodel.cpp delete mode 100644 tools/qmldebugger/watchtablemodel.h 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 -#include #include #include -#include -#include -#include #include #include -#include -#include -#include -#include #include -#include -#include + #include +#include #include #include #include -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; idata(0, Qt::UserRole).toInt() == debugId) - return item; - - QTreeWidgetItem *child; - for (int i=0; ichildCount(); 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 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 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(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(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("") : object.name()); - m_watchTableModel->addWatch(watch, desc); - m_watchTable->resizeColumnsToContents(); - } - } -} - -void EnginePane::propertyWatchStateChanged() -{ - QmlDebugPropertyWatch *watch = qobject_cast(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 watches = m_watchTableModel->watches(); - for (int i=0; iqueryAvailableEngines(this); if (!m_engines->isWaiting()) enginesChanged(); else @@ -462,28 +161,6 @@ void EnginePane::enginesChanged() engineSelected(qobject_cast(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 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 #include -#include -#include -#include -#include -#include -#include -#include -#include -#include "canvasframerate.h" -#include "engine.h" -#include -#include -#include -#include -#include -#include -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 +#include + +#include +#include +#include + +#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) +{ + 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_watch) { + m_client->removeWatch(m_watch); + delete m_watch; + m_watch = 0; + } + + QmlDebugObjectReference obj = m_query->object(); + + QmlDebugWatch *watch = m_client->addWatch(obj, this); + if (watch->state() != QmlDebugWatch::Dead) { + 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 properties = object.properties(); + for (int i=0; iproperty = 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(watch)) { + connect(watch, SIGNAL(stateChanged(State)), SLOT(watchStateChanged())); + setWatched(qobject_cast(watch)->name(), true); + } +} + +void ObjectPropertiesView::watchStateChanged() +{ + QmlDebugWatch *watch = qobject_cast(sender()); + + if (watch->objectDebugId() == m_object.debugId() + && qobject_cast(watch) + && watch->state() == QmlDebugWatch::Inactive) { + setWatched(qobject_cast(watch)->name(), false); + } +} + +void ObjectPropertiesView::setWatched(const QString &property, bool watched) +{ + for (int i=0; itopLevelItemCount(); i++) { + PropertiesViewItem *item = static_cast(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; itopLevelItemCount(); i++) { + PropertiesViewItem *item = static_cast(m_tree->topLevelItem(i)); + if (item->property.name() == name) + item->setText(1, value.toString()); + } +} + +void ObjectPropertiesView::itemActivated(QTreeWidgetItem *i) +{ + PropertiesViewItem *item = static_cast(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 + +#include + +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..f398987 --- /dev/null +++ b/tools/qmldebugger/objecttree.cpp @@ -0,0 +1,168 @@ +#include +#include +#include + +#include + +#include +#include +#include + +#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(); + 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)); + item->setData(0, ObjectTree::ContextIdRole, obj.contextDebugId()); + + if (parent && obj.contextDebugId() >= 0 + && obj.contextDebugId() != parent->data(0, ObjectTree::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 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; idata(0, Qt::UserRole).value().debugId() == debugId) + return item; + + QTreeWidgetItem *child; + for (int i=0; ichildCount(); 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 actions; + actions << &action; + QmlDebugObjectReference obj = + currentItem()->data(0, Qt::UserRole).value(); + 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..a924ec5 --- /dev/null +++ b/tools/qmldebugger/objecttree.h @@ -0,0 +1,55 @@ +#ifndef OBJECTTREE_H +#define OBJECTTREE_H + +#include + +QT_BEGIN_NAMESPACE + +class QTreeWidgetItem; + +class QmlEngineDebug; +class QmlDebugObjectReference; +class QmlDebugObjectQuery; +class QmlDebugContextReference; + + +class ObjectTree : public QTreeWidget +{ + Q_OBJECT +public: + enum AdditionalRoles { + ContextIdRole = Qt::UserRole + 1 + }; + + 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 -#include -#include - -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 properties = object.properties(); - for (int i=0; iproperty = 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; itopLevelItemCount(); i++) { - PropertyViewItem *item = static_cast(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; itopLevelItemCount(); i++) { - PropertyViewItem *item = static_cast(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(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 -#include -#include - -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 +#include +#include +#include +#include +#include +#include +#include + +#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 +#include +#include + +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/watchtable.cpp b/tools/qmldebugger/watchtable.cpp new file mode 100644 index 0000000..e4163dc --- /dev/null +++ b/tools/qmldebugger/watchtable.cpp @@ -0,0 +1,299 @@ +#include "watchtable.h" + +#include +#include +#include +#include + +#include +#include + +QT_BEGIN_NAMESPACE + + +WatchTableModel::WatchTableModel(QmlEngineDebug *client, QObject *parent) + : QAbstractTableModel(parent), + m_client(client) +{ +} + +WatchTableModel::~WatchTableModel() +{ + for (int i=0; i(watch)) + property = qobject_cast(watch)->name(); + + 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); + + WatchedEntity e; + e.title = title; + e.hasFirstValue = false; + e.property = property; + e.watch = watch; + m_columns.append(e); + + endInsertColumns(); +} + +void WatchTableModel::removeWatch(QmlDebugWatch *watch) +{ + int column = columnForWatch(watch); + if (column == -1) + return; + + WatchedEntity entity = m_columns.takeAt(column); + + for (QList::Iterator iter = m_values.begin(); iter != m_values.end();) { + if (iter->column == column) { + iter = m_values.erase(iter); + } else { + if(iter->column > column) + --iter->column; + ++iter; + } + } + + reset(); +} + +void WatchTableModel::updateWatch(QmlDebugWatch *watch, const QVariant &value) +{ + int column = columnForWatch(watch); + if (column == -1) + return; + + addValue(column, value); + + if (!m_columns[column].hasFirstValue) { + m_columns[column].hasFirstValue = true; + m_values[m_values.count() - 1].first = true; + } +} + +QmlDebugWatch *WatchTableModel::findWatch(int column) const +{ + if (column < m_columns.count()) + return m_columns.at(column).watch; + return 0; +} + +QmlDebugWatch *WatchTableModel::findWatch(int objectDebugId, const QString &property) const +{ + for (int i=0; iobjectDebugId() == objectDebugId + && m_columns[i].property == property) { + return m_columns[i].watch; + } + } + return 0; +} + +int WatchTableModel::rowCount(const QModelIndex &) const +{ + return m_values.count(); +} + +int WatchTableModel::columnCount(const QModelIndex &) const +{ + return m_columns.count(); +} + +QVariant WatchTableModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal) { + if (section < m_columns.count() && role == Qt::DisplayRole) + return m_columns.at(section).title; + } else { + if (role == Qt::DisplayRole) + return section + 1; + } + return QVariant(); +} + +QVariant WatchTableModel::data(const QModelIndex &idx, int role) const +{ + if (m_values.at(idx.row()).column == idx.column()) { + if (role == Qt::DisplayRole) { + const QVariant &value = m_values.at(idx.row()).variant; + QString str = value.toString(); + + if (str.isEmpty() && QmlMetaType::isObject(value.userType())) { + QObject *o = QmlMetaType::toQObject(value); + if(o) { + QString objectName = o->objectName(); + if(objectName.isEmpty()) + objectName = QLatin1String(""); + str = QLatin1String(o->metaObject()->className()) + + QLatin1String(": ") + objectName; + } + } + + if(str.isEmpty()) { + QDebug d(&str); + d << value; + } + return QVariant(str); + } else if(role == Qt::BackgroundRole) { + if(m_values.at(idx.row()).first) + return QColor(Qt::green); + else + return QVariant(); + } else { + return QVariant(); + } + } else { + return QVariant(); + } +} + +void WatchTableModel::watchStateChanged() +{ + QmlDebugWatch *watch = qobject_cast(sender()); + + if (watch && watch->state() == QmlDebugWatch::Inactive) { + removeWatch(watch); + watch->deleteLater(); + } +} + +int WatchTableModel::columnForWatch(QmlDebugWatch *watch) const +{ + for (int i=0; iremoveWatch(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("") : object.name()); + addWatch(watch, desc); + emit watchCreated(watch); + } +} + +void WatchTableModel::watchedValueChanged(const QByteArray &propertyName, const QVariant &value) +{ + Q_UNUSED(propertyName); + QmlDebugWatch *watch = qobject_cast(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 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/watchtable.h b/tools/qmldebugger/watchtable.h new file mode 100644 index 0000000..abada2b --- /dev/null +++ b/tools/qmldebugger/watchtable.h @@ -0,0 +1,110 @@ +#ifndef WATCHTABLEMODEL_H +#define WATCHTABLEMODEL_H + +#include +#include + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QmlDebugWatch; +class QmlEngineDebug; +class QmlDebugPropertyReference; +class QmlDebugObjectReference; + +class WatchTableModel : public QAbstractTableModel +{ + Q_OBJECT +public: + WatchTableModel(QmlEngineDebug *client, QObject *parent = 0); + ~WatchTableModel(); + + QmlDebugWatch *findWatch(int column) const; + int columnForWatch(QmlDebugWatch *watch) 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: + 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 + { + QString title; + bool hasFirstValue; + QString property; + QPointer watch; + }; + + struct Value { + int column; + QVariant variant; + bool first; + }; + + QmlEngineDebug *m_client; + QList m_columns; + QList 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 diff --git a/tools/qmldebugger/watchtablemodel.cpp b/tools/qmldebugger/watchtablemodel.cpp deleted file mode 100644 index 9d3ca1e..0000000 --- a/tools/qmldebugger/watchtablemodel.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include "watchtablemodel.h" - -#include -#include -#include - -QT_BEGIN_NAMESPACE - - -WatchTableModel::WatchTableModel(QObject *parent) - : QAbstractTableModel(parent) -{ -} - -void WatchTableModel::addWatch(QmlDebugWatch *watch, const QString &title) -{ - QString property; - if (qobject_cast(watch)) - property = qobject_cast(watch)->name(); - - // Watch will be automatically removed when its state is Inactive - QObject::connect(watch, SIGNAL(stateChanged(State)), SLOT(watchStateChanged())); - - int col = columnCount(QModelIndex()); - beginInsertColumns(QModelIndex(), col, col); - - WatchedEntity e; - e.title = title; - e.hasFirstValue = false; - e.property = property; - e.watch = watch; - m_columns.append(e); - - endInsertColumns(); -} - -void WatchTableModel::removeWatch(QmlDebugWatch *watch) -{ - int column = columnForWatch(watch); - if (column == -1) - return; - - WatchedEntity entity = m_columns.takeAt(column); - - for (QList::Iterator iter = m_values.begin(); iter != m_values.end();) { - if (iter->column == column) { - iter = m_values.erase(iter); - } else { - if(iter->column > column) - --iter->column; - ++iter; - } - } - - reset(); -} - -void WatchTableModel::updateWatch(QmlDebugWatch *watch, const QVariant &value) -{ - int column = columnForWatch(watch); - if (column == -1) - return; - - addValue(column, value); - - if (!m_columns[column].hasFirstValue) { - m_columns[column].hasFirstValue = true; - m_values[m_values.count() - 1].first = true; - } -} - -QmlDebugWatch *WatchTableModel::findWatch(int column) const -{ - if (column < m_columns.count()) - return m_columns.at(column).watch; - return 0; -} - -QmlDebugWatch *WatchTableModel::findWatch(int objectDebugId, const QString &property) const -{ - for (int i=0; iobjectDebugId() == objectDebugId - && m_columns[i].property == property) { - return m_columns[i].watch; - } - } - return 0; -} - -QList WatchTableModel::watches() const -{ - QList watches; - for (int i=0; iobjectName(); - if(objectName.isEmpty()) - objectName = QLatin1String(""); - str = QLatin1String(o->metaObject()->className()) + - QLatin1String(": ") + objectName; - } - } - - if(str.isEmpty()) { - QDebug d(&str); - d << value; - } - return QVariant(str); - } else if(role == Qt::BackgroundRole) { - if(m_values.at(idx.row()).first) - return QColor(Qt::green); - else - return QVariant(); - } else { - return QVariant(); - } - } else { - return QVariant(); - } -} - -void WatchTableModel::watchStateChanged() -{ - QmlDebugWatch *watch = qobject_cast(sender()); - if (watch && watch->state() == QmlDebugWatch::Inactive) - removeWatch(watch); -} - -int WatchTableModel::columnForWatch(QmlDebugWatch *watch) const -{ - for (int i=0; i -#include -#include -#include - -QT_BEGIN_NAMESPACE - -class QmlDebugWatch; - -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); - - QmlDebugWatch *findWatch(int column) const; - QmlDebugWatch *findWatch(int objectDebugId, const QString &property) const; - - QList watches() const; - - 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; - -private slots: - void watchStateChanged(); - -private: - int columnForWatch(QmlDebugWatch *watch) const; - void addValue(int column, const QVariant &value); - void removeWatch(QmlDebugWatch *watch); - - struct WatchedEntity - { - QString title; - bool hasFirstValue; - QString property; - QPointer watch; - }; - - struct Value { - int column; - QVariant variant; - bool first; - }; - - QList m_columns; - QList m_values; -}; - - -QT_END_NAMESPACE - -#endif // WATCHTABLEMODEL_H -- cgit v0.12 From fd9312e358a9ee24f8a83a6d4c78c7816ab3c95c Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 14:37:04 +1000 Subject: Add toArrayIndex method --- src/script/bridge/qscriptdeclarativeclass.cpp | 7 +++++++ src/script/bridge/qscriptdeclarativeclass_p.h | 1 + 2 files changed, 8 insertions(+) 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); -- cgit v0.12 From 339c91215f0bae4af44fe3124f41244541607a2b Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 14:49:45 +1000 Subject: Add QML_REWRITE_DUMP env flag --- src/declarative/qml/qmlrewrite.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/declarative/qml/qmlrewrite.cpp b/src/declarative/qml/qmlrewrite.cpp index 5166c96..a41b571 100644 --- a/src/declarative/qml/qmlrewrite.cpp +++ b/src/declarative/qml/qmlrewrite.cpp @@ -40,9 +40,13 @@ ****************************************************************************/ #include "qmlrewrite_p.h" +#include +#include 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; } -- cgit v0.12 From 176698a91d3b2256a093785967c6706328981af4 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Wed, 14 Oct 2009 15:05:18 +1000 Subject: Force QML files to be always UTF-8. Ensure test works in all locales. --- src/declarative/qml/qmlerror.cpp | 1 + src/declarative/qml/qmlscriptparser.cpp | 1 + tests/auto/declarative/declarative.pro | 3 --- .../declarative/qmllanguage/data/I18nType30.qml | 5 ++++ ...8n\303\201\303\242\303\243\303\244\303\245.qml" | 5 ---- .../auto/declarative/qmllanguage/data/i18nType.qml | 2 +- .../declarative/qmllanguage/tst_qmllanguage.cpp | 30 ++++++++++++++++++---- 7 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 tests/auto/declarative/qmllanguage/data/I18nType30.qml delete mode 100644 "tests/auto/declarative/qmllanguage/data/I18n\303\201\303\242\303\243\303\244\303\245.qml" 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/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/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/qmllanguage/data/I18nType30.qml b/tests/auto/declarative/qmllanguage/data/I18nType30.qml new file mode 100644 index 0000000..42dbc69 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/I18nType30.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + stringProperty: "Test áâãäå: 30" +} diff --git "a/tests/auto/declarative/qmllanguage/data/I18n\303\201\303\242\303\243\303\244\303\245.qml" "b/tests/auto/declarative/qmllanguage/data/I18n\303\201\303\242\303\243\303\244\303\245.qml" deleted file mode 100644 index 42dbc69..0000000 --- "a/tests/auto/declarative/qmllanguage/data/I18n\303\201\303\242\303\243\303\244\303\245.qml" +++ /dev/null @@ -1,5 +0,0 @@ -import Test 1.0 - -MyTypeObject { - stringProperty: "Test áâãäå: 30" -} 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..b68d9bf 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\241\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\241\303\242\303\243\303\244\303\245.qml")).toLocalFile())); +} + void tst_qmllanguage::errors_data() { QTest::addColumn("file"); @@ -686,11 +706,11 @@ void tst_qmllanguage::i18n_data() { QTest::addColumn("file"); QTest::addColumn("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"); } void tst_qmllanguage::i18n() -- cgit v0.12 From dae01cbfd5e46e93c322e28e6925b89d3b4c7684 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Wed, 14 Oct 2009 15:08:45 +1000 Subject: Specify encoding. --- doc/src/declarative/qmlformat.qdoc | 4 ++++ 1 file changed, 4 insertions(+) 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. -- cgit v0.12 From 4922be635aeaf25343892a73b30ec0d99d467e37 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 15:12:55 +1000 Subject: Support read-only iteration of list properties Eventually this should be extended to support modifying list properties. --- src/declarative/qml/qml.pri | 6 +- src/declarative/qml/qmlengine.cpp | 4 + src/declarative/qml/qmlengine_p.h | 2 + src/declarative/qml/qmllistscriptclass.cpp | 141 +++++++++++++++++++++ src/declarative/qml/qmllistscriptclass_p.h | 85 +++++++++++++ src/declarative/qml/qmlobjectscriptclass.cpp | 12 +- .../qmlecmascript/data/listProperties.qml | 44 +++++++ tests/auto/declarative/qmlecmascript/testtypes.h | 13 +- .../qmlecmascript/tst_qmlecmascript.cpp | 20 +++ 9 files changed, 320 insertions(+), 7 deletions(-) create mode 100644 src/declarative/qml/qmllistscriptclass.cpp create mode 100644 src/declarative/qml/qmllistscriptclass_p.h create mode 100644 tests/auto/declarative/qmlecmascript/data/listProperties.qml 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 7e95428..4dbc336 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -86,6 +86,7 @@ #include #include #include +#include #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()){ 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/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 + +QT_BEGIN_NAMESPACE + +struct ListData : public QScriptDeclarativeClass::Object { + QGuard 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 &qlist = *((QList*)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 &qmllist = *((QmlList*)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 + +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/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 #include #include +#include #include #include @@ -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/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 #include #include +#include #include 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 *objectQmlListProperty READ objectQmlListProperty CONSTANT) + Q_PROPERTY(QList *objectListProperty READ objectListProperty CONSTANT) + public: MyQmlObject(): m_methodCalled(false), m_methodIntCalled(false), m_object(0) {} @@ -54,6 +58,9 @@ public: emit objectChanged(); } + QmlList *objectQmlListProperty() { return &m_objectQmlList; } + QList *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 m_objectQmlList; + QList 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(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" -- cgit v0.12 From c84227fbd5e068859f8de15e4c522b076885b9dc Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 15:15:10 +1000 Subject: Add list accessors for Item::children and Item::resources --- src/declarative/fx/qfxitem.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) 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 children = q->childItems(); + if (idx < children.count()) + return qobject_cast(children.at(idx)); + else + return 0; } void QFxItemPrivate::children_clear() -- cgit v0.12 From ce33aa1fd8973cf066d0e5b8fc88971404d6b037 Mon Sep 17 00:00:00 2001 From: Bea Lam Date: Wed, 14 Oct 2009 15:46:37 +1000 Subject: Fix memory leak and remove redundant ContextIdRole. --- tools/qmldebugger/objectpropertiesview.cpp | 22 ++++++++++++++++------ tools/qmldebugger/objecttree.cpp | 4 ++-- tools/qmldebugger/objecttree.h | 4 ---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/tools/qmldebugger/objectpropertiesview.cpp b/tools/qmldebugger/objectpropertiesview.cpp index 2237fbb..f725194 100644 --- a/tools/qmldebugger/objectpropertiesview.cpp +++ b/tools/qmldebugger/objectpropertiesview.cpp @@ -1,3 +1,5 @@ +#include + #include #include @@ -53,6 +55,9 @@ ObjectPropertiesView::ObjectPropertiesView(QmlEngineDebug *client, QWidget *pare void ObjectPropertiesView::reload(const QmlDebugObjectReference &obj) { + if (m_query) + delete m_query; + m_query = m_client->queryObjectRecursive(obj, this); if (!m_query->isWaiting()) queryFinished(); @@ -63,16 +68,20 @@ void ObjectPropertiesView::reload(const QmlDebugObjectReference &obj) void ObjectPropertiesView::queryFinished() { - if (m_watch) { - m_client->removeWatch(m_watch); - delete m_watch; - m_watch = 0; - } + if (!m_query) + return; QmlDebugObjectReference obj = m_query->object(); QmlDebugWatch *watch = m_client->addWatch(obj, this); - if (watch->state() != QmlDebugWatch::Dead) { + 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))); @@ -89,6 +98,7 @@ void ObjectPropertiesView::setObject(const QmlDebugObjectReference &object) m_object = object; m_tree->clear(); + QList properties = object.properties(); for (int i=0; isetText(0, obj.className()); item->setData(0, Qt::UserRole, qVariantFromValue(obj)); - item->setData(0, ObjectTree::ContextIdRole, obj.contextDebugId()); if (parent && obj.contextDebugId() >= 0 - && obj.contextDebugId() != parent->data(0, ObjectTree::ContextIdRole).toInt()) { + && obj.contextDebugId() != parent->data(0, Qt::UserRole + ).value().contextDebugId()) { QmlDebugFileReference source = obj.source(); if (!source.url().isEmpty()) { QString toolTipString = QLatin1String("URL: ") + source.url().toString(); diff --git a/tools/qmldebugger/objecttree.h b/tools/qmldebugger/objecttree.h index a924ec5..bba6c08 100644 --- a/tools/qmldebugger/objecttree.h +++ b/tools/qmldebugger/objecttree.h @@ -17,10 +17,6 @@ class ObjectTree : public QTreeWidget { Q_OBJECT public: - enum AdditionalRoles { - ContextIdRole = Qt::UserRole + 1 - }; - ObjectTree(QmlEngineDebug *client, QWidget *parent = 0); signals: -- cgit v0.12 From 11ad93f85fb888cfdfb8a534dcde7f536f13e1a2 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Wed, 14 Oct 2009 15:42:58 +1000 Subject: Preserve visual appearance in more cases for ParentChange. Task-number: QT-747 --- src/declarative/util/qmlstateoperations.cpp | 77 ++++++++++++----------------- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/src/declarative/util/qmlstateoperations.cpp b/src/declarative/util/qmlstateoperations.cpp index 716cec4..07eb641 100644 --- a/src/declarative/util/qmlstateoperations.cpp +++ b/src/declarative/util/qmlstateoperations.cpp @@ -48,11 +48,14 @@ #include #include #include +#include +#include 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); } -- cgit v0.12 From 984cb207df0c409ff166d12a194e6e8340950ba1 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Wed, 14 Oct 2009 15:46:13 +1000 Subject: Minor fixes for qmlInfo. --- src/declarative/qml/qmlinfo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); -- cgit v0.12 From 82412ca0e8afde645b0e515b36b1c7ccf00c78ab Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 15:47:52 +1000 Subject: Doc --- doc/src/declarative/qmldocument.qdoc | 2 ++ 1 file changed, 2 insertions(+) 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, -- cgit v0.12 From 2cb6b94e4587f32a109e0b7c2283978f3d78c649 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Wed, 14 Oct 2009 16:07:44 +1000 Subject: ParentChange docs --- src/declarative/util/qmlstateoperations.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/declarative/util/qmlstateoperations.cpp b/src/declarative/util/qmlstateoperations.cpp index 07eb641..60fd421 100644 --- a/src/declarative/util/qmlstateoperations.cpp +++ b/src/declarative/util/qmlstateoperations.cpp @@ -114,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) -- cgit v0.12 From d03a920b47a863a73e73d200b91baf5368ba6f7f Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 16:18:24 +1000 Subject: Doc --- doc/src/declarative/binding.qdoc | 123 ------------------------------------- doc/src/declarative/qtbinding.qdoc | 123 +++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 123 deletions(-) delete mode 100644 doc/src/declarative/binding.qdoc create mode 100644 doc/src/declarative/qtbinding.qdoc diff --git a/doc/src/declarative/binding.qdoc b/doc/src/declarative/binding.qdoc deleted file mode 100644 index 94465a1..0000000 --- a/doc/src/declarative/binding.qdoc +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the documentation 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$ -** -****************************************************************************/ - -/*! -\page qtbinding.html -\target qtbinding -\title QML/C++ Data Binding - -The QML mechanisms of data binding can also be used to bind Qt C++ objects. - -The data binding framework is based on Qt's property system (see the Qt documentation for more details on this system). If a binding is meant to be dynamic (where changes in one object are reflected in another object), \c NOTIFY must be specified for the property being tracked. If \c NOTIFY is not specified, any binding to that property will be an 'intialization' binding (the tracking object will be updated only once with the initial value of the tracked object). - -Relevant items can also be bound to the contents of a Qt model. -For example, ListView can make use of data from a QAbstractItemModel-derived model. - - -\section1 Passing Data Between C++ and QML - -Data binding provides one method of data transfer between C++ and QML. - -For example, lets say you want to implement a slider in QML that changes the screen brightness of the device it is running on. You would start by declaring a brightness property on your QObject-derived class: -\code -class MyScreen : public QObject -{ - Q_OBJECT -public: - MyScreen(QObject *parent=0); - - Q_PROPERTY(int brightness READ brightness WRITE setBrightness NOTIFY brightnessChanged); - int brightness() const; - void setBrightness(int b); - ... - -signals: - void brightnessChanged(); - -private: - int m_brightness; -}; - -int brightness() const -{ - return m_brightness; -} - -void setBrightness(int b) -{ - if (b != m_brightness) { - m_brightness = b; - emit brightnessChanged(); - - //set device brightness - ... - } -} -\endcode - -\note One important thing to keep in mind is that the changed signal should only be emitted when there is a real change ( \c b \c != \c m_brightness ), or you may get an infinite loop. - -Next, make an instance of this class visible to the QML bind engine: -\code -QmlView *view = new QmlView; -view->setUrl("MyUI.qml"); - -MyScreen *screen = new MyScreen; -QmlContext *ctxt = view->rootContext(); -ctxt->setContextProperty("screen", screen); - -view->execute(); -\endcode - -\note Bindings must be made after setUrl() but before execute(). - -Finally, in QML you can make the appropriate bindings, so in \c "MyUI.qml": - -\code -Slider { value: screen.brightness } -Binding { target: screen; property: "brightness"; value: slider.value } -\endcode - -The \l QBindableMap class provides a convenient way to make data visible to the bind engine. - -C++ \l {qmlmodels}{Data Models} may also be provided to QML. - -*/ diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc new file mode 100644 index 0000000..94465a1 --- /dev/null +++ b/doc/src/declarative/qtbinding.qdoc @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the documentation 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$ +** +****************************************************************************/ + +/*! +\page qtbinding.html +\target qtbinding +\title QML/C++ Data Binding + +The QML mechanisms of data binding can also be used to bind Qt C++ objects. + +The data binding framework is based on Qt's property system (see the Qt documentation for more details on this system). If a binding is meant to be dynamic (where changes in one object are reflected in another object), \c NOTIFY must be specified for the property being tracked. If \c NOTIFY is not specified, any binding to that property will be an 'intialization' binding (the tracking object will be updated only once with the initial value of the tracked object). + +Relevant items can also be bound to the contents of a Qt model. +For example, ListView can make use of data from a QAbstractItemModel-derived model. + + +\section1 Passing Data Between C++ and QML + +Data binding provides one method of data transfer between C++ and QML. + +For example, lets say you want to implement a slider in QML that changes the screen brightness of the device it is running on. You would start by declaring a brightness property on your QObject-derived class: +\code +class MyScreen : public QObject +{ + Q_OBJECT +public: + MyScreen(QObject *parent=0); + + Q_PROPERTY(int brightness READ brightness WRITE setBrightness NOTIFY brightnessChanged); + int brightness() const; + void setBrightness(int b); + ... + +signals: + void brightnessChanged(); + +private: + int m_brightness; +}; + +int brightness() const +{ + return m_brightness; +} + +void setBrightness(int b) +{ + if (b != m_brightness) { + m_brightness = b; + emit brightnessChanged(); + + //set device brightness + ... + } +} +\endcode + +\note One important thing to keep in mind is that the changed signal should only be emitted when there is a real change ( \c b \c != \c m_brightness ), or you may get an infinite loop. + +Next, make an instance of this class visible to the QML bind engine: +\code +QmlView *view = new QmlView; +view->setUrl("MyUI.qml"); + +MyScreen *screen = new MyScreen; +QmlContext *ctxt = view->rootContext(); +ctxt->setContextProperty("screen", screen); + +view->execute(); +\endcode + +\note Bindings must be made after setUrl() but before execute(). + +Finally, in QML you can make the appropriate bindings, so in \c "MyUI.qml": + +\code +Slider { value: screen.brightness } +Binding { target: screen; property: "brightness"; value: slider.value } +\endcode + +The \l QBindableMap class provides a convenient way to make data visible to the bind engine. + +C++ \l {qmlmodels}{Data Models} may also be provided to QML. + +*/ -- cgit v0.12 From 0cd18d2ccf2e1cb5d2b2b0d3ad50878fcbfa91ed Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Wed, 14 Oct 2009 16:28:14 +1000 Subject: Allow platform(font)-specific test recordings. Update platform visuals for all failing visual tests. --- .../visual/ListView/data-X11/basic1.qml | 159 ++ .../visual/ListView/data-X11/basic2.qml | 187 ++ .../visual/ListView/data-X11/basic3.qml | 147 + .../visual/ListView/data-X11/basic4.qml | 171 ++ .../visual/flickable/data-X11/flickable.0.png | Bin 0 -> 115546 bytes .../visual/flickable/data-X11/flickable.1.png | Bin 0 -> 115627 bytes .../visual/flickable/data-X11/flickable.2.png | Bin 0 -> 116034 bytes .../visual/flickable/data-X11/flickable.qml | 791 ++++++ .../visual/focusscope/data-X11/test.0.png | Bin 0 -> 11521 bytes .../visual/focusscope/data-X11/test.1.png | Bin 0 -> 11521 bytes .../visual/focusscope/data-X11/test.2.png | Bin 0 -> 11503 bytes .../visual/focusscope/data-X11/test.3.png | Bin 0 -> 11518 bytes .../visual/focusscope/data-X11/test.4.png | Bin 0 -> 11518 bytes .../visual/focusscope/data-X11/test.5.png | Bin 0 -> 11518 bytes .../visual/focusscope/data-X11/test.qml | 1599 +++++++++++ .../visual/focusscope/data-X11/test2.0.png | Bin 0 -> 4656 bytes .../visual/focusscope/data-X11/test2.1.png | Bin 0 -> 4656 bytes .../visual/focusscope/data-X11/test2.qml | 607 +++++ .../visual/focusscope/data-X11/test3.0.png | Bin 0 -> 10098 bytes .../visual/focusscope/data-X11/test3.1.png | Bin 0 -> 10056 bytes .../visual/focusscope/data-X11/test3.2.png | Bin 0 -> 9817 bytes .../visual/focusscope/data-X11/test3.3.png | Bin 0 -> 9631 bytes .../visual/focusscope/data-X11/test3.4.png | Bin 0 -> 9464 bytes .../visual/focusscope/data-X11/test3.5.png | Bin 0 -> 9638 bytes .../visual/focusscope/data-X11/test3.6.png | Bin 0 -> 9817 bytes .../visual/focusscope/data-X11/test3.7.png | Bin 0 -> 10056 bytes .../visual/focusscope/data-X11/test3.8.png | Bin 0 -> 10095 bytes .../visual/focusscope/data-X11/test3.9.png | Bin 0 -> 10077 bytes .../visual/focusscope/data-X11/test3.qml | 2879 ++++++++++++++++++++ .../visual/focusscope/data/test3.0.png.reject.png | Bin 12616 -> 0 bytes .../visual/focusscope/data/test3.1.png.reject.png | Bin 12539 -> 0 bytes .../visual/qfxtext/elide/data-X11/elide.0.png | Bin 0 -> 1012 bytes .../visual/qfxtext/elide/data-X11/elide.qml | 279 ++ .../visual/repeater/data-X11/basic1.0.png | Bin 0 -> 1354 bytes .../visual/repeater/data-X11/basic1.qml | 323 +++ .../visual/repeater/data-X11/basic2.0.png | Bin 0 -> 1354 bytes .../visual/repeater/data-X11/basic2.qml | 331 +++ .../visual/repeater/data-X11/basic3.0.png | Bin 0 -> 1354 bytes .../visual/repeater/data-X11/basic3.qml | 347 +++ .../visual/repeater/data-X11/basic4.0.png | Bin 0 -> 1354 bytes .../visual/repeater/data-X11/basic4.qml | 419 +++ tests/auto/declarative/visual/tst_visual.cpp | 64 +- 42 files changed, 8290 insertions(+), 13 deletions(-) create mode 100644 tests/auto/declarative/visual/ListView/data-X11/basic1.qml create mode 100644 tests/auto/declarative/visual/ListView/data-X11/basic2.qml create mode 100644 tests/auto/declarative/visual/ListView/data-X11/basic3.qml create mode 100644 tests/auto/declarative/visual/ListView/data-X11/basic4.qml create mode 100644 tests/auto/declarative/visual/flickable/data-X11/flickable.0.png create mode 100644 tests/auto/declarative/visual/flickable/data-X11/flickable.1.png create mode 100644 tests/auto/declarative/visual/flickable/data-X11/flickable.2.png create mode 100644 tests/auto/declarative/visual/flickable/data-X11/flickable.qml create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test.0.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test.1.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test.2.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test.3.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test.4.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test.5.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test.qml create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test2.0.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test2.1.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test2.qml create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.0.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.1.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.2.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.3.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.4.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.5.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.6.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.7.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.8.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.9.png create mode 100644 tests/auto/declarative/visual/focusscope/data-X11/test3.qml delete mode 100644 tests/auto/declarative/visual/focusscope/data/test3.0.png.reject.png delete mode 100644 tests/auto/declarative/visual/focusscope/data/test3.1.png.reject.png create mode 100644 tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.png create mode 100644 tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.qml create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic1.0.png create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic1.qml create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic2.0.png create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic2.qml create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic3.0.png create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic3.qml create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic4.0.png create mode 100644 tests/auto/declarative/visual/repeater/data-X11/basic4.qml 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 Binary files /dev/null and b/tests/auto/declarative/visual/flickable/data-X11/flickable.0.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/flickable/data-X11/flickable.1.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/flickable/data-X11/flickable.2.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test.0.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test.1.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test.2.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test.3.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test.4.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test.5.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test2.0.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test2.1.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.0.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.1.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.2.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.3.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.4.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.5.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.6.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.7.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.8.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/focusscope/data-X11/test3.9.png 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 Binary files a/tests/auto/declarative/visual/focusscope/data/test3.0.png.reject.png and /dev/null 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 Binary files a/tests/auto/declarative/visual/focusscope/data/test3.1.png.reject.png and /dev/null 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 Binary files /dev/null and b/tests/auto/declarative/visual/qfxtext/elide/data-X11/elide.0.png 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/repeater/data-X11/basic1.0.png b/tests/auto/declarative/visual/repeater/data-X11/basic1.0.png new file mode 100644 index 0000000..18ab543 Binary files /dev/null and b/tests/auto/declarative/visual/repeater/data-X11/basic1.0.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/repeater/data-X11/basic2.0.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/repeater/data-X11/basic3.0.png 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 Binary files /dev/null and b/tests/auto/declarative/visual/repeater/data-X11/basic4.0.png 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..367166d 100644 --- a/tests/auto/declarative/visual/tst_visual.cpp +++ b/tests/auto/declarative/visual/tst_visual.cpp @@ -7,6 +7,8 @@ #include #include +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 || QDir(testdata+QLatin1String(platformsuffix)).exists())) { + 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]; } -- cgit v0.12 From 7d445b391a10e659f842e9d232619de494f36aea Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 17:39:34 +1000 Subject: Doc --- doc/src/declarative/qtbinding.qdoc | 9 ++++++++- doc/src/declarative/qtdeclarative.qdoc | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc index 94465a1..e925227 100644 --- a/doc/src/declarative/qtbinding.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: -- cgit v0.12 From 712ea07c079c8ac9ea0e397638e7547138b4a087 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 14 Oct 2009 17:50:16 +1000 Subject: Make assigning to a QList and a QmlList consistent --- src/declarative/qml/qmlmetaproperty.cpp | 1 - 1 file changed, 1 deletion(-) 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); } -- cgit v0.12 From f410aa58f93b27a5ba1b82e2f3a87d14338e22a4 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 14 Oct 2009 12:21:04 +0200 Subject: Don't rewrite expression statements in loops. --- src/declarative/qml/qmlrewrite.cpp | 72 ++++++++++++++++++++++++++++++++++++-- src/declarative/qml/qmlrewrite_p.h | 22 ++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/declarative/qml/qmlrewrite.cpp b/src/declarative/qml/qmlrewrite.cpp index a41b571..19b88cc 100644 --- a/src/declarative/qml/qmlrewrite.cpp +++ b/src/declarative/qml/qmlrewrite.cpp @@ -111,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 _loopStack; }; } // namespace QmlRewrite -- cgit v0.12 From 2e1b1d35127c66a20645b65ae293299c5a67c4e9 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 13:25:52 +1000 Subject: Fix (was creating lower-case). --- tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp index b68d9bf..3dedb79 100644 --- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp +++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp @@ -126,14 +126,14 @@ void tst_qmllanguage::initTestCase() // 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\241\303\242\303\243\303\244\303\245.qml")).toLocalFile()); + 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\241\303\242\303\243\303\244\303\245.qml")).toLocalFile())); + 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() -- cgit v0.12 From 14f7463ceb008269a50d7108b983c6be5c34c8b0 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 13:50:52 +1000 Subject: Unicode namespace fix. (no bug reported) --- src/declarative/qml/qmlengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index f0ecf1d..528e8c9 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -1099,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; -- cgit v0.12 From 5f24950397d078b74144b542c0eff6169aae68b3 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 13:55:09 +1000 Subject: Test Unicode namespace --- tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml | 5 +++++ tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp | 1 + 2 files changed, 6 insertions(+) create mode 100644 tests/auto/declarative/qmllanguage/data/i18nNameSpace.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/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp index 3dedb79..8d4ae65 100644 --- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp +++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp @@ -711,6 +711,7 @@ void tst_qmllanguage::i18n_data() 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() -- cgit v0.12 From 5ab4ccf0e0d3618e799dcfc82bd7fcf3fd560e78 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 14:45:49 +1000 Subject: Fix for when multiple tests share a data director. --- tests/auto/declarative/visual/tst_visual.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/declarative/visual/tst_visual.cpp b/tests/auto/declarative/visual/tst_visual.cpp index 367166d..cb32085 100644 --- a/tests/auto/declarative/visual/tst_visual.cpp +++ b/tests/auto/declarative/visual/tst_visual.cpp @@ -112,7 +112,7 @@ QString tst_visual::toTestScript(const QString &file, Mode mode) QString("data"); QString testname = file.mid(index + 1, file.length() - index - 5); - if (platformsuffix && (mode == UpdatePlatformVisuals || QDir(testdata+QLatin1String(platformsuffix)).exists())) { + 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)); -- cgit v0.12 From e61b7c6d8194ce42eb0021c4b59788d42c04ec0e Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 14:46:13 +1000 Subject: Multilength strings test. --- .../declarative/visual/qfxtext/elide/multilength.qml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/auto/declarative/visual/qfxtext/elide/multilength.qml 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..3382524 --- /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!" + } + } +} -- cgit v0.12 From 8fc45851858d748732b340705c26413ee7754291 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 15:00:11 +1000 Subject: Final can be longer. --- tests/auto/declarative/visual/qfxtext/elide/multilength.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml index 3382524..6cd37b4 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml +++ b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml @@ -14,7 +14,7 @@ Rectangle { 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!" + text: "Brevity is the soul of wit, and tediousness the limbs and outward flourishes.\x9CBrevity is a great charm of eloquence.\x9CBe concise!\x9CSHHHHHHHHHHHHHHHHHHHHHHHHHHHH" } } } -- cgit v0.12 From 0a0456bda6d730242267dec7dd6861702bab3877 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 15 Oct 2009 15:18:14 +1000 Subject: Fix more compiler warnings. --- src/declarative/debugger/qmldebugclient.cpp | 2 +- src/declarative/fx/qfxlistview.cpp | 2 +- src/declarative/fx/qfxtextinput_p.h | 2 +- src/declarative/qml/qmlinfo.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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/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/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/qmlinfo.cpp b/src/declarative/qml/qmlinfo.cpp index 862d6ba..e68deae 100644 --- a/src/declarative/qml/qmlinfo.cpp +++ b/src/declarative/qml/qmlinfo.cpp @@ -77,7 +77,7 @@ void qmlInfo(const QString& msg, QObject* object) { QString pos = QLatin1String("QML"); if (object) { - pos += " "; + pos += QLatin1String(" "); pos += QLatin1String(object->metaObject()->className()); } QmlDeclarativeData *ddata = QmlDeclarativeData::get(object); -- cgit v0.12 From db695ff137e53f5285f5bb90f1a50281c27a4281 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 16:29:57 +1000 Subject: doc --- src/declarative/fx/qfxtext.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 { -- cgit v0.12