summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-07-31 07:46:34 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2010-07-31 07:46:34 (GMT)
commite93d11c733bb44208089a7488c6e7a176468d407 (patch)
tree8ca16ca3cd5dc90ed1980ff27409feb381daa69c
parentbeecb594267063a877e844538c15f67339bf6a8e (diff)
parent0b98430c19a613fa660133b37c83e1abd3d8d1a5 (diff)
downloadQt-e93d11c733bb44208089a7488c6e7a176468d407.zip
Qt-e93d11c733bb44208089a7488c6e7a176468d407.tar.gz
Qt-e93d11c733bb44208089a7488c6e7a176468d407.tar.bz2
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/qt-qml into 4.7-integration
* '4.7' of scm.dev.nokia.troll.no:qt/qt-qml: Add missing image Mention scope of id uniqueness Update QML Documents example add license header doc: Add a note about QCoreApplication::applicationDirPath Add license header Add moving and flicking properties to PathView Improve utility of QMLViewer Add missing \l doc commands Document elements that are focus scopes. Remove use of shared NOTIFY signals in QGraphicsScale Remove use of shared NOTIFY signals
-rw-r--r--doc/src/declarative/focus.qdoc2
-rw-r--r--doc/src/declarative/pics/anatomy-component.pngbin16117 -> 4902 bytes
-rw-r--r--doc/src/declarative/qdeclarativedocument.qdoc62
-rw-r--r--doc/src/declarative/qdeclarativei18n.qdoc2
-rw-r--r--doc/src/declarative/qdeclarativeintro.qdoc7
-rw-r--r--doc/src/declarative/qdeclarativestates.qdoc2
-rw-r--r--doc/src/declarative/tutorial.qdoc2
-rw-r--r--doc/src/images/qml-pathview-example.pngbin0 -> 22077 bytes
-rw-r--r--doc/src/platforms/mac-differences.qdoc3
-rw-r--r--doc/src/snippets/declarative/qmldocuments.qml66
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview.cpp8
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.cpp24
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem_p.h19
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview.cpp14
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview_p.h7
-rw-r--r--src/declarative/graphicsitems/qdeclarativeloader.cpp3
-rw-r--r--src/declarative/graphicsitems/qdeclarativepath.cpp9
-rw-r--r--src/declarative/graphicsitems/qdeclarativepath_p.h41
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview.cpp115
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview_p.h13
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview_p_p.h13
-rw-r--r--src/declarative/graphicsitems/qdeclarativetranslate.cpp4
-rw-r--r--src/declarative/graphicsitems/qdeclarativetranslate_p.h7
-rw-r--r--src/declarative/util/qdeclarativeanimation.cpp8
-rw-r--r--src/declarative/util/qdeclarativeanimation_p.h10
-rw-r--r--src/gui/graphicsview/qgraphicstransform.cpp3
-rw-r--r--src/gui/graphicsview/qgraphicstransform.h9
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.pngbin2321 -> 2412 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.pngbin2380 -> 2443 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.pngbin2315 -> 2398 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.pngbin2372 -> 2390 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.pngbin2327 -> 2416 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.pngbin0 -> 2395 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml1280
-rw-r--r--tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml5
-rw-r--r--tools/qml/Info_mac.plist31
-rw-r--r--tools/qml/browser/Browser.qml (renamed from tools/qml/content/Browser.qml)0
-rw-r--r--tools/qml/browser/browser.qrc9
-rw-r--r--tools/qml/browser/images/folder.png (renamed from tools/qml/content/images/folder.png)bin1841 -> 1841 bytes
-rw-r--r--tools/qml/browser/images/titlebar.png (renamed from tools/qml/content/images/titlebar.png)bin1436 -> 1436 bytes
-rw-r--r--tools/qml/browser/images/titlebar.sci (renamed from tools/qml/content/images/titlebar.sci)0
-rw-r--r--tools/qml/browser/images/up.png (renamed from tools/qml/content/images/up.png)bin662 -> 662 bytes
-rw-r--r--tools/qml/main.cpp476
-rw-r--r--tools/qml/qml.pri4
-rw-r--r--tools/qml/qmlruntime.cpp62
-rw-r--r--tools/qml/qmlruntime.h1
-rw-r--r--tools/qml/qmlruntime.qrc9
-rw-r--r--tools/qml/startup/Logo.qml179
-rw-r--r--tools/qml/startup/qt-back.pngbin0 -> 3549 bytes
-rw-r--r--tools/qml/startup/qt-blue.jpgbin0 -> 20900 bytes
-rw-r--r--tools/qml/startup/qt-front.pngbin0 -> 3318 bytes
-rw-r--r--tools/qml/startup/qt-sketch.jpgbin0 -> 17048 bytes
-rw-r--r--tools/qml/startup/qt-text.pngbin0 -> 14565 bytes
-rw-r--r--tools/qml/startup/quick-blur.pngbin0 -> 2826 bytes
-rw-r--r--tools/qml/startup/quick-regular.pngbin0 -> 1399 bytes
-rw-r--r--tools/qml/startup/shadow.pngbin0 -> 1592 bytes
-rw-r--r--tools/qml/startup/startup.qml167
-rw-r--r--tools/qml/startup/startup.qrc16
-rw-r--r--tools/qml/startup/white-star.pngbin0 -> 2651 bytes
59 files changed, 1932 insertions, 760 deletions
diff --git a/doc/src/declarative/focus.qdoc b/doc/src/declarative/focus.qdoc
index e3ca963..56ea165 100644
--- a/doc/src/declarative/focus.qdoc
+++ b/doc/src/declarative/focus.qdoc
@@ -266,7 +266,7 @@ When a QML item explicitly relinquishes focus (by setting its
does not automatically select another element to receive focus. That is, it
is possible for there to be no currently \e {active focus}.
-See the {declarative/keyinteraction/focus}{Keyboard Focus example} for a
+See the \l{declarative/keyinteraction/focus}{Keyboard Focus example} for a
demonstration of moving keyboard focus between multiple areas using FocusScope
elements.
diff --git a/doc/src/declarative/pics/anatomy-component.png b/doc/src/declarative/pics/anatomy-component.png
index 70ed983..6125b00 100644
--- a/doc/src/declarative/pics/anatomy-component.png
+++ b/doc/src/declarative/pics/anatomy-component.png
Binary files differ
diff --git a/doc/src/declarative/qdeclarativedocument.qdoc b/doc/src/declarative/qdeclarativedocument.qdoc
index a2ed205..068297a 100644
--- a/doc/src/declarative/qdeclarativedocument.qdoc
+++ b/doc/src/declarative/qdeclarativedocument.qdoc
@@ -73,51 +73,61 @@ document - such as \c Rectangle and \c ListView - including those made within an
import statements. QML does not import any modules by default, so at least one \c import
statement must be present or no elements will be available!
+Each \c id value in a QML document must be unique within that document. They
+do not need to be unique across different documents as id values are
+resolved according to the document scope.
+
+
+\section1 Documents as Component Definitions
+
A QML document defines a single, top-level \l {QDeclarativeComponent}{QML component}. A QML component
is a template that is interpreted by the QML runtime to create an object with some predefined
behaviour. As it is a template, a single QML component can be "run" multiple times to
produce several objects, each of which are said to be \e instances of the component.
Once created, instances are not dependent on the component that created them, so they can
-operate on independent data. Here is an example of a simple "Button" component that is
-instantiated four times, each with a different value for its \c text property.
+operate on independent data. Here is an example of a simple "Button" component (defined
+in a \c Button.qml file) that is instantiated four times by \c application.qml.
+Each instance is created with a different value for its \c text property:
-\raw HTML
-<table><tr><td>
-\endraw
-\code
+\table
+\row
+\o Button.qml
+\o application.qml
+
+\row
+\o \snippet doc/src/snippets/declarative/qmldocuments.qml 0
+\o
+\qml
import Qt 4.7
-BorderImage {
- property alias text: textElement.text
- width: 100; height: 30; source: "images/toolbutton.sci"
-
- Text {
- id: textElement
- anchors.centerIn: parent
- font.pointSize: 20
- style: Text.Raised
- color: "white"
- }
+Column {
+ spacing: 10
+
+ Button { text: "Apple" }
+ Button { text: "Orange" }
+ Button { text: "Pear" }
+ Button { text: "Grape" }
}
-\endcode
-\raw HTML
-</td> <td>
-\endraw
+\endqml
+
\image anatomy-component.png
-\raw HTML
-</td> </tr> </table>
-\endraw
+
+\endtable
Any snippet of QML code can become a component, just by placing it in the file "<Name>.qml"
-where <Name> is the new element name, and begins with an uppercase letter. Note that
+where <Name> is the new element name, and begins with an \bold uppercase letter. Note that
the case of all characters in the <Name> are significant on some filesystems, notably
UNIX filesystems. It is recommended that the case of the filename matches the case of
the component name in QML exactly, regardless of the platform the QML will be deployed to.
-These QML files automatically become available as new QML element types
+These QML component files automatically become available as new QML element types
to other QML components and applications in the same directory.
+
+
+\section1 Inline Components
+
In addition to the top-level component that all QML documents define, and any reusable
components placed in separate files, documents may also
include \e inline components. Inline components are declared using the
diff --git a/doc/src/declarative/qdeclarativei18n.qdoc b/doc/src/declarative/qdeclarativei18n.qdoc
index b6e6c6e..70a3587 100644
--- a/doc/src/declarative/qdeclarativei18n.qdoc
+++ b/doc/src/declarative/qdeclarativei18n.qdoc
@@ -80,5 +80,5 @@ qmlviewer -translation hello.qm hello.qml
\endcode
-You can see a complete example and source code in the {declarative/i18n}{QML Internationalization example}.
+You can see a complete example and source code in the \l{declarative/i18n}{QML Internationalization example}.
*/
diff --git a/doc/src/declarative/qdeclarativeintro.qdoc b/doc/src/declarative/qdeclarativeintro.qdoc
index 75055d8..fa42f59 100644
--- a/doc/src/declarative/qdeclarativeintro.qdoc
+++ b/doc/src/declarative/qdeclarativeintro.qdoc
@@ -87,6 +87,10 @@ Rectangle { width: 100; height: 100 }
When multiple property/value pairs are specified on a single line, they
must be separated by a semicolon.
+The \c import statement imports the \c Qt \l{QML Modules}{module}, which contains all of the
+standard \l {QML Elements}. Without this import statement, the \l Rectangle
+and \l Image elements would not be available.
+
\section1 Expressions
In addition to assigning values to properties, you can also assign
@@ -181,7 +185,8 @@ Item {
\section3 The \c id property
-Each object can be given a special unique property called an \e id. Assigning an id enables the object
+Each object can be given a special unique property called an \e id. No other object within the
+same \l{QML Documents}{QML document} can have the same \c id value. Assigning an id enables the object
to be referred to by other objects and scripts.
The first Rectangle element below has an \e id, "myRect". The second Rectange element defines its
diff --git a/doc/src/declarative/qdeclarativestates.qdoc b/doc/src/declarative/qdeclarativestates.qdoc
index 6461925..e7607c6 100644
--- a/doc/src/declarative/qdeclarativestates.qdoc
+++ b/doc/src/declarative/qdeclarativestates.qdoc
@@ -83,6 +83,6 @@ Other things you can do in a state change:
\endlist
-The {declarative/animation/states}{States and Transitions example} demonstrates how to declare a basic set of states and then apply animated transitions between them.
+The \l {declarative/animation/states}{States and Transitions example} demonstrates how to declare a basic set of states and then apply animated transitions between them.
*/
diff --git a/doc/src/declarative/tutorial.qdoc b/doc/src/declarative/tutorial.qdoc
index 7a97eb1..f913d44 100644
--- a/doc/src/declarative/tutorial.qdoc
+++ b/doc/src/declarative/tutorial.qdoc
@@ -222,5 +222,5 @@ This is equivalent to writing the two transitions separately.
The \l ParallelAnimation element makes sure that the two types of animations (number and color) start at the same time.
We could also run them one after the other by using \l SequentialAnimation instead.
-For more details on states and transitions, see \l {QML States} and the {declarative/animation/states}{states and transitions example}.
+For more details on states and transitions, see \l {QML States} and the \l{declarative/animation/states}{states and transitions example}.
*/
diff --git a/doc/src/images/qml-pathview-example.png b/doc/src/images/qml-pathview-example.png
new file mode 100644
index 0000000..c874c5c
--- /dev/null
+++ b/doc/src/images/qml-pathview-example.png
Binary files differ
diff --git a/doc/src/platforms/mac-differences.qdoc b/doc/src/platforms/mac-differences.qdoc
index 766c619..2501656 100644
--- a/doc/src/platforms/mac-differences.qdoc
+++ b/doc/src/platforms/mac-differences.qdoc
@@ -175,6 +175,9 @@
\l{http://developer.apple.com/documentation/CoreFoundation/Reference/CFBundleRef/index.html}
{Apple's Developer Website}.
+ Note: QCoreApplication::applicationDirPath() can be used to determine
+ the path of the binary within the bundle.
+
\section2 Translating the Application Menu and Native Dialogs
The items in the Application Menu will be merged correctly for
diff --git a/doc/src/snippets/declarative/qmldocuments.qml b/doc/src/snippets/declarative/qmldocuments.qml
new file mode 100644
index 0000000..c19a658
--- /dev/null
+++ b/doc/src/snippets/declarative/qmldocuments.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//![0]
+import Qt 4.7
+
+Rectangle {
+ property alias text: textItem.text
+
+ width: 100; height: 30
+ border.width: 1
+ radius: 5
+ smooth: true
+
+ gradient: Gradient {
+ GradientStop { position: 0.0; color: "darkGray" }
+ GradientStop { position: 0.5; color: "black" }
+ GradientStop { position: 1.0; color: "darkGray" }
+ }
+
+ Text {
+ id: textItem
+ anchors.centerIn: parent
+ font.pointSize: 20
+ color: "white"
+ }
+
+}
+//![0]
diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp
index 89b3958..f02ef6b 100644
--- a/src/declarative/graphicsitems/qdeclarativegridview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp
@@ -1085,13 +1085,15 @@ void QDeclarativeGridViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
\c portrait data directly.
An improved grid view is shown below. The delegate is visually improved and is moved
- into a separate \c contactDelegate component. Also, the currently selected item is highlighted
- with a blue \l Rectangle using the \l highlight property, and \c focus is set to \c true
- to enable keyboard navigation for the grid view.
+ into a separate \c contactDelegate component.
\snippet doc/src/snippets/declarative/gridview/gridview.qml classdocs advanced
\image gridview-highlight.png
+ The currently selected item is highlighted with a blue \l Rectangle using the \l highlight property,
+ and \c focus is set to \c true to enable keyboard navigation for the grid view.
+ The grid view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
+
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index c80fc2f..2c295cd 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -511,8 +511,10 @@ QDeclarativeItem *QDeclarativeKeyNavigationAttached::left() const
void QDeclarativeKeyNavigationAttached::setLeft(QDeclarativeItem *i)
{
Q_D(QDeclarativeKeyNavigationAttached);
+ if (d->left == i)
+ return;
d->left = i;
- emit changed();
+ emit leftChanged();
}
QDeclarativeItem *QDeclarativeKeyNavigationAttached::right() const
@@ -524,8 +526,10 @@ QDeclarativeItem *QDeclarativeKeyNavigationAttached::right() const
void QDeclarativeKeyNavigationAttached::setRight(QDeclarativeItem *i)
{
Q_D(QDeclarativeKeyNavigationAttached);
+ if (d->right == i)
+ return;
d->right = i;
- emit changed();
+ emit rightChanged();
}
QDeclarativeItem *QDeclarativeKeyNavigationAttached::up() const
@@ -537,8 +541,10 @@ QDeclarativeItem *QDeclarativeKeyNavigationAttached::up() const
void QDeclarativeKeyNavigationAttached::setUp(QDeclarativeItem *i)
{
Q_D(QDeclarativeKeyNavigationAttached);
+ if (d->up == i)
+ return;
d->up = i;
- emit changed();
+ emit upChanged();
}
QDeclarativeItem *QDeclarativeKeyNavigationAttached::down() const
@@ -550,8 +556,10 @@ QDeclarativeItem *QDeclarativeKeyNavigationAttached::down() const
void QDeclarativeKeyNavigationAttached::setDown(QDeclarativeItem *i)
{
Q_D(QDeclarativeKeyNavigationAttached);
+ if (d->down == i)
+ return;
d->down = i;
- emit changed();
+ emit downChanged();
}
QDeclarativeItem *QDeclarativeKeyNavigationAttached::tab() const
@@ -563,8 +571,10 @@ QDeclarativeItem *QDeclarativeKeyNavigationAttached::tab() const
void QDeclarativeKeyNavigationAttached::setTab(QDeclarativeItem *i)
{
Q_D(QDeclarativeKeyNavigationAttached);
+ if (d->tab == i)
+ return;
d->tab = i;
- emit changed();
+ emit tabChanged();
}
QDeclarativeItem *QDeclarativeKeyNavigationAttached::backtab() const
@@ -576,8 +586,10 @@ QDeclarativeItem *QDeclarativeKeyNavigationAttached::backtab() const
void QDeclarativeKeyNavigationAttached::setBacktab(QDeclarativeItem *i)
{
Q_D(QDeclarativeKeyNavigationAttached);
+ if (d->backtab == i)
+ return;
d->backtab = i;
- emit changed();
+ emit backtabChanged();
}
/*!
diff --git a/src/declarative/graphicsitems/qdeclarativeitem_p.h b/src/declarative/graphicsitems/qdeclarativeitem_p.h
index 8c3e084..fffb4f7 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem_p.h
+++ b/src/declarative/graphicsitems/qdeclarativeitem_p.h
@@ -363,12 +363,12 @@ class QDeclarativeKeyNavigationAttached : public QObject, public QDeclarativeIte
Q_OBJECT
Q_DECLARE_PRIVATE(QDeclarativeKeyNavigationAttached)
- Q_PROPERTY(QDeclarativeItem *left READ left WRITE setLeft NOTIFY changed)
- Q_PROPERTY(QDeclarativeItem *right READ right WRITE setRight NOTIFY changed)
- Q_PROPERTY(QDeclarativeItem *up READ up WRITE setUp NOTIFY changed)
- Q_PROPERTY(QDeclarativeItem *down READ down WRITE setDown NOTIFY changed)
- Q_PROPERTY(QDeclarativeItem *tab READ tab WRITE setTab NOTIFY changed)
- Q_PROPERTY(QDeclarativeItem *backtab READ backtab WRITE setBacktab NOTIFY changed)
+ Q_PROPERTY(QDeclarativeItem *left READ left WRITE setLeft NOTIFY leftChanged)
+ Q_PROPERTY(QDeclarativeItem *right READ right WRITE setRight NOTIFY rightChanged)
+ Q_PROPERTY(QDeclarativeItem *up READ up WRITE setUp NOTIFY upChanged)
+ Q_PROPERTY(QDeclarativeItem *down READ down WRITE setDown NOTIFY downChanged)
+ Q_PROPERTY(QDeclarativeItem *tab READ tab WRITE setTab NOTIFY tabChanged)
+ Q_PROPERTY(QDeclarativeItem *backtab READ backtab WRITE setBacktab NOTIFY backtabChanged)
Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
Q_ENUMS(Priority)
@@ -396,7 +396,12 @@ public:
static QDeclarativeKeyNavigationAttached *qmlAttachedProperties(QObject *);
Q_SIGNALS:
- void changed();
+ void leftChanged();
+ void rightChanged();
+ void upChanged();
+ void downChanged();
+ void tabChanged();
+ void backtabChanged();
void priorityChanged();
private:
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index 8b616ce..b0a11b9 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -60,7 +60,7 @@ void QDeclarativeViewSection::setProperty(const QString &property)
{
if (property != m_property) {
m_property = property;
- emit changed();
+ emit propertyChanged();
}
}
@@ -68,7 +68,7 @@ void QDeclarativeViewSection::setCriteria(QDeclarativeViewSection::SectionCriter
{
if (criteria != m_criteria) {
m_criteria = criteria;
- emit changed();
+ emit criteriaChanged();
}
}
@@ -1385,14 +1385,16 @@ void QDeclarativeListViewPrivate::flick(AxisData &data, qreal minExtent, qreal m
the delegate is able to access the model's \c name and \c number data directly.
An improved list view is shown below. The delegate is visually improved and is moved
- into a separate \c contactDelegate component. Also, the currently selected item is highlighted
- with a blue \l Rectangle using the \l highlight property, and \c focus is set to \c true
- to enable keyboard navigation for the list view.
+ into a separate \c contactDelegate component.
\snippet doc/src/snippets/declarative/listview/listview.qml classdocs advanced
\image listview-highlight.png
- In a GridView, delegates are instantiated as needed and may be destroyed at any time.
+ The currently selected item is highlighted with a blue \l Rectangle using the \l highlight property,
+ and \c focus is set to \c true to enable keyboard navigation for the list view.
+ The list view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
+
+ Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
\note Views do not enable \e clip automatically. If the view
diff --git a/src/declarative/graphicsitems/qdeclarativelistview_p.h b/src/declarative/graphicsitems/qdeclarativelistview_p.h
index 9941040..b264861 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview_p.h
+++ b/src/declarative/graphicsitems/qdeclarativelistview_p.h
@@ -53,8 +53,8 @@ QT_MODULE(Declarative)
class Q_AUTOTEST_EXPORT QDeclarativeViewSection : public QObject
{
Q_OBJECT
- Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY changed)
- Q_PROPERTY(SectionCriteria criteria READ criteria WRITE setCriteria NOTIFY changed)
+ Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY propertyChanged)
+ Q_PROPERTY(SectionCriteria criteria READ criteria WRITE setCriteria NOTIFY criteriaChanged)
Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
Q_ENUMS(SectionCriteria)
public:
@@ -73,7 +73,8 @@ public:
QString sectionString(const QString &value);
Q_SIGNALS:
- void changed();
+ void propertyChanged();
+ void criteriaChanged();
void delegateChanged();
private:
diff --git a/src/declarative/graphicsitems/qdeclarativeloader.cpp b/src/declarative/graphicsitems/qdeclarativeloader.cpp
index cc7f8e5..d28181e 100644
--- a/src/declarative/graphicsitems/qdeclarativeloader.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeloader.cpp
@@ -159,6 +159,9 @@ void QDeclarativeLoaderPrivate::initResize()
unloads "Page1.qml" and frees resources consumed by it.
+ Note that Loader is a focus scope. Its \c focus property must be set to \c true for any of its children
+ to get the \e {active focus} (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
+
\sa {dynamic-object-creation}{Dynamic Object Creation}
*/
diff --git a/src/declarative/graphicsitems/qdeclarativepath.cpp b/src/declarative/graphicsitems/qdeclarativepath.cpp
index 80196a1..c48011d3 100644
--- a/src/declarative/graphicsitems/qdeclarativepath.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepath.cpp
@@ -474,6 +474,7 @@ void QDeclarativeCurve::setX(qreal x)
{
if (_x != x) {
_x = x;
+ emit xChanged();
emit changed();
}
}
@@ -487,6 +488,7 @@ void QDeclarativeCurve::setY(qreal y)
{
if (_y != y) {
_y = y;
+ emit yChanged();
emit changed();
}
}
@@ -576,6 +578,7 @@ void QDeclarativePathAttribute::setValue(qreal value)
{
if (_value != value) {
_value = value;
+ emit valueChanged();
emit changed();
}
}
@@ -678,6 +681,7 @@ void QDeclarativePathQuad::setControlX(qreal x)
{
if (_controlX != x) {
_controlX = x;
+ emit controlXChanged();
emit changed();
}
}
@@ -695,6 +699,7 @@ void QDeclarativePathQuad::setControlY(qreal y)
{
if (_controlY != y) {
_controlY = y;
+ emit controlYChanged();
emit changed();
}
}
@@ -761,6 +766,7 @@ void QDeclarativePathCubic::setControl1X(qreal x)
{
if (_control1X != x) {
_control1X = x;
+ emit control1XChanged();
emit changed();
}
}
@@ -774,6 +780,7 @@ void QDeclarativePathCubic::setControl1Y(qreal y)
{
if (_control1Y != y) {
_control1Y = y;
+ emit control1YChanged();
emit changed();
}
}
@@ -793,6 +800,7 @@ void QDeclarativePathCubic::setControl2X(qreal x)
{
if (_control2X != x) {
_control2X = x;
+ emit control2XChanged();
emit changed();
}
}
@@ -806,6 +814,7 @@ void QDeclarativePathCubic::setControl2Y(qreal y)
{
if (_control2Y != y) {
_control2Y = y;
+ emit control2YChanged();
emit changed();
}
}
diff --git a/src/declarative/graphicsitems/qdeclarativepath_p.h b/src/declarative/graphicsitems/qdeclarativepath_p.h
index 001bcdf..5ab5cfd 100644
--- a/src/declarative/graphicsitems/qdeclarativepath_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepath_p.h
@@ -68,7 +68,7 @@ class Q_AUTOTEST_EXPORT QDeclarativePathAttribute : public QDeclarativePathEleme
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
- Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY changed)
+ Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged)
public:
QDeclarativePathAttribute(QObject *parent=0) : QDeclarativePathElement(parent), _value(0) {}
@@ -81,6 +81,7 @@ public:
Q_SIGNALS:
void nameChanged();
+ void valueChanged();
private:
QString _name;
@@ -91,8 +92,8 @@ class Q_AUTOTEST_EXPORT QDeclarativeCurve : public QDeclarativePathElement
{
Q_OBJECT
- Q_PROPERTY(qreal x READ x WRITE setX NOTIFY changed)
- Q_PROPERTY(qreal y READ y WRITE setY NOTIFY changed)
+ Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
+ Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
public:
QDeclarativeCurve(QObject *parent=0) : QDeclarativePathElement(parent), _x(0), _y(0) {}
@@ -104,6 +105,10 @@ public:
virtual void addToPath(QPainterPath &) {}
+Q_SIGNALS:
+ void xChanged();
+ void yChanged();
+
private:
qreal _x;
qreal _y;
@@ -122,8 +127,8 @@ class Q_AUTOTEST_EXPORT QDeclarativePathQuad : public QDeclarativeCurve
{
Q_OBJECT
- Q_PROPERTY(qreal controlX READ controlX WRITE setControlX NOTIFY changed)
- Q_PROPERTY(qreal controlY READ controlY WRITE setControlY NOTIFY changed)
+ Q_PROPERTY(qreal controlX READ controlX WRITE setControlX NOTIFY controlXChanged)
+ Q_PROPERTY(qreal controlY READ controlY WRITE setControlY NOTIFY controlYChanged)
public:
QDeclarativePathQuad(QObject *parent=0) : QDeclarativeCurve(parent), _controlX(0), _controlY(0) {}
@@ -135,6 +140,10 @@ public:
void addToPath(QPainterPath &path);
+Q_SIGNALS:
+ void controlXChanged();
+ void controlYChanged();
+
private:
qreal _controlX;
qreal _controlY;
@@ -144,10 +153,10 @@ class Q_AUTOTEST_EXPORT QDeclarativePathCubic : public QDeclarativeCurve
{
Q_OBJECT
- Q_PROPERTY(qreal control1X READ control1X WRITE setControl1X NOTIFY changed)
- Q_PROPERTY(qreal control1Y READ control1Y WRITE setControl1Y NOTIFY changed)
- Q_PROPERTY(qreal control2X READ control2X WRITE setControl2X NOTIFY changed)
- Q_PROPERTY(qreal control2Y READ control2Y WRITE setControl2Y NOTIFY changed)
+ Q_PROPERTY(qreal control1X READ control1X WRITE setControl1X NOTIFY control1XChanged)
+ Q_PROPERTY(qreal control1Y READ control1Y WRITE setControl1Y NOTIFY control1YChanged)
+ Q_PROPERTY(qreal control2X READ control2X WRITE setControl2X NOTIFY control2XChanged)
+ Q_PROPERTY(qreal control2Y READ control2Y WRITE setControl2Y NOTIFY control2YChanged)
public:
QDeclarativePathCubic(QObject *parent=0) : QDeclarativeCurve(parent), _control1X(0), _control1Y(0), _control2X(0), _control2Y(0) {}
@@ -165,11 +174,17 @@ public:
void addToPath(QPainterPath &path);
+Q_SIGNALS:
+ void control1XChanged();
+ void control1YChanged();
+ void control2XChanged();
+ void control2YChanged();
+
private:
- int _control1X;
- int _control1Y;
- int _control2X;
- int _control2Y;
+ qreal _control1X;
+ qreal _control1Y;
+ qreal _control2X;
+ qreal _control2Y;
};
class Q_AUTOTEST_EXPORT QDeclarativePathPercent : public QDeclarativePathElement
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index acf9827..06ac275 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -90,6 +90,26 @@ void QDeclarativePathViewAttached::setValue(const QByteArray &name, const QVaria
m_metaobject->setValue(name, val);
}
+
+void QDeclarativePathViewPrivate::init()
+{
+ Q_Q(QDeclarativePathView);
+ offset = 0;
+ q->setAcceptedMouseButtons(Qt::LeftButton);
+ q->setFlag(QGraphicsItem::ItemIsFocusScope);
+ q->setFiltersChildEvents(true);
+ q->connect(&tl, SIGNAL(updated()), q, SLOT(ticked()));
+ lastPosTime.invalidate();
+ static int timelineCompletedIdx = -1;
+ static int movementEndingIdx = -1;
+ if (timelineCompletedIdx == -1) {
+ timelineCompletedIdx = QDeclarativeTimeLine::staticMetaObject.indexOfSignal("completed()");
+ movementEndingIdx = QDeclarativePathView::staticMetaObject.indexOfSlot("movementEnding()");
+ }
+ QMetaObject::connect(&tl, timelineCompletedIdx,
+ q, movementEndingIdx, Qt::DirectConnection);
+}
+
QDeclarativeItem *QDeclarativePathViewPrivate::getItem(int modelIndex)
{
Q_Q(QDeclarativePathView);
@@ -314,7 +334,7 @@ void QDeclarativePathViewPrivate::regenerate()
and XmlListModel, or custom model classes defined in C++ that inherit from
QAbstractListModel.
- A ListView has a \l model, which defines the data to be displayed, and
+ The view has a \l model, which defines the data to be displayed, and
a \l delegate, which defines how the data should be displayed.
The \l delegate is instantiated for each item on the \l path.
The items may be flicked to move them along the path.
@@ -333,6 +353,9 @@ void QDeclarativePathViewPrivate::regenerate()
opacity of the items as they rotate. This additional code can be seen in the
PathAttribute documentation.)
+ The \c focus can be set to \c true to enable keyboard navigation.
+ The path view itself is a focus scope (see \l{qmlfocus#Acquiring Focus and Focus Scopes}{the focus documentation page} for more details).
+
Delegates are instantiated as needed and may be destroyed at any time.
State should \e never be stored in a delegate.
@@ -341,7 +364,7 @@ void QDeclarativePathViewPrivate::regenerate()
to set \e {clip: true} in order to have the out of view items clipped
nicely.
- \sa Path
+ \sa Path, {declarative/modelviews/pathview}{PathView example}
*/
QDeclarativePathView::QDeclarativePathView(QDeclarativeItem *parent)
@@ -848,6 +871,61 @@ void QDeclarativePathView::setInteractive(bool interactive)
}
/*!
+ \qmlproperty bool PathView::moving
+
+ This property holds whether the view is currently moving
+ due to the user either dragging or flicking the view.
+*/
+bool QDeclarativePathView::isMoving() const
+{
+ Q_D(const QDeclarativePathView);
+ return d->moving;
+}
+
+/*!
+ \qmlproperty bool PathView::flicking
+
+ This property holds whether the view is currently moving
+ due to the user flicking the view.
+*/
+bool QDeclarativePathView::isFlicking() const
+{
+ Q_D(const QDeclarativePathView);
+ return d->flicking;
+}
+
+/*!
+ \qmlsignal PathView::onMovementStarted()
+
+ This handler is called when the view begins moving due to user
+ interaction.
+*/
+
+/*!
+ \qmlsignal PathView::onMovementEnded()
+
+ This handler is called when the view stops moving due to user
+ interaction. If a flick was generated, this handler will
+ be triggered once the flick stops. If a flick was not
+ generated, the handler will be triggered when the
+ user stops dragging - i.e. a mouse or touch release.
+*/
+
+/*!
+ \qmlsignal PathView::onFlickStarted()
+
+ This handler is called when the view is flicked. A flick
+ starts from the point that the mouse or touch is released,
+ while still in motion.
+*/
+
+/*!
+ \qmlsignal PathView::onFlickEnded()
+
+ This handler is called when the view stops moving due to a flick.
+*/
+
+/*!
\qmlproperty Component PathView::delegate
The delegate provides a template defining each item instantiated by the view.
@@ -964,7 +1042,11 @@ void QDeclarativePathView::mousePressEvent(QGraphicsSceneMouseEvent *event)
return;
}
- d->stealMouse = false;
+ if (d->tl.isActive() && d->flicking)
+ d->stealMouse = true; // If we've been flicked then steal the click.
+ else
+ d->stealMouse = false;
+
d->lastElapsed = 0;
d->lastDist = 0;
QDeclarativeItemPrivate::start(d->lastPosTime);
@@ -1000,6 +1082,11 @@ void QDeclarativePathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
d->lastDist = diff;
d->startPc = newPc;
}
+ if (!d->moving) {
+ d->moving = true;
+ emit movingChanged();
+ emit movementStarted();
+ }
}
}
@@ -1039,12 +1126,19 @@ void QDeclarativePathView::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
d->moveOffset.setValue(d->offset);
d->tl.accel(d->moveOffset, velocity, accel, dist);
d->tl.callback(QDeclarativeTimeLineCallback(&d->moveOffset, d->fixOffsetCallback, d));
+ if (!d->flicking) {
+ d->flicking = true;
+ emit flickingChanged();
+ emit flickStarted();
+ }
} else {
d->fixOffset();
}
d->lastPosTime.invalidate();
ungrabMouse();
+ if (!d->tl.isActive())
+ movementEnding();
}
bool QDeclarativePathView::sendMouseEvent(QGraphicsSceneMouseEvent *event)
@@ -1372,6 +1466,21 @@ void QDeclarativePathView::ticked()
d->updateCurrent();
}
+void QDeclarativePathView::movementEnding()
+{
+ Q_D(QDeclarativePathView);
+ if (d->flicking) {
+ d->flicking = false;
+ emit flickingChanged();
+ emit flickEnded();
+ }
+ if (d->moving && !d->stealMouse) {
+ d->moving = false;
+ emit movingChanged();
+ emit movementEnded();
+ }
+}
+
// find the item closest to the snap position
int QDeclarativePathViewPrivate::calcCurrentIndex()
{
diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p.h
index d2980c6..035a64b 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepathview_p.h
@@ -74,6 +74,9 @@ class Q_AUTOTEST_EXPORT QDeclarativePathView : public QDeclarativeItem
Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration NOTIFY flickDecelerationChanged)
Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged)
+ Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged)
+ Q_PROPERTY(bool flicking READ isFlicking NOTIFY flickingChanged)
+
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
Q_PROPERTY(int pathItemCount READ pathItemCount WRITE setPathItemCount NOTIFY pathItemCountChanged)
@@ -122,6 +125,9 @@ public:
bool isInteractive() const;
void setInteractive(bool);
+ bool isMoving() const;
+ bool isFlicking() const;
+
int count() const;
QDeclarativeComponent *delegate() const;
@@ -151,9 +157,15 @@ Q_SIGNALS:
void pathItemCountChanged();
void flickDecelerationChanged();
void interactiveChanged();
+ void movingChanged();
+ void flickingChanged();
void highlightChanged();
void highlightItemChanged();
void highlightMoveDurationChanged();
+ void movementStarted();
+ void movementEnded();
+ void flickStarted();
+ void flickEnded();
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
@@ -167,6 +179,7 @@ protected:
private Q_SLOTS:
void refill();
void ticked();
+ void movementEnding();
void itemsInserted(int index, int count);
void itemsRemoved(int index, int count);
void itemsMoved(int,int,int);
diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
index a0d2610..9abec2e 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
@@ -78,6 +78,7 @@ public:
, lastElapsed(0), mappedRange(1.0)
, stealMouse(false), ownModel(false), interactive(true), haveHighlightRange(true)
, autoHighlight(true), highlightUp(false), layoutScheduled(false)
+ , moving(false), flicking(false)
, dragMargin(0), deceleration(100)
, moveOffset(this, &QDeclarativePathViewPrivate::setOffset)
, firstIndex(-1), pathItems(-1), requestedIndex(-1)
@@ -90,15 +91,7 @@ public:
{
}
- void init() {
- Q_Q(QDeclarativePathView);
- offset = 0;
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setFlag(QGraphicsItem::ItemIsFocusScope);
- q->setFiltersChildEvents(true);
- q->connect(&tl, SIGNAL(updated()), q, SLOT(ticked()));
- lastPosTime.invalidate();
- }
+ void init();
void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
if ((newGeometry.size() != oldGeometry.size())
@@ -155,6 +148,8 @@ public:
bool autoHighlight : 1;
bool highlightUp : 1;
bool layoutScheduled : 1;
+ bool moving : 1;
+ bool flicking : 1;
QElapsedTimer lastPosTime;
QPointF lastPos;
qreal dragMargin;
diff --git a/src/declarative/graphicsitems/qdeclarativetranslate.cpp b/src/declarative/graphicsitems/qdeclarativetranslate.cpp
index 16a1127..be9b3f3 100644
--- a/src/declarative/graphicsitems/qdeclarativetranslate.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetranslate.cpp
@@ -90,7 +90,7 @@ void QDeclarativeTranslate::setX(qreal x)
return;
d->x = x;
update();
- emit positionChanged();
+ emit xChanged();
}
/*!
@@ -113,7 +113,7 @@ void QDeclarativeTranslate::setY(qreal y)
return;
d->y = y;
update();
- emit positionChanged();
+ emit yChanged();
}
/*!
diff --git a/src/declarative/graphicsitems/qdeclarativetranslate_p.h b/src/declarative/graphicsitems/qdeclarativetranslate_p.h
index 0207dce..b871518 100644
--- a/src/declarative/graphicsitems/qdeclarativetranslate_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetranslate_p.h
@@ -56,8 +56,8 @@ class Q_AUTOTEST_EXPORT QDeclarativeTranslate : public QGraphicsTransform
{
Q_OBJECT
- Q_PROPERTY(qreal x READ x WRITE setX NOTIFY positionChanged)
- Q_PROPERTY(qreal y READ y WRITE setY NOTIFY positionChanged)
+ Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
+ Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
public:
QDeclarativeTranslate(QObject *parent = 0);
@@ -72,7 +72,8 @@ public:
void applyTo(QMatrix4x4 *matrix) const;
Q_SIGNALS:
- void positionChanged();
+ void xChanged();
+ void yChanged();
private:
Q_DECLARE_PRIVATE(QDeclarativeTranslate)
diff --git a/src/declarative/util/qdeclarativeanimation.cpp b/src/declarative/util/qdeclarativeanimation.cpp
index 8c1c95a..6a9cf95 100644
--- a/src/declarative/util/qdeclarativeanimation.cpp
+++ b/src/declarative/util/qdeclarativeanimation.cpp
@@ -939,7 +939,7 @@ void QDeclarativePropertyAction::setTarget(QObject *o)
if (d->target == o)
return;
d->target = o;
- emit targetChanged(d->target, d->propertyName);
+ emit targetChanged();
}
QString QDeclarativePropertyAction::property() const
@@ -954,7 +954,7 @@ void QDeclarativePropertyAction::setProperty(const QString &n)
if (d->propertyName == n)
return;
d->propertyName = n;
- emit targetChanged(d->target, d->propertyName);
+ emit propertyChanged();
}
/*!
@@ -2104,7 +2104,7 @@ void QDeclarativePropertyAnimation::setTarget(QObject *o)
if (d->target == o)
return;
d->target = o;
- emit targetChanged(d->target, d->propertyName);
+ emit targetChanged();
}
QString QDeclarativePropertyAnimation::property() const
@@ -2119,7 +2119,7 @@ void QDeclarativePropertyAnimation::setProperty(const QString &n)
if (d->propertyName == n)
return;
d->propertyName = n;
- emit targetChanged(d->target, d->propertyName);
+ emit propertyChanged();
}
QString QDeclarativePropertyAnimation::properties() const
diff --git a/src/declarative/util/qdeclarativeanimation_p.h b/src/declarative/util/qdeclarativeanimation_p.h
index 59bd465..481c36c 100644
--- a/src/declarative/util/qdeclarativeanimation_p.h
+++ b/src/declarative/util/qdeclarativeanimation_p.h
@@ -197,7 +197,7 @@ class QDeclarativePropertyAction : public QDeclarativeAbstractAnimation
Q_DECLARE_PRIVATE(QDeclarativePropertyAction)
Q_PROPERTY(QObject *target READ target WRITE setTarget NOTIFY targetChanged)
- Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY targetChanged)
+ Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY propertyChanged)
Q_PROPERTY(QString properties READ properties WRITE setProperties NOTIFY propertiesChanged)
Q_PROPERTY(QDeclarativeListProperty<QObject> targets READ targets)
Q_PROPERTY(QDeclarativeListProperty<QObject> exclude READ exclude)
@@ -225,7 +225,8 @@ public:
Q_SIGNALS:
void valueChanged(const QVariant &);
void propertiesChanged(const QString &);
- void targetChanged(QObject *, const QString &);
+ void targetChanged();
+ void propertyChanged();
protected:
virtual void transition(QDeclarativeStateActions &actions,
@@ -246,7 +247,7 @@ class Q_AUTOTEST_EXPORT QDeclarativePropertyAnimation : public QDeclarativeAbstr
Q_PROPERTY(QVariant to READ to WRITE setTo NOTIFY toChanged)
Q_PROPERTY(QEasingCurve easing READ easing WRITE setEasing NOTIFY easingChanged)
Q_PROPERTY(QObject *target READ target WRITE setTarget NOTIFY targetChanged)
- Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY targetChanged)
+ Q_PROPERTY(QString property READ property WRITE setProperty NOTIFY propertyChanged)
Q_PROPERTY(QString properties READ properties WRITE setProperties NOTIFY propertiesChanged)
Q_PROPERTY(QDeclarativeListProperty<QObject> targets READ targets)
Q_PROPERTY(QDeclarativeListProperty<QObject> exclude READ exclude)
@@ -292,7 +293,8 @@ Q_SIGNALS:
void toChanged(QVariant);
void easingChanged(const QEasingCurve &);
void propertiesChanged(const QString &);
- void targetChanged(QObject *, const QString &);
+ void targetChanged();
+ void propertyChanged();
};
class Q_AUTOTEST_EXPORT QDeclarativeColorAnimation : public QDeclarativePropertyAnimation
diff --git a/src/gui/graphicsview/qgraphicstransform.cpp b/src/gui/graphicsview/qgraphicstransform.cpp
index 4ab6975..986bee6 100644
--- a/src/gui/graphicsview/qgraphicstransform.cpp
+++ b/src/gui/graphicsview/qgraphicstransform.cpp
@@ -267,6 +267,7 @@ void QGraphicsScale::setXScale(qreal scale)
return;
d->xScale = scale;
update();
+ emit xScaleChanged();
emit scaleChanged();
}
@@ -293,6 +294,7 @@ void QGraphicsScale::setYScale(qreal scale)
return;
d->yScale = scale;
update();
+ emit yScaleChanged();
emit scaleChanged();
}
@@ -319,6 +321,7 @@ void QGraphicsScale::setZScale(qreal scale)
return;
d->zScale = scale;
update();
+ emit zScaleChanged();
emit scaleChanged();
}
diff --git a/src/gui/graphicsview/qgraphicstransform.h b/src/gui/graphicsview/qgraphicstransform.h
index 58b201a..d8c9654 100644
--- a/src/gui/graphicsview/qgraphicstransform.h
+++ b/src/gui/graphicsview/qgraphicstransform.h
@@ -85,9 +85,9 @@ class Q_GUI_EXPORT QGraphicsScale : public QGraphicsTransform
Q_OBJECT
Q_PROPERTY(QVector3D origin READ origin WRITE setOrigin NOTIFY originChanged)
- Q_PROPERTY(qreal xScale READ xScale WRITE setXScale NOTIFY scaleChanged)
- Q_PROPERTY(qreal yScale READ yScale WRITE setYScale NOTIFY scaleChanged)
- Q_PROPERTY(qreal zScale READ zScale WRITE setZScale NOTIFY scaleChanged)
+ Q_PROPERTY(qreal xScale READ xScale WRITE setXScale NOTIFY xScaleChanged)
+ Q_PROPERTY(qreal yScale READ yScale WRITE setYScale NOTIFY yScaleChanged)
+ Q_PROPERTY(qreal zScale READ zScale WRITE setZScale NOTIFY zScaleChanged)
public:
QGraphicsScale(QObject *parent = 0);
~QGraphicsScale();
@@ -108,6 +108,9 @@ public:
Q_SIGNALS:
void originChanged();
+ void xScaleChanged();
+ void yScaleChanged();
+ void zScaleChanged();
void scaleChanged();
private:
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
index 442ba9f..16a7e10 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
index a9ff20f..116ce88 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
index 157bb99..13896d4 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
index 8c49acb..5d18003 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
index eb2bf54..cd3387f 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
new file mode 100644
index 0000000..9f31c69
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
index 9595a5c..06d32b6 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml
@@ -6,409 +6,437 @@ VisualTest {
}
Frame {
msec: 16
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 32
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 48
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 64
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 80
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 96
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 112
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 128
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 144
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 160
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 176
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 192
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 208
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 224
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 240
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 256
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 272
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 288
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 304
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 320
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 336
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 352
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 368
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 384
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 400
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 416
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 432
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 448
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 464
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 480
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 496
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 512
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 528
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 544
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 560
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 576
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 592
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 608
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 624
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 640
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 656
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 672
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 688
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 704
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 720
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 736
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 752
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 768
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 784
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 800
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 816
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 832
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 848
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 864
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 880
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
}
Frame {
msec: 896
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "01b9c877f51b878ed262943aedcf89b4"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 623; y: 222
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 621; y: 222
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 912
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "1c2d4a99e7e2f5e945c05857d6a463a2"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 609; y: 230
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 928
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "d69c0678ce2025a8921b089311d219ea"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 583; y: 248
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 944
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "55a852b268151d660e4945da88b04022"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 559; y: 258
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 960
image: "test-pathview.0.png"
}
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 547; y: 264
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 547; y: 264
+ modifiers: 0
+ sendToViewport: true
+ }
Frame {
msec: 976
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "55ab61911405e762b39b38d1371ef845"
}
Frame {
msec: 992
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "be3de45165f2f0916f734fecf3f48c47"
}
Frame {
msec: 1008
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "0a523daec6b591a2b5030c6c0b95cb24"
}
Frame {
msec: 1024
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "22da168e523fa385cce1f2e6a05e1332"
}
Frame {
msec: 1040
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "464cb37780cf126df6dad4169445c7bc"
}
Frame {
msec: 1056
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "666b06a0fbe2d10fbf3e15883a166c60"
}
Frame {
msec: 1072
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "223732cd526e09155ca99c80780bc3fa"
}
Frame {
msec: 1088
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "c74cc48188b05c5426a6b955ed9f09a3"
}
Frame {
msec: 1104
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "8d09a95ab09f87277fcc727e9c5da0fb"
}
Frame {
msec: 1120
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "71b7d4ec45270158ba4ca96817d8f231"
}
Frame {
msec: 1136
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
- }
- Mouse {
- type: 2
- button: 1
- buttons: 1
- x: 734; y: 177
- modifiers: 0
- sendToViewport: true
+ hash: "4847a1e7d792ed58e3476112b02c6fab"
}
Frame {
msec: 1152
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
+ hash: "ef444a3a960bdc176e004b949e5c89ce"
}
Frame {
msec: 1168
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 732; y: 177
- modifiers: 0
- sendToViewport: true
+ hash: "1ebf4badb7f4ef3938868a74740fcbce"
}
Frame {
msec: 1184
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 726; y: 179
- modifiers: 0
- sendToViewport: true
+ hash: "022918cd4b54750b0ad28bcb00108f51"
}
Frame {
msec: 1200
- hash: "89bb697bb7b7fab38d3ff56e23e43959"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 716; y: 183
- modifiers: 0
- sendToViewport: true
+ hash: "1ea398b2b7c52b35981c98b60d5d7a02"
}
Frame {
msec: 1216
- hash: "42c141399fda1cbb2ae117788d87092a"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 700; y: 190
- modifiers: 0
- sendToViewport: true
+ hash: "05d7619ed0154fa414686522a7ca86c4"
}
Frame {
msec: 1232
- hash: "4d44343eb91838e3eb73e2e5326b5ac2"
+ hash: "03274e26ea57d1264f21d306533476ef"
}
Frame {
msec: 1248
- hash: "4d44343eb91838e3eb73e2e5326b5ac2"
+ hash: "5109372d6c62225aaf971aa53c708bee"
+ }
+ Frame {
+ msec: 1264
+ hash: "71f10446437963eccb87dd40c172118f"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 708; y: 240
+ modifiers: 0
+ sendToViewport: true
}
Mouse {
type: 5
button: 0
buttons: 1
- x: 677; y: 200
+ x: 707; y: 240
modifiers: 0
sendToViewport: true
}
Frame {
- msec: 1264
- hash: "15aaccb4f7961a4e3e6fe57260779d00"
+ msec: 1280
+ hash: "e47426491548162622f9a281c3d062ec"
}
Mouse {
type: 5
button: 0
buttons: 1
- x: 651; y: 209
+ x: 685; y: 252
modifiers: 0
sendToViewport: true
}
Frame {
- msec: 1280
- hash: "5628fa3ac9893f5c9690013aad4b881a"
+ msec: 1296
+ hash: "e889fba64d9f94fe18c3750dd6ad9d00"
}
Mouse {
type: 5
button: 0
buttons: 1
- x: 619; y: 219
+ x: 635; y: 264
modifiers: 0
sendToViewport: true
}
Frame {
- msec: 1296
- hash: "384db58b6de773ac39ae81e6af4d547d"
+ msec: 1312
+ hash: "7fe200757a6bf752906d195fe341be14"
}
Mouse {
type: 5
button: 0
buttons: 1
- x: 579; y: 229
+ x: 569; y: 280
modifiers: 0
sendToViewport: true
}
Frame {
- msec: 1312
- hash: "2a15a27a138b9d3d646b827d026e8843"
+ msec: 1328
+ hash: "aa1f4147dc3fd66f6d9e2605d0759951"
}
Mouse {
type: 5
button: 0
buttons: 1
- x: 535; y: 237
+ x: 533; y: 294
modifiers: 0
sendToViewport: true
}
@@ -416,157 +444,193 @@ VisualTest {
type: 3
button: 1
buttons: 0
- x: 535; y: 237
+ x: 533; y: 294
modifiers: 0
sendToViewport: true
}
Frame {
- msec: 1328
- hash: "098176f48a148eb2bc5ef67c307baa1c"
- }
- Frame {
msec: 1344
- hash: "f838ab4301bf9d3106cec529f855cecd"
+ hash: "2b7163ea45860cf81f208c2b68c418b5"
}
Frame {
msec: 1360
- hash: "9725322067a04f83717b059d4970d610"
+ hash: "a89bd1204fb17d9d8ce7b7f4279e9b1f"
}
Frame {
msec: 1376
- hash: "3605cfbebc3a9eb4460efb2d4b9b6da2"
+ hash: "683e52637fd5d96ded35f5ade9679822"
}
Frame {
msec: 1392
- hash: "4503a368d8db25d112503dbc3934541d"
+ hash: "2aa16f06e8bed201746558b1003f7d63"
}
Frame {
msec: 1408
- hash: "80894cc06c82264bf527398ea235da12"
+ hash: "f2e40e75ddb8004917ae5b8cf144a322"
}
Frame {
msec: 1424
- hash: "d4f9b90f886fc667309b33c9a296410c"
+ hash: "0f7f64373b065a454c02c32c52a5ef79"
}
Frame {
msec: 1440
- hash: "889d01025cff679b61bff182a1ac9cbc"
+ hash: "fb4fbd2b3696bfb6135797b1f0158b5c"
}
Frame {
msec: 1456
- hash: "6147bc4455e7cb5ae55cd47be8dc4ad6"
+ hash: "7a8eafad65ff191a97dcf910393ba4e4"
}
Frame {
msec: 1472
- hash: "ddd10a294eb6b19698c4e9fe4f1508fe"
+ hash: "3362deae62ba96853d85827f21cec589"
}
Frame {
msec: 1488
- hash: "748e8d9c1971f6258acee5133b7f114b"
+ hash: "0653838fa3fb5b32e561adc20becc9d2"
}
Frame {
msec: 1504
- hash: "1ef3f32ec9ef950588266bacbe3554a0"
+ hash: "482e78e6b54cabe007f7e7f4f27a07ee"
}
Frame {
msec: 1520
- hash: "57853ff47b65aba9e76f90b2efec4f8f"
+ hash: "b51f60864896808c6e41d8a0a990676d"
}
Frame {
msec: 1536
- hash: "3985fea21d89d223c1461d5e96364c76"
+ hash: "d77e59d69b7c21c82bce9a25d548358c"
}
Frame {
msec: 1552
- hash: "cb5f6a3caeeaed12e91efe43867f2c1f"
+ hash: "b3dddbb1eee0e2f222434511073c4620"
}
Frame {
msec: 1568
- hash: "cdd4176776d5969373e0fc9a117e3c87"
+ hash: "d5e0d191582291b269b9e93241d9ac03"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 637; y: 218
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 621; y: 240
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 613; y: 248
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 1584
- hash: "3bac2e7506472db2ae11734240f1c3f4"
+ hash: "8c12000da88abb70cbc370d2a2ca21d7"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 551; y: 288
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 551; y: 288
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 1600
- hash: "bb572659d79ebda7134c039e40cf2633"
+ hash: "2854533fd50f5ebb8fc43cf0041883e4"
}
Frame {
msec: 1616
- hash: "e610181bfa17a85281f9c7417088f04f"
+ hash: "0b3782e842a6c54585d6a266314025d8"
}
Frame {
msec: 1632
- hash: "eb23ff021909589b6d8ce47ebff2c3ed"
+ hash: "02409885b82ebac931df18d8e23238d7"
}
Frame {
msec: 1648
- hash: "c321dda3878c4b97cc63246c47368224"
+ hash: "edcbd91ad267c125c431367be3e4a8a3"
}
Frame {
msec: 1664
- hash: "6a65cdfd50e1455356040d4cbc09905e"
+ hash: "47641fd7ec919b3c041c5acc04b0d083"
}
Frame {
msec: 1680
- hash: "f2a44b12e4e5bae8283c4d227949e4e8"
+ hash: "ea8f026fee0fba2c27a8df1e1e531acb"
}
Frame {
msec: 1696
- hash: "55418d661f3257b5b79a7dbb172b5b70"
+ hash: "e2e8a398760be380f9b2b7dbcb03c0e8"
}
Frame {
msec: 1712
- hash: "483d7111c86951918746d6ebe0dd9655"
+ hash: "a1767f2e10f9ab87050ef246a4a29bbb"
}
Frame {
msec: 1728
- hash: "85c83ac3a294a9320bb04a6721ecf7d5"
+ hash: "f60cccf793bd6d356d69b1394638a201"
}
Frame {
msec: 1744
- hash: "0d658b897b8e03397ddd8ffe475c2fc0"
+ hash: "31dc8c50a99164c19445a089223c8813"
}
Frame {
msec: 1760
- hash: "6ed9d7ea344b3c1b1d9196ee36b2f89a"
+ hash: "78ff726b7da5ba03fa74f66b39bf1006"
}
Frame {
msec: 1776
- hash: "6a1e7f6c03769c2c88e6343fb6c1a2a4"
+ hash: "6f8a540dccf7182f6aed8903a0afb109"
}
Frame {
msec: 1792
- hash: "9dc51f46e072eac4494d7318f2ecb39b"
+ hash: "c914c500507b9c7180dcf25e985135e9"
}
Frame {
msec: 1808
- hash: "59e833981c3fcd8a71f4a16d1c454b3a"
+ hash: "39702ce38bcfca46ef3a8dbb7299c725"
}
Frame {
msec: 1824
- hash: "29b953efdda00548d8cf6fb49fa60d13"
+ hash: "969b71ee88a1d244e62af1cecc105234"
}
Frame {
msec: 1840
- hash: "fd4611f703f94ebefcc64781993ca85c"
+ hash: "11c8397fb9d7b993761b08ba8c9958e5"
}
Frame {
msec: 1856
- hash: "aa4789ede618963157b40f099ce84987"
+ hash: "79ad4a90ab449e3232db993b30786d89"
}
Frame {
msec: 1872
- hash: "8a326b46ec536a67626ee2d2bc06aa9f"
+ hash: "daf979fd50e0860bf30f377a059d89dc"
}
Frame {
msec: 1888
- hash: "011ff557672d47591e4f0f5c5ee418f1"
+ hash: "5412e7524dc22e8064c8a8c684092802"
}
Frame {
msec: 1904
- hash: "d72fba857bdc128ddcb5971b86aadcb2"
+ hash: "2c3bea8bf10ecf6c19b93e94cb7ac0ea"
}
Frame {
msec: 1920
@@ -574,807 +638,919 @@ VisualTest {
}
Frame {
msec: 1936
- hash: "49182b7ae9ef5fb4b9234969abd05960"
+ hash: "bbfa2f8aaab0abaff9d771d5ec546d96"
}
Frame {
msec: 1952
- hash: "53de60f682574b7a9e6ffaee175fc9ff"
+ hash: "be2811bf369bc9dd8c5d9deec3b84788"
}
Frame {
msec: 1968
- hash: "2de74fe5b8848c5c781b796146871f45"
+ hash: "779838915f48eb917d36c3f2b65eedae"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 595; y: 236
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 565; y: 256
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 1984
- hash: "33c87146d8c24dd9c2271d16a8ff5b53"
+ hash: "d20b5fe14b47dfb1e73f8ef44802da11"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 507; y: 286
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 2000
- hash: "fdb29214e20d744d9776907061f50358"
+ hash: "5312dd1f9d309ab5134b8bb67685488e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 461; y: 288
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 461; y: 288
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 2016
- hash: "8c7c920416c9b775e790e6da24c32927"
+ hash: "8d6b6cbb74cc654bc5aff10a807dd3cb"
}
Frame {
msec: 2032
- hash: "86b456059e4701379447fffaf9e072f0"
+ hash: "dee717869177d1de4a26599b120f1c3d"
}
Frame {
msec: 2048
- hash: "f92cc485ee03ef5bce3c4cdc35e00318"
+ hash: "2b2c60f42024784ceed5c68505dfa5ca"
}
Frame {
msec: 2064
- hash: "2fad58883cb20273cfd79ebca345a66d"
+ hash: "1a6a108fd6cf607ec08dbedd804d12f7"
}
Frame {
msec: 2080
- hash: "84505ebbc6e12817f11f64aa6f61a0bf"
+ hash: "10bc4d0a1dc400fedc9a68b68c6525fd"
}
Frame {
msec: 2096
- hash: "ded83cacb89838cc0f3ba14bcc69b66b"
+ hash: "dc6a4abfbfb38e90af2308320d0f795b"
}
Frame {
msec: 2112
- hash: "5bb37e75bb45eaa6067c604b83ae13d7"
+ hash: "82c61d8461001c19af7c2b458d427e0b"
}
Frame {
msec: 2128
- hash: "4ee9e4c90c40dbc25a0ce884d9c2c37f"
+ hash: "e455d9ccffedaa708532bb69ad15871e"
}
Frame {
msec: 2144
- hash: "cb7148ff6f611038c29af36c8552b8c2"
+ hash: "b9c6169ad08724fc70df30668dfe7509"
}
Frame {
msec: 2160
- hash: "a591d8cb42570272dd264d5f1ce595ab"
+ hash: "a3fe5862be470470854d4157c1c027db"
}
Frame {
msec: 2176
- hash: "4e61657405d32dbcd39d3637f8af0958"
+ hash: "6a3804bd5f4fd5f1c424615ceb620525"
}
Frame {
msec: 2192
- hash: "9c7c1411dd5d3c1c8fb78e63e14061fe"
+ hash: "df0d72248310654a9cf47e707fe9e414"
}
Frame {
msec: 2208
- hash: "ae83a37e99b578fa0872ed6bc2776bc0"
+ hash: "beb19f2b2979ab40b5ccf8c0fbe9b72f"
}
Frame {
msec: 2224
- hash: "e8cb5a8a40c1e78c87c616f77d8de270"
+ hash: "be3449b49048b764bea68a76baa0fc75"
}
Frame {
msec: 2240
- hash: "9df093e4bcfa32be5924a0ca70bdaa3b"
+ hash: "4a615cae9c8f85e7b8aecd4c9014f1eb"
}
Frame {
msec: 2256
- hash: "40c358066d508143bee1446d12fe7b89"
+ hash: "b3c274f1a9d65684c0a55a544bf77810"
}
Frame {
msec: 2272
- hash: "a929ed6efc7fc68b38635f3c74242f52"
+ hash: "31456b01fcfb60a77d2b9662c2fff7b6"
}
Frame {
msec: 2288
- hash: "86ff721a3178b689ea47b6bc274a2b41"
+ hash: "2be5cf3f6158bf09659acc68b134846f"
}
Frame {
msec: 2304
- hash: "ed1f680f6d05f54ceb75c9bae3a0716a"
+ hash: "5f9c725a11305f3e6c48ab332faabf50"
}
Frame {
msec: 2320
- hash: "3f09a565df2beb51f366a1b3fb6adfe9"
+ hash: "277c2733c7245d045665198984b74224"
}
Frame {
msec: 2336
- hash: "13468347bd26bab60f1db826fb17631c"
+ hash: "265b8342bc747fb43a5291df0f4ce48b"
}
Frame {
msec: 2352
- hash: "9f7d085fea5788a457098973f17c36cb"
+ hash: "803b49ec31955b481009a51c64bcce65"
}
Frame {
msec: 2368
- hash: "4114b93246155b3434200831b2995330"
+ hash: "a717b30ad50746cdf0fae82212ac88f0"
}
Frame {
msec: 2384
- hash: "487171bd1430f74e3d51b5e215c34b5c"
+ hash: "65f46c8e69f24d060b5da6f866867f51"
}
Frame {
msec: 2400
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "52f9e5d1106d00a950470076a50e4239"
}
Frame {
msec: 2416
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "058a787aae2845308e68bb93f6a811e4"
}
Frame {
msec: 2432
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "621985111c25994c0c0fe3635be67c1d"
}
Frame {
msec: 2448
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2949b8185cefbaaf587a043d805cc670"
}
Frame {
msec: 2464
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "d4a03127ae5047184c736617deeac92d"
}
Frame {
msec: 2480
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "876c6c5ac4500de6234423bf6f3511d6"
}
Frame {
msec: 2496
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "eb08aa172cfbdb696b6f672dfa7b6fff"
}
Frame {
msec: 2512
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "a60c13b8f46faa0a35dbb539010550d4"
}
Frame {
msec: 2528
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "c6f8786506e0326a5734ab8aea782f95"
}
Frame {
msec: 2544
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "a49927f2aae24e692fc379f0ab6f4ee9"
}
Frame {
msec: 2560
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2f1a2d50e1090b34ad1ea6a36eec4fe0"
}
Frame {
msec: 2576
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "a5ee24d37be960a88684748b73dc75fe"
}
Frame {
msec: 2592
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "28682389395b47ae33ceec1ba3beef4e"
}
Frame {
msec: 2608
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "1869667b50b76d99716dd0d7849901fa"
}
Frame {
msec: 2624
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2806ee1005193f55825aa6147583985f"
}
Frame {
msec: 2640
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "c00589dce90e3ab2f2c8890f30f80d3d"
}
Frame {
msec: 2656
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "1f1881f0a29525e380ecbcce15499fa4"
}
Frame {
msec: 2672
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2a4c3ff764545a3899c864680f22f0a3"
}
Frame {
msec: 2688
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2704
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2720
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2736
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2752
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2768
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2784
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2800
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2816
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2832
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2848
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2864
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "2685820514ce5d5729f3761b1eaa1682"
}
Frame {
msec: 2880
image: "test-pathview.2.png"
}
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 310; y: 277
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 324; y: 279
+ modifiers: 0
+ sendToViewport: true
+ }
Frame {
msec: 2896
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "ce00c77e8ff1768b41f5585344af1c58"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 330; y: 281
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 2912
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "24f401275fa6ec7d26234609792fe0b8"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 346; y: 283
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 2928
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "d3c74863c627a1b922a6b6c4a24f8c40"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 358; y: 285
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 358; y: 285
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 2944
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "64a3209e6adc737065e5d5c3202a7283"
}
Frame {
msec: 2960
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "cf936ffe4330edefddb31c59368491fc"
}
Frame {
msec: 2976
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "a67213db044bb876f737cd355fe54444"
}
Frame {
msec: 2992
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "0f9e97057cbbd8071e0f5f61318bdf9c"
}
Frame {
msec: 3008
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "c5f38d334df86ebb6ac4600c83eced20"
}
Frame {
msec: 3024
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "6d8e6049a36eac4136dbdb5fb18d0650"
}
Frame {
msec: 3040
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "8ee97cff4a632e6e297bd3bdac27b8d4"
}
Frame {
msec: 3056
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "aca1fcd005d211d35245e64a44002c01"
}
Frame {
msec: 3072
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "7076180bf0eb14a5e733be9320f1f009"
}
Frame {
msec: 3088
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
- }
- Mouse {
- type: 2
- button: 1
- buttons: 1
- x: 728; y: 181
- modifiers: 0
- sendToViewport: true
+ hash: "e0a0545b3a0b6a0b07d3fa987e1d58b6"
}
Frame {
msec: 3104
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "0294b098ce7f0d381542776320e52d2e"
}
Frame {
msec: 3120
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
+ hash: "36f8bcc42add38fe149e34a703cf8a02"
}
Frame {
msec: 3136
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 727; y: 181
- modifiers: 0
- sendToViewport: true
+ hash: "631426bde50fd35d1da1c30d9878253e"
}
Frame {
msec: 3152
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 723; y: 181
- modifiers: 0
- sendToViewport: true
+ hash: "a4d64c9d378138bedf63389e58d8f1d6"
}
Frame {
msec: 3168
- hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 717; y: 184
- modifiers: 0
- sendToViewport: true
+ hash: "17fdf61bffd947c2e9898f5c4517fdf8"
}
Frame {
msec: 3184
- hash: "6dcec6cdaa35eba74607ba64d6ea2ec0"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 705; y: 188
- modifiers: 0
- sendToViewport: true
+ hash: "653b8c7a55bc4ca763238098711eafa1"
}
Frame {
msec: 3200
- hash: "16b7b4847fe86b25d8d6136106a4c400"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 686; y: 197
- modifiers: 0
- sendToViewport: true
+ hash: "89e15b3ee1b1fc945801e08cfcdba62c"
}
Frame {
msec: 3216
- hash: "d946d55b19c99fa25bf1c04f2b71026a"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 661; y: 207
- modifiers: 0
- sendToViewport: true
+ hash: "7ea615af67336895e6cee6d3a39ff7de"
}
Frame {
msec: 3232
- hash: "96f40f5071365cde769c733fd1ef5a24"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 626; y: 221
- modifiers: 0
- sendToViewport: true
+ hash: "88faee45db80f04ef1120c35057a5f7d"
}
Frame {
msec: 3248
- hash: "7004058b95b7eab3ebba5c80c0923982"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 582; y: 235
- modifiers: 0
- sendToViewport: true
+ hash: "8cfe34047b29ac85e58d55e0f6e0b195"
}
Frame {
msec: 3264
- hash: "2c78880237c414182f97f1709f1eef0f"
- }
- Mouse {
- type: 5
- button: 0
- buttons: 1
- x: 532; y: 246
- modifiers: 0
- sendToViewport: true
+ hash: "39255546502fcb882005fe4c38c21fb0"
}
Frame {
msec: 3280
- hash: "c90a15ec9f88008ca8b0ec0185444d71"
- }
- Mouse {
- type: 3
- button: 1
- buttons: 0
- x: 532; y: 246
- modifiers: 0
- sendToViewport: true
+ hash: "6bf7a959a05fc27f651b2a3ba07de30d"
}
Frame {
msec: 3296
- hash: "c90a15ec9f88008ca8b0ec0185444d71"
+ hash: "c2c61cb8dbbbd38827277ab32579c6da"
}
Frame {
msec: 3312
- hash: "36461e2a4cd860cac32223b8ee73c657"
+ hash: "ff370d4b4e44c4cbacca96107105df21"
}
Frame {
msec: 3328
- hash: "5f9b3ad9202fb02a4c6fea28c248ad22"
+ hash: "ccadd9e070d54de21c76397d18ad3de8"
}
Frame {
msec: 3344
- hash: "d0d23c4e1ddb2d9ffa0ecc38030ae15c"
+ hash: "6302c39de00070b0a23f9dc87f74dd8d"
}
Frame {
msec: 3360
- hash: "8e2e2d3eaf557c453f34016b6614e495"
+ hash: "7ab69e6d9809c78dc723609bd2761206"
}
Frame {
msec: 3376
- hash: "7402c747fa7276293a0a72d48d342782"
+ hash: "c429cc724b39891805cf4c1448de60b3"
}
Frame {
msec: 3392
- hash: "6090c30e4d722a32c083a25171fb11ff"
+ hash: "396ddf0b01e9fe7c2bfb220e64a0c7ec"
}
Frame {
msec: 3408
- hash: "f770d940cf287fec4b0803f7310292a8"
+ hash: "7a519a4efeecef5e7623a270e458fb13"
}
Frame {
msec: 3424
- hash: "558e4ce32df69357b70a8285b00fe347"
+ hash: "869d174a939e0638a1a22d5c8a010c14"
}
Frame {
msec: 3440
- hash: "8814168503c9a72ea8d3fa1e503f33d9"
+ hash: "9ecd2cf4e3b42ff93bcbf4db9829666c"
}
Frame {
msec: 3456
- hash: "6f5513d22e545096fadc6f5c4112902e"
+ hash: "b06b58b250d3df365806a3f8991d57f3"
}
Frame {
msec: 3472
- hash: "43f11d8ac16fd3e8199e555528817e14"
+ hash: "7a6fb03feb2ae0af1f143daedd22a88b"
}
Frame {
msec: 3488
- hash: "d64bafdbd26878a323dae918d5e0a36d"
+ hash: "e9fe338dbe7afb69f3870743b0a18805"
}
Frame {
msec: 3504
- hash: "1c70bdddfc3751ae3864f008170f8b06"
+ hash: "04b8def2085e9ce4065b02b938915557"
}
Frame {
msec: 3520
- hash: "bb7a18691fcd371e9d382b5bba4a0573"
+ hash: "7e6942f72012875ba83a1c9121e1f786"
}
Frame {
msec: 3536
- hash: "547e15f5dea2d9aa3ed44640b25028b9"
+ hash: "291e2d79a79959d9c8c586b6bdc31689"
}
Frame {
msec: 3552
- hash: "c11b86a256fac6be10b9a54564903d6f"
+ hash: "e490bc7fd92f486b964cca967bd33b38"
}
Frame {
msec: 3568
- hash: "0ada2dc586894d5e37de2632d2b37b15"
+ hash: "0c9858e0445e25d2b12c84801de441cb"
}
Frame {
msec: 3584
- hash: "0ae1a39ea196a0e734d80dbdea67b285"
+ hash: "72ba7a4aacb150e1e9c6de72cff82258"
}
Frame {
msec: 3600
- hash: "3cb70e64f9ab8aad841326dc2d2f1615"
+ hash: "1daca95256842545a5b77bcc46782478"
}
Frame {
msec: 3616
- hash: "a8f8b5ff19df9163ea628b589b675a5e"
+ hash: "869f3d16e203ad47f1ae7ca83e369b75"
}
Frame {
msec: 3632
- hash: "26fcc73f477db0ea731bc18b00b4c791"
+ hash: "9cc9cb20aab3369f4e3c5259d291708c"
}
Frame {
msec: 3648
- hash: "8702e49f3f26e1e21970e78c8aa4040a"
+ hash: "a507b957bab3efe2023a65f8c8b3540a"
}
Frame {
msec: 3664
- hash: "1a482a39d02779d8733e348b713f2312"
+ hash: "9fce2a6cddd8b06a80ce16599b56caa6"
}
Frame {
msec: 3680
- hash: "c728cc4a8e4d0a8d983514f86a92eae0"
+ hash: "2f85d3064968e3e7b669f733fad58459"
}
Frame {
msec: 3696
- hash: "82360ab373b08bf6a5d9e9ea9d0d18aa"
+ hash: "6dd6fad85dc5317a22a05a8486317767"
}
Frame {
msec: 3712
- hash: "6231a4bce6cfc1e26a9606cc041acdbc"
+ hash: "b0faa2ec225cd96fb6d2fd05dc66bed1"
}
Frame {
msec: 3728
- hash: "6e3b48862fc749f15aa2dec1c17d1de0"
+ hash: "3188219f095c2a9ac7c0f6034463d769"
}
Frame {
msec: 3744
- hash: "6c9e79a5692a3810b2a9058790f54cd7"
+ hash: "b269e9fe4d14537c8bef0b66effe7319"
}
Frame {
msec: 3760
- hash: "0652c67fedda0d5e55858ddefff2da9e"
+ hash: "b269e9fe4d14537c8bef0b66effe7319"
}
Frame {
msec: 3776
- hash: "3b058c0efeb3a9da54a1de72a1792a83"
+ hash: "b269e9fe4d14537c8bef0b66effe7319"
}
Frame {
msec: 3792
- hash: "96e6fb39c8dbfe4a00bf116bf80aac4d"
+ hash: "b269e9fe4d14537c8bef0b66effe7319"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 174; y: 234
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 3808
- hash: "979c0c78c41e0f337cfe1b384fbbe51a"
+ hash: "9480eb8761d4ce90971903fcfab1e09e"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 176; y: 236
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 3824
- hash: "8be0d6987a6d12864f30336b249e4b16"
+ hash: "30a6ac631e1a3433f252f56ee4337cdc"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 179; y: 238
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 3840
image: "test-pathview.3.png"
}
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 184; y: 243
+ modifiers: 0
+ sendToViewport: true
+ }
Frame {
msec: 3856
- hash: "31e665f804a52a4dc88eab5dba78ae5a"
+ hash: "ed07f9eea6cd2cd78a3e2479137f843d"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 185; y: 244
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 3872
- hash: "b7d4cf5a6a3ac79da3be101b50b38bc2"
+ hash: "7a5b201cc8725dbf15d89907fffd4ee3"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 197; y: 250
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 3888
- hash: "559b1b8467b611cdeb7f2ae660e3bf51"
+ hash: "bc2433b9e5f03cdbd35922d145a4ce59"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 213; y: 256
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 213; y: 256
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 3904
- hash: "66abb5af85e793569382efb04744d0de"
+ hash: "d443f23aa5449d5f2b11c47feab5a0ae"
}
Frame {
msec: 3920
- hash: "b64eff8bbea5a953d146333363825724"
+ hash: "c43f00d3ae4c8abbd20fc7157363b19d"
}
Frame {
msec: 3936
- hash: "47b794c971c4d47baf15e1d63d65ac03"
+ hash: "22d6f5e9fdfe44e73020e6f504002b7c"
}
Frame {
msec: 3952
- hash: "b3882fa14f3cb7428c660737656d7ea2"
+ hash: "4a9a285834aad5795adbefbe167028e2"
}
Frame {
msec: 3968
- hash: "a6bd71c7d3a0f3f53674ea8e1334e560"
+ hash: "561a6c005950830acf2a45ab9a207346"
}
Frame {
msec: 3984
- hash: "0926d3cd53aabb789686e34d91ef23dc"
+ hash: "b0387e3cfd455e1144d0bce9b51d6767"
}
Frame {
msec: 4000
- hash: "914c4fa7264111b4a42c82a60701d652"
+ hash: "610237f67aa7e5f8d5b363b1612b4966"
}
Frame {
msec: 4016
- hash: "84c1fa22440a61126b79c38605b6f9ca"
+ hash: "8034a5a7e0558d73051ea6c5bc750866"
}
Frame {
msec: 4032
- hash: "b684fcf9f4725cfc02af0187454dfaf8"
+ hash: "0e4dc8a9c124b51c5f1225f4c6a9ec63"
}
Frame {
msec: 4048
- hash: "2e94c1ca74af4eb836a0c505d131f263"
+ hash: "dc4e94522e8c64e9f2dbbf12a1f1aa3e"
}
Frame {
msec: 4064
- hash: "5f04912674e1bcdb16176976d10ce995"
+ hash: "7466c076a95f2f6bbc2b6ce306773337"
}
Frame {
msec: 4080
- hash: "aaf0bcef4a15aa1c699eaa1ce817c8ed"
+ hash: "787e2749905b97159fd0922c6cb388e2"
}
Frame {
msec: 4096
- hash: "97fd5bdcfa367191fbd3689658ab3273"
+ hash: "1e510d01afad190ec21de253bd8b4821"
}
Frame {
msec: 4112
- hash: "d76d6c59411636a0e9ac2e0c847b3fe3"
+ hash: "d740f40eb21be71ec70c00411d2ee76b"
}
Frame {
msec: 4128
- hash: "9cb88a76c962623b1a9cf4e7093d6e54"
+ hash: "887a6f445af8fccf4932eed575a09cbb"
}
Frame {
msec: 4144
- hash: "ec3d7075680296905b1bdd6fdd9fcc40"
+ hash: "fbb7e1d8cb9dd9016df0c33c69b1451a"
}
Frame {
msec: 4160
- hash: "43c70dabc45ed059e8b876eb2ba5c66e"
+ hash: "5025e5f04a0807cb298037d6dda8c3af"
}
Frame {
msec: 4176
- hash: "8f97ca5c3092a20009c5d00139105a22"
+ hash: "b9924f24f60c24087be165e8e385ebb0"
}
Frame {
msec: 4192
- hash: "d0f225d4b03495218f7916698e254338"
+ hash: "2bab970787ac8b056401c8a73cb1a3c5"
}
Frame {
msec: 4208
- hash: "f8725467353a8f27bc5570af157c93c7"
+ hash: "bda954bfafaa2915d760cf7a602b326f"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 187; y: 242
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 4224
- hash: "749c8ca5c0a7774c81805b792e6b70e3"
+ hash: "9b109bb9e786a45a78849436ea32a484"
}
Frame {
msec: 4240
- hash: "d353c4a8a5eecb1dce30f4a5b85b1ef4"
+ hash: "9b109bb9e786a45a78849436ea32a484"
}
Frame {
msec: 4256
- hash: "a7105f3f1ddace730d0b4a12a3560208"
+ hash: "9b109bb9e786a45a78849436ea32a484"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 187; y: 243
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 4272
- hash: "918f480af8a35f6074ff1e202dae2660"
+ hash: "9b109bb9e786a45a78849436ea32a484"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 199; y: 252
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 4288
- hash: "ed98d08eb30db1b41aaf2a58f3b59398"
+ hash: "cc3c61f49a7b3c395670b86c8078a337"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 223; y: 262
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 4304
- hash: "c362cf053b3749a44d1fc33483f9952b"
+ hash: "464d09b53b78fe5474d9c1d022bee9fd"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 251; y: 272
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 251; y: 272
+ modifiers: 0
+ sendToViewport: true
}
Frame {
msec: 4320
- hash: "9b01b2c771ef86ff4a8ee3f6a4676e3c"
+ hash: "aab17f48ff506cda84543cbe0d8a1ce4"
}
Frame {
msec: 4336
- hash: "70ccec3c9db95206b5589d43dcd52b13"
+ hash: "b7ba6c107f4085822a738120a913ba0c"
}
Frame {
msec: 4352
- hash: "57e7397c6aadd0d4d5c9d9d5fcdd8fde"
+ hash: "751b79e202a70dcc9a86c3a1450172b8"
}
Frame {
msec: 4368
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "bb03f969fd6987255ff113ef98ed2bb1"
}
Frame {
msec: 4384
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "c33302b366441fa2d8753d5ce314cd37"
}
Frame {
msec: 4400
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "4cdf32004382bcaca5a68cb92761caa2"
}
Frame {
msec: 4416
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "d3fe18ea7dcbee0709a2041e50b87154"
}
Frame {
msec: 4432
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "ac58a7adb0e7a354a058d7e9a7010c06"
}
Frame {
msec: 4448
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "bdf8a8934a372ab49f4b6e9c95c7f591"
}
Frame {
msec: 4464
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "d2e8b417b74ec5f6e23f0935a4d0aa98"
}
Frame {
msec: 4480
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "0f94c6ca3ffbd730c2d813a991d21ca3"
}
Frame {
msec: 4496
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "fb7728eebb2fa8f5255dc7435d20bbb6"
}
Frame {
msec: 4512
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "c8211e8adcef525c296531a3d369f717"
}
Frame {
msec: 4528
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "f24de36c85b87953977fa8b6456209dc"
}
Frame {
msec: 4544
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "9ce7cf389af08cb1ba2534418f51857b"
}
Frame {
msec: 4560
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "17d1f3ae0dba0bde222bb2483a403fbd"
}
Frame {
msec: 4576
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "1748d75e229945012ece689b3784a02c"
}
Frame {
msec: 4592
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "6786fa9e31d6f0a71a285c790aa5b008"
}
Frame {
msec: 4608
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "f2a2ba33b41d8d522e8aab34c7da8f7b"
}
Frame {
msec: 4624
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "aa53142d1b433ae9f748aef5cb7bef46"
}
Frame {
msec: 4640
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "9c6802b2b0a419a4aaf9909c0f88c66e"
}
Frame {
msec: 4656
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "206b11f2acd742d55ddd8acf7415bbeb"
}
Frame {
msec: 4672
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "36876cf600cbf9c3b15f243617c9474e"
}
Frame {
msec: 4688
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "1f5daf97294b490546657c5d9e12022e"
}
Frame {
msec: 4704
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "637fc34fc2cf6139ba8809be54a2a0fc"
}
Frame {
msec: 4720
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "9f824bd9e156980873619b1978f226bb"
}
Frame {
msec: 4736
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "7002444129a5077ce5be44a5e2530328"
}
Frame {
msec: 4752
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "42b7a44030ad4fc50ceb6a60bc97991e"
}
Frame {
msec: 4768
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "ae986cac541033398076fb918136212e"
}
Frame {
msec: 4784
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "6bdd9f764b1675e5b0feced8c2d831a6"
}
Frame {
msec: 4800
@@ -1382,114 +1558,278 @@ VisualTest {
}
Frame {
msec: 4816
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "07dfffe85adc4b52565e9ed156fa3ed6"
}
Frame {
msec: 4832
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "c987bbe9fbf74bb6cf2686a5ee97c59a"
}
Frame {
msec: 4848
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "19568159ec2282d5f150583baa0a8a94"
}
Frame {
msec: 4864
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "5b176ef6bf70ff1a9805ca85b1b0c1a2"
}
Frame {
msec: 4880
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "de716a8c15a46bf1621878794e968c53"
}
Frame {
msec: 4896
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "241af9ab77c86cdb75f73339548604ad"
}
Frame {
msec: 4912
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "afc7168ecb7fa7e3310ca818b75f7a1c"
}
Frame {
msec: 4928
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "83bff911b502a34d139a724f686bb1f9"
}
Frame {
msec: 4944
- hash: "299b24eae7720e1711744b23335bca8c"
- }
- Key {
- type: 6
- key: 16777249
- modifiers: 0
- text: ""
- autorep: false
- count: 1
+ hash: "f4d3fb54ae5be2b13065cd4316b06837"
}
Frame {
msec: 4960
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "d29c7dfedf9dd355d60e394528b3b938"
}
Frame {
msec: 4976
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "ddf23d860ea71ab4b407de1a5f913f74"
}
Frame {
msec: 4992
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "a0dbb6ecbfd08f9ebdd641fea5dae16c"
}
Frame {
msec: 5008
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "7ed3170e55e3c3c9561959ad4c56d326"
}
Frame {
msec: 5024
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "dbde5f508aabc2d1f2ccfaf135efeca9"
}
Frame {
msec: 5040
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "72039739be41bf63b3959bdc90ce25bb"
}
Frame {
msec: 5056
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "417789daefe6bc01320db7803ae31d61"
}
Frame {
msec: 5072
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "7e57dbddaf379f4316182048fa9e2d6f"
}
Frame {
msec: 5088
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "aeca9a4df94d2b9ac2a713531a7d98f1"
}
Frame {
msec: 5104
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "98ad6694f23678819020d6ac0161651c"
}
Frame {
msec: 5120
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "b6eba3872da19ec677eee419ae9cccbc"
}
Frame {
msec: 5136
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "e824909bfe7b6d54773bb218ba93e884"
}
Frame {
msec: 5152
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "3be04f3ff6d948538f4472bc6bfadb0f"
}
Frame {
msec: 5168
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "e05ff21dda1d978a2ac2eedd3826b6f7"
}
Frame {
msec: 5184
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "8ee970b2b197c8d879a7b1703cbd4dcd"
}
Frame {
msec: 5200
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "e583845e7719d2776c6362c34f77937c"
}
Frame {
msec: 5216
- hash: "299b24eae7720e1711744b23335bca8c"
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5232
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5248
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5264
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5280
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5296
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5312
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5328
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5344
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5360
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5376
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5392
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5408
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5424
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5440
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5456
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5472
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5488
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5504
+ hash: "593fd590531ccfb59d890b8043eaab9c"
+ }
+ Frame {
+ msec: 5520
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5536
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5552
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5568
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5584
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5600
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5616
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5632
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5648
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5664
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5680
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5696
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5712
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5728
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5744
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5760
+ image: "test-pathview.5.png"
+ }
+ Frame {
+ msec: 5776
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5792
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5808
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5824
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5840
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5856
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5872
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5888
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
+ }
+ Frame {
+ msec: 5904
+ hash: "c0d0f62d9078f6be493d5545a2ae78ad"
}
}
diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
index 3bcab5a..e6e1a70 100644
--- a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
+++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml
@@ -59,4 +59,9 @@ Rectangle {
PathAttribute { name: "angle"; value: 45 }
}
}
+
+ Column {
+ Rectangle { width: 20; height: 20; color: "red"; opacity: photoPathView.moving ? 1 : 0 }
+ Rectangle { width: 20; height: 20; color: "blue"; opacity: photoPathView.flicking ? 1 : 0 }
+ }
}
diff --git a/tools/qml/Info_mac.plist b/tools/qml/Info_mac.plist
index 80ca6a3..0877547 100644
--- a/tools/qml/Info_mac.plist
+++ b/tools/qml/Info_mac.plist
@@ -14,5 +14,36 @@
<string>@TYPEINFO@</string>
<key>CFBundleExecutable</key>
<string>@EXECUTABLE@</string>
+ <key>UTExportedTypeDeclarations</key>
+ <array>
+ <dict>
+ <key>UTTypeIdentifier</key>
+ <string>com.nokia.qt.qml</string>
+ <key>UTTypeDescription</key>
+ <string>Qt Markup Language</string>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.plain-text</string>
+ </array>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>qml</string>
+ </array>
+ </dict>
+ </dict>
+ </array>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>com.nokia.qt.qml</string>
+ </array>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ </dict>
+ </array>
</dict>
</plist>
diff --git a/tools/qml/content/Browser.qml b/tools/qml/browser/Browser.qml
index ff2bb47..ff2bb47 100644
--- a/tools/qml/content/Browser.qml
+++ b/tools/qml/browser/Browser.qml
diff --git a/tools/qml/browser/browser.qrc b/tools/qml/browser/browser.qrc
new file mode 100644
index 0000000..9c688e7
--- /dev/null
+++ b/tools/qml/browser/browser.qrc
@@ -0,0 +1,9 @@
+<RCC>
+ <qresource prefix="/browser">
+ <file>Browser.qml</file>
+ <file>images/up.png</file>
+ <file>images/folder.png</file>
+ <file>images/titlebar.sci</file>
+ <file>images/titlebar.png</file>
+ </qresource>
+</RCC>
diff --git a/tools/qml/content/images/folder.png b/tools/qml/browser/images/folder.png
index e53e2ad..e53e2ad 100644
--- a/tools/qml/content/images/folder.png
+++ b/tools/qml/browser/images/folder.png
Binary files differ
diff --git a/tools/qml/content/images/titlebar.png b/tools/qml/browser/images/titlebar.png
index 51c9008..51c9008 100644
--- a/tools/qml/content/images/titlebar.png
+++ b/tools/qml/browser/images/titlebar.png
Binary files differ
diff --git a/tools/qml/content/images/titlebar.sci b/tools/qml/browser/images/titlebar.sci
index 0418d94..0418d94 100644
--- a/tools/qml/content/images/titlebar.sci
+++ b/tools/qml/browser/images/titlebar.sci
diff --git a/tools/qml/content/images/up.png b/tools/qml/browser/images/up.png
index b05f802..b05f802 100644
--- a/tools/qml/content/images/up.png
+++ b/tools/qml/browser/images/up.png
Binary files differ
diff --git a/tools/qml/main.cpp b/tools/qml/main.cpp
index 4b1162e..7421b5e 100644
--- a/tools/qml/main.cpp
+++ b/tools/qml/main.cpp
@@ -56,7 +56,8 @@ QT_USE_NAMESPACE
QtMsgHandler systemMsgOutput = 0;
-
+static QDeclarativeViewer *openFile(const QString &fileName);
+static void showViewer(QDeclarativeViewer *viewer);
#if defined (Q_OS_SYMBIAN)
#include <unistd.h>
@@ -117,6 +118,11 @@ void myMessageOutput(QtMsgType type, const char *msg)
#endif
+static QDeclarativeViewer* globalViewer = 0;
+
+// The qml file that is shown if the user didn't specify a QML file
+QString initialFile = "qrc:/startup/startup.qml";
+
void usage()
{
qWarning("Usage: qmlviewer [options] <filename>");
@@ -175,135 +181,200 @@ void scriptOptsUsage()
enum WarningsConfig { ShowWarnings, HideWarnings, DefaultWarnings };
-int main(int argc, char ** argv)
+struct ViewerOptions
{
-#if defined (Q_OS_SYMBIAN)
- qInstallMsgHandler(myMessageOutput);
-#else
- systemMsgOutput = qInstallMsgHandler(myMessageOutput);
+ ViewerOptions()
+ : frameless(false),
+ fps(0.0),
+ autorecord_from(0),
+ autorecord_to(0),
+ dither("none"),
+ runScript(false),
+ devkeys(false),
+ cache(0),
+ useGL(false),
+ fullScreen(false),
+ stayOnTop(false),
+ maximized(false),
+ useNativeFileBrowser(true),
+ experimentalGestures(false),
+ warningsConfig(DefaultWarnings),
+ sizeToView(true)
+ {
+#if defined(Q_OS_SYMBIAN)
+ maximized = true;
+ useNativeFileBrowser = false;
#endif
-#if defined (Q_OS_WIN)
- // Debugging output is not visible by default on Windows -
- // therefore show modal dialog with errors instad.
- atexit(showWarnings);
+#if defined(Q_WS_MAC)
+ useGL = true;
#endif
-
-#if defined (Q_WS_X11) || defined (Q_WS_MAC)
- //### default to using raster graphics backend for now
- bool gsSpecified = false;
- for (int i = 0; i < argc; ++i) {
- QString arg = argv[i];
- if (arg == "-graphicssystem") {
- gsSpecified = true;
- break;
- }
}
- if (!gsSpecified)
- QApplication::setGraphicsSystem("raster");
-#endif
-
- QApplication app(argc, argv);
- app.setApplicationName("QtQmlViewer");
- app.setOrganizationName("Nokia");
- app.setOrganizationDomain("nokia.com");
-
-
-
- QDeclarativeViewer::registerTypes();
- QDeclarativeTester::registerTypes();
-
- bool frameless = false;
- QString fileName;
- double fps = 0;
- int autorecord_from = 0;
- int autorecord_to = 0;
- QString dither = "none";
+ bool frameless;
+ double fps;
+ int autorecord_from;
+ int autorecord_to;
+ QString dither;
QString recordfile;
QStringList recordargs;
QStringList imports;
QStringList plugins;
QString script;
QString scriptopts;
- bool runScript = false;
- bool devkeys = false;
- int cache = 0;
+ bool runScript;
+ bool devkeys;
+ int cache;
QString translationFile;
- bool useGL = false;
- bool fullScreen = false;
- bool stayOnTop = false;
- bool maximized = false;
- bool useNativeFileBrowser = true;
- bool experimentalGestures = false;
+ bool useGL;
+ bool fullScreen;
+ bool stayOnTop;
+ bool maximized;
+ bool useNativeFileBrowser;
+ bool experimentalGestures;
- WarningsConfig warningsConfig = DefaultWarnings;
- bool sizeToView = true;
+ WarningsConfig warningsConfig;
+ bool sizeToView;
-#if defined(Q_OS_SYMBIAN)
- maximized = true;
- useNativeFileBrowser = false;
-#endif
+ QDeclarativeViewer::ScriptOptions scriptOptions;
+};
-#if defined(Q_WS_MAC)
- useGL = true;
-#endif
+static ViewerOptions opts;
+static QStringList fileNames;
- for (int i = 1; i < argc; ++i) {
- bool lastArg = (i == argc - 1);
- QString arg = argv[i];
+class Application : public QApplication
+{
+ Q_OBJECT
+public:
+ Application(int &argc, char **&argv)
+ : QApplication(argc, argv)
+ {}
+
+protected:
+ bool event(QEvent *ev)
+ {
+ if (ev->type() != QEvent::FileOpen)
+ return QApplication::event(ev);
+
+ QFileOpenEvent *fev = static_cast<QFileOpenEvent *>(ev);
+
+ globalViewer->open(fev->file());
+ if (!globalViewer->isVisible())
+ showViewer(globalViewer);
+
+ return true;
+ }
+
+private Q_SLOTS:
+ void showInitialViewer()
+ {
+ QApplication::processEvents();
+
+ QDeclarativeViewer *viewer = globalViewer;
+ if (!viewer)
+ return;
+ if (viewer->currentFile().isEmpty()) {
+ if(opts.useNativeFileBrowser)
+ viewer->open(initialFile);
+ else
+ viewer->openFile();
+ }
+ if (!viewer->isVisible())
+ showViewer(viewer);
+ }
+};
+
+static void parseScriptOptions()
+{
+ QStringList options =
+ opts.scriptopts.split(QLatin1Char(','), QString::SkipEmptyParts);
+
+ QDeclarativeViewer::ScriptOptions scriptOptions = 0;
+ for (int i = 0; i < options.count(); ++i) {
+ const QString &option = options.at(i);
+ if (option == QLatin1String("help")) {
+ scriptOptsUsage();
+ } else if (option == QLatin1String("play")) {
+ scriptOptions |= QDeclarativeViewer::Play;
+ } else if (option == QLatin1String("record")) {
+ scriptOptions |= QDeclarativeViewer::Record;
+ } else if (option == QLatin1String("testimages")) {
+ scriptOptions |= QDeclarativeViewer::TestImages;
+ } else if (option == QLatin1String("testerror")) {
+ scriptOptions |= QDeclarativeViewer::TestErrorProperty;
+ } else if (option == QLatin1String("exitoncomplete")) {
+ scriptOptions |= QDeclarativeViewer::ExitOnComplete;
+ } else if (option == QLatin1String("exitonfailure")) {
+ scriptOptions |= QDeclarativeViewer::ExitOnFailure;
+ } else if (option == QLatin1String("saveonexit")) {
+ scriptOptions |= QDeclarativeViewer::SaveOnExit;
+ } else if (option == QLatin1String("snapshot")) {
+ scriptOptions |= QDeclarativeViewer::Snapshot;
+ } else {
+ scriptOptsUsage();
+ }
+ }
+
+ opts.scriptOptions = scriptOptions;
+}
+
+static void parseCommandLineOptions(const QStringList &arguments)
+{
+ for (int i = 1; i < arguments.count(); ++i) {
+ bool lastArg = (i == arguments.count() - 1);
+ QString arg = arguments.at(i);
if (arg == "-frameless") {
- frameless = true;
+ opts.frameless = true;
} else if (arg == "-maximized") {
- maximized = true;
+ opts.maximized = true;
} else if (arg == "-fullscreen") {
- fullScreen = true;
+ opts.fullScreen = true;
} else if (arg == "-stayontop") {
- stayOnTop = true;
+ opts.stayOnTop = true;
} else if (arg == "-netcache") {
if (lastArg) usage();
- cache = QString(argv[++i]).toInt();
+ opts.cache = arguments.at(++i).toInt();
} else if (arg == "-recordrate") {
if (lastArg) usage();
- fps = QString(argv[++i]).toDouble();
+ opts.fps = arguments.at(++i).toDouble();
} else if (arg == "-recordfile") {
if (lastArg) usage();
- recordfile = QString(argv[++i]);
+ opts.recordfile = arguments.at(++i);
} else if (arg == "-record") {
if (lastArg) usage();
- recordargs << QString(argv[++i]);
+ opts.recordargs << arguments.at(++i);
} else if (arg == "-recorddither") {
if (lastArg) usage();
- dither = QString(argv[++i]);
+ opts.dither = arguments.at(++i);
} else if (arg == "-autorecord") {
if (lastArg) usage();
- QString range = QString(argv[++i]);
+ QString range = arguments.at(++i);
int dash = range.indexOf('-');
if (dash > 0)
- autorecord_from = range.left(dash).toInt();
- autorecord_to = range.mid(dash+1).toInt();
+ opts.autorecord_from = range.left(dash).toInt();
+ opts.autorecord_to = range.mid(dash+1).toInt();
} else if (arg == "-devicekeys") {
- devkeys = true;
+ opts.devkeys = true;
} else if (arg == "-dragthreshold") {
if (lastArg) usage();
- app.setStartDragDistance(QString(argv[++i]).toInt());
+ qApp->setStartDragDistance(arguments.at(++i).toInt());
} else if (arg == QLatin1String("-v") || arg == QLatin1String("-version")) {
qWarning("Qt QML Viewer version %s", QT_VERSION_STR);
exit(0);
} else if (arg == "-translation") {
if (lastArg) usage();
- translationFile = argv[++i];
+ opts.translationFile = arguments.at(++i);
} else if (arg == "-opengl") {
- useGL = true;
+ opts.useGL = true;
} else if (arg == "-qmlbrowser") {
- useNativeFileBrowser = false;
+ opts.useNativeFileBrowser = false;
} else if (arg == "-warnings") {
if (lastArg) usage();
- QString warningsStr = QString(argv[++i]);
+ QString warningsStr = arguments.at(++i);
if (warningsStr == QLatin1String("show")) {
- warningsConfig = ShowWarnings;
+ opts.warningsConfig = ShowWarnings;
} else if (warningsStr == QLatin1String("hide")) {
- warningsConfig = HideWarnings;
+ opts.warningsConfig = HideWarnings;
} else {
usage();
}
@@ -316,152 +387,203 @@ int main(int argc, char ** argv)
qWarning("Current search path: %s", paths.toLocal8Bit().constData());
exit(0);
}
- imports << QString(argv[++i]);
+ opts.imports << arguments.at(++i);
} else if (arg == "-P") {
if (lastArg) usage();
- plugins << QString(argv[++i]);
+ opts.plugins << arguments.at(++i);
} else if (arg == "-script") {
if (lastArg) usage();
- script = QString(argv[++i]);
+ opts.script = arguments.at(++i);
} else if (arg == "-scriptopts") {
if (lastArg) usage();
- scriptopts = QString(argv[++i]);
+ opts.scriptopts = arguments.at(++i);
} else if (arg == "-savescript") {
if (lastArg) usage();
- script = QString(argv[++i]);
- runScript = false;
+ opts.script = arguments.at(++i);
+ opts.runScript = false;
} else if (arg == "-playscript") {
if (lastArg) usage();
- script = QString(argv[++i]);
- runScript = true;
+ opts.script = arguments.at(++i);
+ opts.runScript = true;
} else if (arg == "-sizeviewtorootobject") {
- sizeToView = false;
+ opts.sizeToView = false;
} else if (arg == "-sizerootobjecttoview") {
- sizeToView = true;
+ opts.sizeToView = true;
} else if (arg == "-experimentalgestures") {
- experimentalGestures = true;
- } else if (arg[0] != '-') {
- fileName = arg;
- } else if (1 || arg == "-help") {
+ opts.experimentalGestures = true;
+ } else if (!arg.startsWith('-')) {
+ fileNames.append(arg);
+ } else if (true || arg == "-help") {
usage();
}
}
- QTranslator qmlTranslator;
- if (!translationFile.isEmpty()) {
- qmlTranslator.load(translationFile);
- app.installTranslator(&qmlTranslator);
+ if (!opts.scriptopts.isEmpty()) {
+
+ parseScriptOptions();
+
+ if (opts.script.isEmpty())
+ usage();
+
+ if (!(opts.scriptOptions & QDeclarativeViewer::Record) && !(opts.scriptOptions & QDeclarativeViewer::Play))
+ scriptOptsUsage();
+ } else if (!opts.script.isEmpty()) {
+ usage();
}
- Qt::WFlags wflags = (frameless ? Qt::FramelessWindowHint : Qt::Widget);
- if (stayOnTop)
+}
+
+static QDeclarativeViewer *createViewer()
+{
+ Qt::WFlags wflags = (opts.frameless ? Qt::FramelessWindowHint : Qt::Widget);
+ if (opts.stayOnTop)
wflags |= Qt::WindowStaysOnTopHint;
QDeclarativeViewer *viewer = new QDeclarativeViewer(0, wflags);
viewer->setAttribute(Qt::WA_DeleteOnClose, true);
- if (!scriptopts.isEmpty()) {
- QStringList options =
- scriptopts.split(QLatin1Char(','), QString::SkipEmptyParts);
-
- QDeclarativeViewer::ScriptOptions scriptOptions = 0;
- for (int i = 0; i < options.count(); ++i) {
- const QString &option = options.at(i);
- if (option == QLatin1String("help")) {
- scriptOptsUsage();
- } else if (option == QLatin1String("play")) {
- scriptOptions |= QDeclarativeViewer::Play;
- } else if (option == QLatin1String("record")) {
- scriptOptions |= QDeclarativeViewer::Record;
- } else if (option == QLatin1String("testimages")) {
- scriptOptions |= QDeclarativeViewer::TestImages;
- } else if (option == QLatin1String("testerror")) {
- scriptOptions |= QDeclarativeViewer::TestErrorProperty;
- } else if (option == QLatin1String("exitoncomplete")) {
- scriptOptions |= QDeclarativeViewer::ExitOnComplete;
- } else if (option == QLatin1String("exitonfailure")) {
- scriptOptions |= QDeclarativeViewer::ExitOnFailure;
- } else if (option == QLatin1String("saveonexit")) {
- scriptOptions |= QDeclarativeViewer::SaveOnExit;
- } else if (option == QLatin1String("snapshot")) {
- scriptOptions |= QDeclarativeViewer::Snapshot;
- } else {
- scriptOptsUsage();
- }
- }
-
- if (script.isEmpty())
- usage();
- if (!(scriptOptions & QDeclarativeViewer::Record) && !(scriptOptions & QDeclarativeViewer::Play))
- scriptOptsUsage();
- viewer->setScriptOptions(scriptOptions);
- viewer->setScript(script);
- } else if (!script.isEmpty()) {
- usage();
+ if (!opts.scriptopts.isEmpty()) {
+ viewer->setScriptOptions(opts.scriptOptions);
+ viewer->setScript(opts.script);
}
#if !defined(Q_OS_SYMBIAN)
logger = viewer->warningsWidget();
- if (warningsConfig == ShowWarnings) {
+ if (opts.warningsConfig == ShowWarnings) {
logger.data()->setDefaultVisibility(LoggerWidget::ShowWarnings);
logger.data()->show();
- } else if (warningsConfig == HideWarnings){
+ } else if (opts.warningsConfig == HideWarnings){
logger.data()->setDefaultVisibility(LoggerWidget::HideWarnings);
}
#endif
- if (experimentalGestures)
+ if (opts.experimentalGestures)
viewer->enableExperimentalGestures();
- foreach (QString lib, imports)
+ foreach (QString lib, opts.imports)
viewer->addLibraryPath(lib);
- foreach (QString plugin, plugins)
+ foreach (QString plugin, opts.plugins)
viewer->addPluginPath(plugin);
- viewer->setNetworkCacheSize(cache);
- viewer->setRecordFile(recordfile);
- viewer->setSizeToView(sizeToView);
- if (fps>0)
- viewer->setRecordRate(fps);
- if (autorecord_to)
- viewer->setAutoRecord(autorecord_from,autorecord_to);
- if (devkeys)
+ viewer->setNetworkCacheSize(opts.cache);
+ viewer->setRecordFile(opts.recordfile);
+ viewer->setSizeToView(opts.sizeToView);
+ if (opts.fps > 0)
+ viewer->setRecordRate(opts.fps);
+ if (opts.autorecord_to)
+ viewer->setAutoRecord(opts.autorecord_from, opts.autorecord_to);
+ if (opts.devkeys)
viewer->setDeviceKeys(true);
- viewer->setRecordDither(dither);
- if (recordargs.count())
- viewer->setRecordArgs(recordargs);
+ viewer->setRecordDither(opts.dither);
+ if (opts.recordargs.count())
+ viewer->setRecordArgs(opts.recordargs);
+
+ viewer->setUseNativeFileBrowser(opts.useNativeFileBrowser);
- viewer->setUseNativeFileBrowser(useNativeFileBrowser);
- if (fullScreen && maximized)
+ return viewer;
+}
+
+void showViewer(QDeclarativeViewer *viewer)
+{
+ if (opts.fullScreen)
+ viewer->showFullScreen();
+ else if (opts.maximized)
+ viewer->showMaximized();
+ else
+ viewer->show();
+
+ viewer->setUseGL(opts.useGL);
+ viewer->raise();
+}
+
+QDeclarativeViewer *openFile(const QString &fileName)
+{
+ QDeclarativeViewer *viewer = globalViewer;
+
+ viewer->open(fileName);
+ showViewer(viewer);
+
+ return viewer;
+}
+
+int main(int argc, char ** argv)
+{
+#if defined (Q_OS_SYMBIAN)
+ qInstallMsgHandler(myMessageOutput);
+#else
+ systemMsgOutput = qInstallMsgHandler(myMessageOutput);
+#endif
+
+#if defined (Q_OS_WIN)
+ // Debugging output is not visible by default on Windows -
+ // therefore show modal dialog with errors instad.
+ atexit(showWarnings);
+#endif
+
+#if defined (Q_WS_X11) || defined (Q_WS_MAC)
+ //### default to using raster graphics backend for now
+ bool gsSpecified = false;
+ for (int i = 0; i < argc; ++i) {
+ QString arg = argv[i];
+ if (arg == "-graphicssystem") {
+ gsSpecified = true;
+ break;
+ }
+ }
+
+ if (!gsSpecified)
+ QApplication::setGraphicsSystem("raster");
+#endif
+
+ Application app(argc, argv);
+ app.setApplicationName("QtQmlViewer");
+ app.setOrganizationName("Nokia");
+ app.setOrganizationDomain("nokia.com");
+
+ QDeclarativeViewer::registerTypes();
+ QDeclarativeTester::registerTypes();
+
+ parseCommandLineOptions(app.arguments());
+
+ QTranslator qmlTranslator;
+ if (!opts.translationFile.isEmpty()) {
+ qmlTranslator.load(opts.translationFile);
+ app.installTranslator(&qmlTranslator);
+ }
+
+ if (opts.fullScreen && opts.maximized)
qWarning() << "Both -fullscreen and -maximized specified. Using -fullscreen.";
- if (fileName.isEmpty()) {
+ if (fileNames.isEmpty()) {
QFile qmlapp(QLatin1String("qmlapp"));
if (qmlapp.exists() && qmlapp.open(QFile::ReadOnly)) {
- QString content = QString::fromUtf8(qmlapp.readAll());
- qmlapp.close();
-
- int newline = content.indexOf(QLatin1Char('\n'));
- if (newline >= 0)
- fileName = content.left(newline);
- else
- fileName = content;
- }
+ QString content = QString::fromUtf8(qmlapp.readAll());
+ qmlapp.close();
+
+ int newline = content.indexOf(QLatin1Char('\n'));
+ if (newline >= 0)
+ fileNames += content.left(newline);
+ else
+ fileNames += content;
+ }
}
- if (!fileName.isEmpty()) {
- viewer->open(fileName);
- fullScreen ? viewer->showFullScreen() : maximized ? viewer->showMaximized() : viewer->show();
+ globalViewer = createViewer();
+
+ if (fileNames.isEmpty()) {
+ // show the initial viewer delayed.
+ // This prevents an initial viewer popping up while there
+ // are FileOpen events coming through the event queue
+ QTimer::singleShot(1, &app, SLOT(showInitialViewer()));
} else {
- if (!useNativeFileBrowser)
- viewer->openFile();
- fullScreen ? viewer->showFullScreen() : maximized ? viewer->showMaximized() : viewer->show();
- if (useNativeFileBrowser)
- viewer->openFile();
+ foreach (const QString &fileName, fileNames)
+ openFile(fileName);
}
- viewer->setUseGL(useGL);
- viewer->raise();
+
+ QObject::connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
return app.exec();
}
+
+#include "main.moc"
diff --git a/tools/qml/qml.pri b/tools/qml/qml.pri
index 80afb45..e5b2c7f 100644
--- a/tools/qml/qml.pri
+++ b/tools/qml/qml.pri
@@ -16,7 +16,9 @@ SOURCES += $$PWD/qmlruntime.cpp \
$$PWD/qdeclarativetester.cpp \
$$PWD/loggerwidget.cpp
-RESOURCES = $$PWD/qmlruntime.qrc
+RESOURCES = $$PWD/browser/browser.qrc \
+ $$PWD/startup/startup.qrc
+
symbian:!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) {
SOURCES += $$PWD/deviceorientation_symbian.cpp
FORMS = $$PWD/recopts.ui \
diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp
index 951b187..08a578c 100644
--- a/tools/qml/qmlruntime.cpp
+++ b/tools/qml/qmlruntime.cpp
@@ -102,6 +102,49 @@
QT_BEGIN_NAMESPACE
+class DragAndDropView : public QDeclarativeView
+{
+ Q_OBJECT
+public:
+ DragAndDropView(QDeclarativeViewer *parent = 0)
+ : QDeclarativeView(parent)
+ {
+ setAcceptDrops(true);
+ }
+
+ void dragEnterEvent(QDragEnterEvent *event)
+ {
+ const QMimeData *mimeData = event->mimeData();
+ if (mimeData->hasUrls())
+ event->acceptProposedAction();
+ }
+
+ void dragMoveEvent(QDragMoveEvent *event)
+ {
+ event->acceptProposedAction();
+ }
+
+ void dragLeaveEvent(QDragLeaveEvent *event)
+ {
+ event->accept();
+ }
+
+ void dropEvent(QDropEvent *event)
+ {
+ const QMimeData *mimeData = event->mimeData();
+ if (!mimeData->hasUrls())
+ return;
+ const QList<QUrl> urlList = mimeData->urls();
+ foreach (const QUrl &url, urlList) {
+ if (url.scheme() == QLatin1String("file")) {
+ static_cast<QDeclarativeViewer *>(parent())->open(url.toLocalFile());
+ event->accept();
+ return;
+ }
+ }
+ }
+};
+
class Runtime : public QObject
{
Q_OBJECT
@@ -596,7 +639,7 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags)
recdlg->warning->hide();
}
- canvas = new QDeclarativeView(this);
+ canvas = new DragAndDropView(this);
canvas->setAttribute(Qt::WA_OpaquePaintEvent);
canvas->setAttribute(Qt::WA_NoSystemBackground);
@@ -605,7 +648,7 @@ QDeclarativeViewer::QDeclarativeViewer(QWidget *parent, Qt::WindowFlags flags)
QObject::connect(canvas, SIGNAL(sceneResized(QSize)), this, SLOT(sceneResized(QSize)));
QObject::connect(canvas, SIGNAL(statusChanged(QDeclarativeView::Status)), this, SLOT(statusChanged()));
- QObject::connect(canvas->engine(), SIGNAL(quit()), QCoreApplication::instance (), SLOT(quit()));
+ QObject::connect(canvas->engine(), SIGNAL(quit()), this, SLOT(close()));
QObject::connect(warningsWidget(), SIGNAL(opened()), this, SLOT(warningsWidgetOpened()));
QObject::connect(warningsWidget(), SIGNAL(closed()), this, SLOT(warningsWidgetClosed()));
@@ -664,11 +707,11 @@ LoggerWidget *QDeclarativeViewer::warningsWidget() const
void QDeclarativeViewer::createMenu()
{
QAction *openAction = new QAction(tr("&Open..."), this);
- openAction->setShortcut(QKeySequence("Ctrl+O"));
+ openAction->setShortcuts(QKeySequence::Open);
connect(openAction, SIGNAL(triggered()), this, SLOT(openFile()));
QAction *reloadAction = new QAction(tr("&Reload"), this);
- reloadAction->setShortcut(QKeySequence("Ctrl+R"));
+ reloadAction->setShortcuts(QKeySequence::Refresh);
connect(reloadAction, SIGNAL(triggered()), this, SLOT(reload()));
QAction *snapshotAction = new QAction(tr("&Take Snapshot"), this);
@@ -717,10 +760,16 @@ void QDeclarativeViewer::createMenu()
landscapeInvAction->setCheckable(true);
QAction *aboutAction = new QAction(tr("&About Qt..."), this);
+ aboutAction->setMenuRole(QAction::AboutQtRole);
connect(aboutAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+ QAction *closeAction = new QAction(tr("&Close"), this);
+ closeAction->setShortcuts(QKeySequence::Close);
+ connect(closeAction, SIGNAL(triggered()), this, SLOT(close()));
+
QAction *quitAction = new QAction(tr("&Quit"), this);
- quitAction->setShortcut(QKeySequence("Ctrl+Q"));
+ quitAction->setMenuRole(QAction::QuitRole);
+ quitAction->setShortcuts(QKeySequence::Quit);
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
QMenuBar *menu = menuBar();
@@ -751,6 +800,7 @@ void QDeclarativeViewer::createMenu()
fileMenu->addAction(openAction);
fileMenu->addAction(reloadAction);
fileMenu->addSeparator();
+ fileMenu->addAction(closeAction);
fileMenu->addAction(quitAction);
#if !defined(Q_OS_SYMBIAN)
@@ -927,7 +977,7 @@ void QDeclarativeViewer::openFile()
{
QString cur = canvas->source().toLocalFile();
if (useQmlFileBrowser) {
- open("qrc:/content/Browser.qml");
+ open("qrc:/browser/Browser.qml");
} else {
QString fileName = QFileDialog::getOpenFileName(this, tr("Open QML file"), cur, tr("QML Files (*.qml)"));
if (!fileName.isEmpty()) {
diff --git a/tools/qml/qmlruntime.h b/tools/qml/qmlruntime.h
index 68d3452..7385b14 100644
--- a/tools/qml/qmlruntime.h
+++ b/tools/qml/qmlruntime.h
@@ -105,6 +105,7 @@ public:
QDeclarativeView *view() const;
LoggerWidget *warningsWidget() const;
+ QString currentFile() const { return currentFileOrUrl; }
void enableExperimentalGestures();
diff --git a/tools/qml/qmlruntime.qrc b/tools/qml/qmlruntime.qrc
deleted file mode 100644
index 3a9e608..0000000
--- a/tools/qml/qmlruntime.qrc
+++ /dev/null
@@ -1,9 +0,0 @@
-<RCC>
- <qresource prefix="/" >
- <file>content/Browser.qml</file>
- <file>content/images/up.png</file>
- <file>content/images/folder.png</file>
- <file>content/images/titlebar.sci</file>
- <file>content/images/titlebar.png</file>
- </qresource>
-</RCC>
diff --git a/tools/qml/startup/Logo.qml b/tools/qml/startup/Logo.qml
new file mode 100644
index 0000000..8d9708d
--- /dev/null
+++ b/tools/qml/startup/Logo.qml
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+
+Rectangle {
+ id: myApp
+ width: 411
+ height: 411
+ color: "transparent"
+ property alias logoState : myApp.state
+ signal animationFinished
+
+ Item {
+ id: sketchBlueHolder
+ width: sketchLogo.width
+ height: sketchLogo.height
+ Image {
+ id: image1
+ x: -44
+ y: -45
+ smooth: true
+ source: "shadow.png"
+ }
+ Item {
+ clip: true
+ width: sketchLogo.width
+ height: sketchLogo.height
+ Image {
+ id: sketchLogo
+ smooth: true
+ source: "qt-sketch.jpg"
+ }
+ Image {
+ id: blueLogo
+ y: -420
+ smooth: true
+ source: "qt-blue.jpg"
+ }
+ }
+ }
+
+ states: [
+ State {
+ name: "showBlueprint"
+ PropertyChanges {
+ target: blueLogo
+ y: 0
+ }
+ PropertyChanges {
+ target: sketchLogo
+ opacity: 0
+ }
+ },
+ State {
+ extend: "showBlueprint"
+ name: "finale"
+ PropertyChanges {
+ target: fullLogo
+ opacity: 1
+ }
+ PropertyChanges {
+ target: backLogo
+ opacity: 1
+ scale: 1
+ }
+ PropertyChanges {
+ target: frontLogo
+ opacity: 1
+ scale: 1
+ }
+ PropertyChanges {
+ target: qtText
+ opacity: 1
+ scale: 1
+ }
+ PropertyChanges {
+ target: sketchBlueHolder
+ opacity: 0
+ scale: 1.4
+ }
+ }
+ ]
+
+ transitions: [
+ Transition {
+ to: "showBlueprint"
+ SequentialAnimation {
+ NumberAnimation { property: "y"; duration: 600; easing.type: "OutBounce" }
+ PropertyAction { target: sketchLogo; property: "opacity" }
+ }
+ },
+ Transition {
+ to: "finale"
+ PropertyAction { target: fullLogo; property: "opacity" }
+ SequentialAnimation {
+ NumberAnimation { target: backLogo; properties: "scale, opacity"; duration: 300 }
+ NumberAnimation { target: frontLogo; properties: "scale, opacity"; duration: 300 }
+ ParallelAnimation {
+ NumberAnimation { target: qtText; properties: "opacity, scale"; duration: 400; easing.type: "OutQuad" }
+ NumberAnimation { target: sketchBlueHolder; property: "opacity"; duration: 300; easing.type: "OutQuad" }
+ NumberAnimation { target: sketchBlueHolder; property: "scale"; duration: 320; easing.type: "OutQuad" }
+ }
+ PauseAnimation { duration: 1000 }
+ ScriptAction { script: myApp.animationFinished() }
+ }
+ }
+ ]
+
+ Item {
+ id: fullLogo
+ opacity: 0
+ Image {
+ id: backLogo
+ x: -16
+ y: -41
+ opacity: 0
+ scale: 0.7
+ smooth: true
+ source: "qt-back.png"
+ }
+ Image {
+ id: frontLogo
+ x: -17
+ y: -41
+ opacity: 0
+ scale: 1.2
+ smooth: true
+ source: "qt-front.png"
+ }
+ Image {
+ id: qtText
+ x: -10
+ y: -41
+ opacity: 0
+ scale: 1.2
+ smooth: true
+ source: "qt-text.png"
+ }
+ }
+}
diff --git a/tools/qml/startup/qt-back.png b/tools/qml/startup/qt-back.png
new file mode 100644
index 0000000..077215f
--- /dev/null
+++ b/tools/qml/startup/qt-back.png
Binary files differ
diff --git a/tools/qml/startup/qt-blue.jpg b/tools/qml/startup/qt-blue.jpg
new file mode 100644
index 0000000..b204896
--- /dev/null
+++ b/tools/qml/startup/qt-blue.jpg
Binary files differ
diff --git a/tools/qml/startup/qt-front.png b/tools/qml/startup/qt-front.png
new file mode 100644
index 0000000..dbfb43e
--- /dev/null
+++ b/tools/qml/startup/qt-front.png
Binary files differ
diff --git a/tools/qml/startup/qt-sketch.jpg b/tools/qml/startup/qt-sketch.jpg
new file mode 100644
index 0000000..1ede6f0
--- /dev/null
+++ b/tools/qml/startup/qt-sketch.jpg
Binary files differ
diff --git a/tools/qml/startup/qt-text.png b/tools/qml/startup/qt-text.png
new file mode 100644
index 0000000..d44995c
--- /dev/null
+++ b/tools/qml/startup/qt-text.png
Binary files differ
diff --git a/tools/qml/startup/quick-blur.png b/tools/qml/startup/quick-blur.png
new file mode 100644
index 0000000..29ec243
--- /dev/null
+++ b/tools/qml/startup/quick-blur.png
Binary files differ
diff --git a/tools/qml/startup/quick-regular.png b/tools/qml/startup/quick-regular.png
new file mode 100644
index 0000000..38321cb
--- /dev/null
+++ b/tools/qml/startup/quick-regular.png
Binary files differ
diff --git a/tools/qml/startup/shadow.png b/tools/qml/startup/shadow.png
new file mode 100644
index 0000000..44f92fe
--- /dev/null
+++ b/tools/qml/startup/shadow.png
Binary files differ
diff --git a/tools/qml/startup/startup.qml b/tools/qml/startup/startup.qml
new file mode 100644
index 0000000..be67598
--- /dev/null
+++ b/tools/qml/startup/startup.qml
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+
+Rectangle {
+ id: treatsApp
+ width: 800
+ height: 480
+ color: "darkgrey"
+ Component.onCompleted: treatsApp.state = "part1"
+ signal animationFinished
+
+ Logo {
+ id: logo
+ x: 165
+ y: 35
+ rotation: -15
+ scale: 0.6
+ opacity: 0
+ onAnimationFinished: treatsApp.animationFinished();
+ }
+
+ states: [
+ State {
+ name: "part1"
+ PropertyChanges {
+ target: logo
+ scale: 0.8
+ opacity: 1
+ rotation: 0
+ }
+ PropertyChanges {
+ target: treatsApp
+ color: "black"
+ }
+ PropertyChanges {
+ target: logo
+ y: 10
+ }
+ PropertyChanges {
+ target: quickblur
+ x: logo.x + 145
+ }
+ PropertyChanges {
+ target: blurText
+ opacity: 0
+ }
+ PropertyChanges {
+ target: quickregular
+ opacity: 1
+ }
+ PropertyChanges {
+ target: star
+ x: -7
+ y: -37
+ }
+ }
+ ]
+
+
+ Item {
+ id: quickblur
+ x: 800//325
+ y: 344
+ Image {
+ id: blurText
+ source: "quick-blur.png"
+ }
+ Image {
+ id: quickregular
+ x: -1
+ y: 0
+ opacity: 0
+ source: "quick-regular.png"
+ }
+ Image {
+ id: star
+ x: -1
+ y: 0
+ opacity: 0
+ source: "white-star.png"
+ smooth: true
+ NumberAnimation on rotation {
+ from: 0
+ to: 360
+ loops: NumberAnimation.Infinite
+ running: true
+ duration: 2000
+ }
+ }
+ }
+
+ transitions: [
+ Transition {
+ ParallelAnimation {
+ NumberAnimation { target: logo; property: "opacity"; duration: 500 }
+ NumberAnimation { target: logo; property: "scale"; duration: 4000; }
+ NumberAnimation { target: logo; property: "rotation"; duration: 2000; easing.type: "OutBack"}
+ ColorAnimation { duration: 3000}
+ SequentialAnimation {
+ PauseAnimation { duration: 1000 }
+ ScriptAction { script: logo.logoState = "showBlueprint" }
+ PauseAnimation { duration: 800 }
+ ScriptAction { script: logo.logoState = "finale" }
+ PauseAnimation { duration: 800 }
+ ParallelAnimation {
+ NumberAnimation { target: quickblur; property: "x"; duration: 200;}
+ SequentialAnimation {
+ PauseAnimation { duration: 200}
+ ParallelAnimation {
+ NumberAnimation { target: blurText; property: "opacity"; duration: 300;}
+ NumberAnimation { target: quickregular; property: "opacity"; duration: 300;}
+ }
+ NumberAnimation { target: star; property: "opacity"; from: 0; to: 1; duration: 500 }
+ PauseAnimation { duration: 200 }
+ NumberAnimation { target: star; property: "opacity"; from: 1; to: 0; duration: 500 }
+ }
+ SequentialAnimation {
+ PauseAnimation { duration: 150}
+ NumberAnimation { target: logo; property: "y"; duration: 300; easing.type: "OutBounce" }
+ }
+ }
+ }
+ }
+ }
+ ]
+
+} // treatsApp
diff --git a/tools/qml/startup/startup.qrc b/tools/qml/startup/startup.qrc
new file mode 100644
index 0000000..52e6705
--- /dev/null
+++ b/tools/qml/startup/startup.qrc
@@ -0,0 +1,16 @@
+<RCC>
+ <qresource prefix="/startup">
+ <file>Logo.qml</file>
+ <file>qt-back.png</file>
+ <file>qt-blue.jpg</file>
+ <file>qt-front.png</file>
+ <file>qt-sketch.jpg</file>
+ <file>qt-text.png</file>
+ <file>quick-blur.png</file>
+ <file>quick-regular.png</file>
+ <file>shadow.png</file>
+ <file>startup.qml</file>
+ <file>startup.qrc</file>
+ <file>white-star.png</file>
+ </qresource>
+</RCC>
diff --git a/tools/qml/startup/white-star.png b/tools/qml/startup/white-star.png
new file mode 100644
index 0000000..f467c94
--- /dev/null
+++ b/tools/qml/startup/white-star.png
Binary files differ