summaryrefslogtreecommitdiffstats
path: root/src/declarative/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/util')
-rw-r--r--src/declarative/util/qdeclarativelistmodel.cpp25
-rw-r--r--src/declarative/util/qdeclarativelistmodelworkeragent_p.h1
-rw-r--r--src/declarative/util/qdeclarativepixmapcache.cpp7
-rw-r--r--src/declarative/util/qdeclarativepropertychanges.cpp17
-rw-r--r--src/declarative/util/qdeclarativesmoothedanimation.cpp29
-rw-r--r--src/declarative/util/qdeclarativesmoothedanimation_p.h1
-rw-r--r--src/declarative/util/qdeclarativesmoothedfollow.cpp299
-rw-r--r--src/declarative/util/qdeclarativesmoothedfollow_p.h113
-rw-r--r--src/declarative/util/qdeclarativespringfollow.cpp47
-rw-r--r--src/declarative/util/qdeclarativespringfollow_p.h14
-rw-r--r--src/declarative/util/qdeclarativestate.cpp30
-rw-r--r--src/declarative/util/qdeclarativestate_p.h2
-rw-r--r--src/declarative/util/qdeclarativestateoperations.cpp12
-rw-r--r--src/declarative/util/qdeclarativeutilmodule.cpp36
-rw-r--r--src/declarative/util/qdeclarativexmllistmodel.cpp2
-rw-r--r--src/declarative/util/util.pri2
16 files changed, 537 insertions, 100 deletions
diff --git a/src/declarative/util/qdeclarativelistmodel.cpp b/src/declarative/util/qdeclarativelistmodel.cpp
index ec23bb2..e3680f2 100644
--- a/src/declarative/util/qdeclarativelistmodel.cpp
+++ b/src/declarative/util/qdeclarativelistmodel.cpp
@@ -248,6 +248,20 @@ QDeclarativeListModelParser::ListInstruction *QDeclarativeListModelParser::ListM
*/
+/*
+ A ListModel internally uses either a NestedListModel or FlatListModel.
+
+ A NestedListModel can contain lists of ListElements (which
+ when retrieved from get() is accessible as a list model within the list
+ model) whereas a FlatListModel cannot.
+
+ ListModel uses a NestedListModel to begin with, and if the model is later
+ used from a WorkerScript, it changes to use a FlatListModel instead. This
+ is because ModelNode (which abstracts the nested list model data) needs
+ access to the declarative engine and script engine, which cannot be
+ safely used from outside of the main thread.
+*/
+
QDeclarativeListModel::QDeclarativeListModel(QObject *parent)
: QListModelInterface(parent), m_agent(0), m_nested(new NestedListModel(this)), m_flat(0), m_isWorkerCopy(false)
{
@@ -264,6 +278,9 @@ QDeclarativeListModel::QDeclarativeListModel(bool workerCopy, QObject *parent)
QDeclarativeListModel::~QDeclarativeListModel()
{
+ if (m_agent)
+ m_agent->release();
+
delete m_nested;
delete m_flat;
}
@@ -622,6 +639,11 @@ bool QDeclarativeListModelParser::compileProperty(const QDeclarativeCustomParser
QDeclarativeCustomParserNode node =
qvariant_cast<QDeclarativeCustomParserNode>(value);
+ if (node.name() != "ListElement") {
+ error(node, QDeclarativeListModel::tr("ListElement: cannot contain nested elements"));
+ return false;
+ }
+
{
ListInstruction li;
li.type = ListInstruction::Push;
@@ -633,7 +655,7 @@ bool QDeclarativeListModelParser::compileProperty(const QDeclarativeCustomParser
for(int jj = 0; jj < props.count(); ++jj) {
const QDeclarativeCustomParserProperty &nodeProp = props.at(jj);
if (nodeProp.name() == "") {
- error(nodeProp, QDeclarativeListModel::tr("ListElement: cannot use default property"));
+ error(nodeProp, QDeclarativeListModel::tr("ListElement: cannot contain nested elements"));
return false;
}
if (nodeProp.name() == "id") {
@@ -1343,6 +1365,7 @@ ModelObject::ModelObject()
void ModelObject::setValue(const QByteArray &name, const QVariant &val)
{
_mo->setValue(name, val);
+ setProperty(name.constData(), val);
}
diff --git a/src/declarative/util/qdeclarativelistmodelworkeragent_p.h b/src/declarative/util/qdeclarativelistmodelworkeragent_p.h
index b6a643b..53d30c2 100644
--- a/src/declarative/util/qdeclarativelistmodelworkeragent_p.h
+++ b/src/declarative/util/qdeclarativelistmodelworkeragent_p.h
@@ -66,7 +66,6 @@ QT_MODULE(Declarative)
class QDeclarativeListModel;
-// Currently this will leak as no-one releases it in the worker thread
class QDeclarativeListModelWorkerAgent : public QObject
{
Q_OBJECT
diff --git a/src/declarative/util/qdeclarativepixmapcache.cpp b/src/declarative/util/qdeclarativepixmapcache.cpp
index e57d3c2..5e60819 100644
--- a/src/declarative/util/qdeclarativepixmapcache.cpp
+++ b/src/declarative/util/qdeclarativepixmapcache.cpp
@@ -65,13 +65,6 @@ static const int maxImageRequestCount = 8;
QT_BEGIN_NAMESPACE
-#if (QT_VERSION < QT_VERSION_CHECK(4, 7, 0))
-inline uint qHash(const QUrl &uri)
-{
- return qHash(uri.toEncoded(QUrl::FormattingOption(0x100)));
-}
-#endif
-
static QString toLocalFileOrQrc(const QUrl& url)
{
QString r = url.toLocalFile();
diff --git a/src/declarative/util/qdeclarativepropertychanges.cpp b/src/declarative/util/qdeclarativepropertychanges.cpp
index e7228cc..9c3ee9f 100644
--- a/src/declarative/util/qdeclarativepropertychanges.cpp
+++ b/src/declarative/util/qdeclarativepropertychanges.cpp
@@ -103,7 +103,7 @@ QT_BEGIN_NAMESPACE
natural width (which is the whole string on one line).
\qml
- import Qt 4.6
+ import Qt 4.7
Rectangle {
width: 640
@@ -111,7 +111,7 @@ QT_BEGIN_NAMESPACE
Text {
id: theText
width: 50
- wrap: true
+ wrapMode: Text.WordWrap
text: "a text string that is longer than 50 pixels"
}
@@ -377,7 +377,7 @@ QDeclarativeProperty
QDeclarativePropertyChangesPrivate::property(const QByteArray &property)
{
Q_Q(QDeclarativePropertyChanges);
- QDeclarativeProperty prop(object, QString::fromUtf8(property));
+ QDeclarativeProperty prop(object, QString::fromUtf8(property), qmlContext(q));
if (!prop.isValid()) {
qmlInfo(q) << QDeclarativePropertyChanges::tr("Cannot assign to non-existent property \"%1\"").arg(QString::fromUtf8(property));
return QDeclarativeProperty();
@@ -400,16 +400,11 @@ QDeclarativePropertyChanges::ActionList QDeclarativePropertyChanges::actions()
QByteArray property = d->properties.at(ii).first;
- QDeclarativeAction a(d->object, QString::fromLatin1(property),
- d->properties.at(ii).second);
+ QDeclarativeAction a(d->object, QString::fromUtf8(property),
+ qmlContext(this), d->properties.at(ii).second);
if (a.property.isValid()) {
a.restore = restoreEntryValues();
-
- if (a.property.propertyType() == QVariant::Url &&
- (a.toValue.userType() == QVariant::String || a.toValue.userType() == QVariant::ByteArray) && !a.toValue.isNull())
- a.toValue.setValue(qmlContext(this)->resolvedUrl(QUrl(a.toValue.toString())));
-
list << a;
}
}
@@ -436,7 +431,7 @@ QDeclarativePropertyChanges::ActionList QDeclarativePropertyChanges::actions()
a.property = prop;
a.fromValue = a.property.read();
a.specifiedObject = d->object;
- a.specifiedProperty = QString::fromLatin1(property);
+ a.specifiedProperty = QString::fromUtf8(property);
if (d->isExplicit) {
a.toValue = d->expressions.at(ii).second->value();
diff --git a/src/declarative/util/qdeclarativesmoothedanimation.cpp b/src/declarative/util/qdeclarativesmoothedanimation.cpp
index 3411642..48a7583 100644
--- a/src/declarative/util/qdeclarativesmoothedanimation.cpp
+++ b/src/declarative/util/qdeclarativesmoothedanimation.cpp
@@ -69,6 +69,7 @@ QSmoothedAnimation::QSmoothedAnimation(QObject *parent)
void QSmoothedAnimation::restart()
{
+ initialVelocity = trackVelocity;
if (state() != QAbstractAnimation::Running)
start();
else
@@ -224,6 +225,7 @@ void QSmoothedAnimation::init()
QDeclarativePropertyPrivate::write(target, to,
QDeclarativePropertyPrivate::BypassInterceptor
| QDeclarativePropertyPrivate::DontRemoveBinding);
+ stop();
return;
case QDeclarativeSmoothedAnimation::Immediate:
initialVelocity = 0;
@@ -248,13 +250,14 @@ void QSmoothedAnimation::init()
/*!
\qmlclass SmoothedAnimation QDeclarativeSmoothedAnimation
\since 4.7
+ \inherits NumberAnimation
\brief The SmoothedAnimation element allows a property to smoothly track a value.
- The SmoothedAnimation smoothly animates a property's value to a set target value
+ The SmoothedAnimation animates a property's value to a set target value
using an ease in/out quad easing curve. If the animation is restarted
with a different target value, the easing curves used to animate to the old
- and the new target values are spliced together to avoid any obvious visual
- glitches.
+ and the new target values are smoothly spliced together to avoid any obvious
+ visual glitches by maintaining the current velocity.
The property animation is configured by setting the velocity at which the
animation should occur, or the duration that the animation should take.
@@ -270,7 +273,7 @@ void QSmoothedAnimation::init()
The follow example shows one rectangle tracking the position of another.
\code
-import Qt 4.6
+import Qt 4.7
Rectangle {
width: 800; height: 600; color: "blue"
@@ -343,17 +346,14 @@ void QDeclarativeSmoothedAnimation::transition(QDeclarativeStateActions &actions
QSet<QAbstractAnimation*> anims;
for (int i = 0; i < d->actions->size(); i++) {
QSmoothedAnimation *ease;
- qreal trackVelocity;
bool needsRestart;
if (!d->activeAnimations.contains((*d->actions)[i].property)) {
ease = new QSmoothedAnimation();
d->wrapperGroup->addAnimation(ease);
d->activeAnimations.insert((*d->actions)[i].property, ease);
- trackVelocity = 0.0;
needsRestart = false;
} else {
ease = d->activeAnimations.value((*d->actions)[i].property);
- trackVelocity = ease->trackVelocity;
needsRestart = true;
}
@@ -366,8 +366,7 @@ void QDeclarativeSmoothedAnimation::transition(QDeclarativeStateActions &actions
ease->velocity = d->anim->velocity;
ease->userDuration = d->anim->userDuration;
- ease->trackVelocity = trackVelocity;
- ease->initialVelocity = trackVelocity;
+ ease->initialVelocity = ease->trackVelocity;
if (needsRestart)
ease->init();
@@ -458,14 +457,14 @@ void QDeclarativeSmoothedAnimation::setVelocity(qreal v)
}
/*!
-\qmlproperty qreal SmoothedAnimation::maximumEasingTime
+ \qmlproperty qreal SmoothedAnimation::maximumEasingTime
-This property specifies the maximum time, in msecs, an "eases" during the follow should take.
-Setting this property causes the velocity to "level out" after at a time. Setting
-a negative value reverts to the normal mode of easing over the entire animation
-duration.
+ This property specifies the maximum time, in msecs, an "eases" during the follow should take.
+ Setting this property causes the velocity to "level out" after at a time. Setting
+ a negative value reverts to the normal mode of easing over the entire animation
+ duration.
-The default value is -1.
+ The default value is -1.
*/
int QDeclarativeSmoothedAnimation::maximumEasingTime() const
{
diff --git a/src/declarative/util/qdeclarativesmoothedanimation_p.h b/src/declarative/util/qdeclarativesmoothedanimation_p.h
index df53104..17aafa4 100644
--- a/src/declarative/util/qdeclarativesmoothedanimation_p.h
+++ b/src/declarative/util/qdeclarativesmoothedanimation_p.h
@@ -83,7 +83,6 @@ public:
int maximumEasingTime() const;
void setMaximumEasingTime(int);
-public:
virtual void transition(QDeclarativeStateActions &actions,
QDeclarativeProperties &modified,
TransitionDirection direction);
diff --git a/src/declarative/util/qdeclarativesmoothedfollow.cpp b/src/declarative/util/qdeclarativesmoothedfollow.cpp
new file mode 100644
index 0000000..63c9618
--- /dev/null
+++ b/src/declarative/util/qdeclarativesmoothedfollow.cpp
@@ -0,0 +1,299 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+#include "qdeclarativesmoothedfollow_p.h"
+#include "qdeclarativesmoothedanimation_p_p.h"
+
+#include <private/qobject_p.h>
+#include <QtCore/qnumeric.h>
+
+#include "qdeclarativeglobal_p.h"
+
+
+QT_BEGIN_NAMESPACE
+
+class QDeclarativeSmoothedFollowPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QDeclarativeSmoothedFollow)
+public:
+ QDeclarativeSmoothedFollowPrivate();
+
+ bool enabled;
+ QSmoothedAnimation *anim;
+};
+
+/*!
+ \qmlclass SmoothedFollow QDeclarativeSmoothedFollow
+ \since 4.7
+ \inherits NumberAnimation
+ \brief The SmoothedFollow element allows a property to smoothly track a value.
+
+ The SmoothedFollow animates a property's value to a set target value
+ using an ease in/out quad easing curve. If the animation is restarted
+ with a different target value, the easing curves used to animate to the old
+ and the new target values are smoothly spliced together to avoid any obvious
+ visual glitches by maintaining the current velocity.
+
+ The property animation is configured by setting the velocity at which the
+ animation should occur, or the duration that the animation should take.
+ If both a velocity and a duration are specified, the one that results in
+ the quickest animation is chosen for each change in the target value.
+
+ For example, animating from 0 to 800 will take 4 seconds if a velocity
+ of 200 is set, will take 8 seconds with a duration of 8000 set, and will
+ take 4 seconds with both a velocity of 200 and a duration of 8000 set.
+ Animating from 0 to 20000 will take 10 seconds if a velocity of 200 is set,
+ will take 8 seconds with a duration of 8000 set, and will take 8 seconds
+ with both a velocity of 200 and a duration of 8000 set.
+
+ The follow example shows one rectangle tracking the position of another.
+\code
+import Qt 4.6
+
+Rectangle {
+ width: 800; height: 600; color: "blue"
+
+ Rectangle {
+ color: "green"
+ width: 60; height: 60;
+ SmoothedFollow on x { to: rect1.x - 5; velocity: 200 }
+ SmoothedFollow on y { to: rect1.y - 5; velocity: 200 }
+ }
+
+ Rectangle {
+ id: rect1
+ color: "red"
+ width: 50; height: 50;
+ }
+
+ focus: true
+ Keys.onRightPressed: rect1.x = rect1.x + 100
+ Keys.onLeftPressed: rect1.x = rect1.x - 100
+ Keys.onUpPressed: rect1.y = rect1.y - 100
+ Keys.onDownPressed: rect1.y = rect1.y + 100
+}
+\endcode
+
+ The default velocity of SmoothedFollow is 200 units/second. Note that if the range of the
+ value being animated is small, then the velocity will need to be adjusted
+ appropriately. For example, the opacity of an item ranges from 0 - 1.0.
+ To enable a smooth animation in this range the velocity will need to be
+ set to a value such as 0.5 units/second. Animating from 0 to 1.0 with a velocity
+ of 0.5 will take 2000 ms to complete.
+
+ \sa SpringFollow
+*/
+
+QDeclarativeSmoothedFollow::QDeclarativeSmoothedFollow(QObject *parent)
+ : QObject(*(new QDeclarativeSmoothedFollowPrivate), parent)
+{
+}
+
+QDeclarativeSmoothedFollow::~QDeclarativeSmoothedFollow()
+{
+}
+
+QDeclarativeSmoothedFollowPrivate::QDeclarativeSmoothedFollowPrivate()
+ : enabled(true), anim(new QSmoothedAnimation)
+{
+ Q_Q(QDeclarativeSmoothedFollow);
+ QDeclarative_setParent_noEvent(anim, q);
+}
+
+/*!
+ \qmlproperty enumeration SmoothedFollow::reversingMode
+
+ Sets how the SmoothedFollow behaves if an animation direction is reversed.
+
+ If reversing mode is \c Eased, the animation will smoothly decelerate, and
+ then reverse direction. If the reversing mode is \c Immediate, the
+ animation will immediately begin accelerating in the reverse direction,
+ begining with a velocity of 0. If the reversing mode is \c Sync, the
+ property is immediately set to the target value.
+*/
+QDeclarativeSmoothedFollow::ReversingMode QDeclarativeSmoothedFollow::reversingMode() const
+{
+ Q_D(const QDeclarativeSmoothedFollow);
+ return (ReversingMode) d->anim->reversingMode;
+}
+
+void QDeclarativeSmoothedFollow::setReversingMode(ReversingMode m)
+{
+ Q_D(QDeclarativeSmoothedFollow);
+ if (d->anim->reversingMode == (QDeclarativeSmoothedAnimation::ReversingMode) m)
+ return;
+
+ d->anim->reversingMode = (QDeclarativeSmoothedAnimation::ReversingMode) m;
+ emit reversingModeChanged();
+}
+
+/*!
+ \qmlproperty int SmoothedFollow::duration
+
+ This property holds the animation duration, in msecs, used when tracking the source.
+
+ Setting this to -1 (the default) disables the duration value.
+*/
+int QDeclarativeSmoothedFollow::duration() const
+{
+ Q_D(const QDeclarativeSmoothedFollow);
+ return d->anim->userDuration;
+}
+
+void QDeclarativeSmoothedFollow::setDuration(int duration)
+{
+ Q_D(QDeclarativeSmoothedFollow);
+ if (duration == d->anim->duration())
+ return;
+
+ d->anim->userDuration = duration;
+ emit durationChanged();
+}
+
+qreal QDeclarativeSmoothedFollow::velocity() const
+{
+ Q_D(const QDeclarativeSmoothedFollow);
+ return d->anim->velocity;
+}
+
+/*!
+ \qmlproperty qreal SmoothedFollow::velocity
+
+ This property holds the average velocity allowed when tracking the 'to' value.
+
+ The default velocity of SmoothedFollow is 200 units/second.
+
+ Setting this to -1 disables the velocity value.
+*/
+void QDeclarativeSmoothedFollow::setVelocity(qreal v)
+{
+ Q_D(QDeclarativeSmoothedFollow);
+ if (d->anim->velocity == v)
+ return;
+
+ d->anim->velocity = v;
+ emit velocityChanged();
+}
+
+/*!
+ \qmlproperty qreal SmoothedFollow::maximumEasingTime
+
+ This property specifies the maximum time, in msecs, an "eases" during the follow should take.
+ Setting this property causes the velocity to "level out" after at a time. Setting
+ a negative value reverts to the normal mode of easing over the entire animation
+ duration.
+
+ The default value is -1.
+*/
+int QDeclarativeSmoothedFollow::maximumEasingTime() const
+{
+ Q_D(const QDeclarativeSmoothedFollow);
+ return d->anim->maximumEasingTime;
+}
+
+void QDeclarativeSmoothedFollow::setMaximumEasingTime(int v)
+{
+ Q_D(QDeclarativeSmoothedFollow);
+ d->anim->maximumEasingTime = v;
+ emit maximumEasingTimeChanged();
+}
+
+/*!
+ \qmlproperty real SmoothedFollow::to
+ This property holds the ending value.
+ If not set, then the value defined in the end state of the transition or Behavior.
+*/
+qreal QDeclarativeSmoothedFollow::to() const
+{
+ Q_D(const QDeclarativeSmoothedFollow);
+ return d->anim->to;
+}
+
+void QDeclarativeSmoothedFollow::setTo(qreal t)
+{
+ Q_D(QDeclarativeSmoothedFollow);
+
+ if (qIsNaN(t))
+ return;
+
+ if (d->anim->to == t)
+ return;
+
+ d->anim->to = t;
+
+ if (d->enabled)
+ d->anim->restart();
+}
+
+/*!
+ \qmlproperty bool SmoothedFollow::enabled
+ This property whether this animation should automatically restart when
+ the 'to' property is upated.
+
+ The default value of this property is 'true'.
+*/
+bool QDeclarativeSmoothedFollow::enabled() const
+{
+ Q_D(const QDeclarativeSmoothedFollow);
+ return d->enabled;
+}
+
+void QDeclarativeSmoothedFollow::setEnabled(bool e)
+{
+ Q_D(QDeclarativeSmoothedFollow);
+ if (d->enabled == e)
+ return;
+ d->enabled = e;
+
+ if (d->enabled)
+ d->anim->restart();
+ else
+ d->anim->stop();
+ emit enabledChanged();
+}
+
+void QDeclarativeSmoothedFollow::setTarget(const QDeclarativeProperty &t)
+{
+ Q_D(QDeclarativeSmoothedFollow);
+ d->anim->target = t;
+}
+
+QT_END_NAMESPACE
diff --git a/src/declarative/util/qdeclarativesmoothedfollow_p.h b/src/declarative/util/qdeclarativesmoothedfollow_p.h
new file mode 100644
index 0000000..d860052
--- /dev/null
+++ b/src/declarative/util/qdeclarativesmoothedfollow_p.h
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVESMOOTHEDFOLLOW_H
+#define QDECLARATIVESMOOTHEDFOLLOW_H
+
+#include <qdeclarative.h>
+#include <qdeclarativepropertyvaluesource.h>
+
+#include <QtCore/qobject.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class QDeclarativeProperty;
+class QDeclarativeSmoothedFollowPrivate;
+class Q_DECLARATIVE_EXPORT QDeclarativeSmoothedFollow : public QObject,
+ public QDeclarativePropertyValueSource
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(QDeclarativeSmoothedFollow)
+ Q_INTERFACES(QDeclarativePropertyValueSource)
+ Q_ENUMS(ReversingMode)
+
+ Q_PROPERTY(qreal to READ to WRITE setTo NOTIFY toChanged)
+ Q_PROPERTY(qreal velocity READ velocity WRITE setVelocity NOTIFY velocityChanged)
+ Q_PROPERTY(int duration READ duration WRITE setDuration NOTIFY durationChanged)
+ Q_PROPERTY(ReversingMode reversingMode READ reversingMode WRITE setReversingMode NOTIFY reversingModeChanged)
+ Q_PROPERTY(qreal maximumEasingTime READ maximumEasingTime WRITE setMaximumEasingTime NOTIFY maximumEasingTimeChanged)
+ Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
+
+public:
+ enum ReversingMode { Eased, Immediate, Sync };
+
+ QDeclarativeSmoothedFollow(QObject *parent = 0);
+ ~QDeclarativeSmoothedFollow();
+
+ qreal to() const;
+ void setTo(qreal);
+
+ ReversingMode reversingMode() const;
+ void setReversingMode(ReversingMode);
+
+ int duration() const;
+ void setDuration(int);
+
+ qreal velocity() const;
+ void setVelocity(qreal);
+
+ int maximumEasingTime() const;
+ void setMaximumEasingTime(int);
+
+ bool enabled() const;
+ void setEnabled(bool);
+
+ virtual void setTarget(const QDeclarativeProperty &);
+
+Q_SIGNALS:
+ void velocityChanged();
+ void durationChanged();
+ void reversingModeChanged();
+ void maximumEasingTimeChanged();
+ void enabledChanged();
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QDeclarativeSmoothedFollow);
+
+QT_END_HEADER
+
+#endif // QDECLARATIVESMOOTHEDFOLLOW_H
diff --git a/src/declarative/util/qdeclarativespringfollow.cpp b/src/declarative/util/qdeclarativespringfollow.cpp
index c42261d..7921735 100644
--- a/src/declarative/util/qdeclarativespringfollow.cpp
+++ b/src/declarative/util/qdeclarativespringfollow.cpp
@@ -59,13 +59,13 @@ class QDeclarativeSpringFollowPrivate : public QObjectPrivate
Q_DECLARE_PUBLIC(QDeclarativeSpringFollow)
public:
QDeclarativeSpringFollowPrivate()
- : currentValue(0), sourceValue(0), maxVelocity(0), lastTime(0)
+ : currentValue(0), to(0), maxVelocity(0), lastTime(0)
, mass(1.0), spring(0.), damping(0.), velocity(0), epsilon(0.01)
, modulus(0.0), useMass(false), haveModulus(false), enabled(true), mode(Track), clock(this) {}
QDeclarativeProperty property;
qreal currentValue;
- qreal sourceValue;
+ qreal to;
qreal maxVelocity;
qreal velocityms;
int lastTime;
@@ -102,7 +102,7 @@ void QDeclarativeSpringFollowPrivate::tick(int time)
int elapsed = time - lastTime;
if (!elapsed)
return;
- qreal srcVal = sourceValue;
+ qreal srcVal = to;
if (haveModulus) {
currentValue = fmod(currentValue, modulus);
srcVal = fmod(srcVal, modulus);
@@ -158,16 +158,16 @@ void QDeclarativeSpringFollowPrivate::tick(int time)
currentValue += moveBy;
if (haveModulus)
currentValue = fmod(currentValue, modulus);
- if (currentValue > sourceValue) {
- currentValue = sourceValue;
+ if (currentValue > to) {
+ currentValue = to;
clock.stop();
}
} else {
currentValue -= moveBy;
if (haveModulus && currentValue < 0.0)
currentValue = fmod(currentValue, modulus) + modulus;
- if (currentValue < sourceValue) {
- currentValue = sourceValue;
+ if (currentValue < to) {
+ currentValue = to;
clock.stop();
}
}
@@ -196,9 +196,9 @@ void QDeclarativeSpringFollowPrivate::start()
Q_Q(QDeclarativeSpringFollow);
if (mode == QDeclarativeSpringFollowPrivate::Track) {
- currentValue = sourceValue;
+ currentValue = to;
property.write(currentValue);
- } else if (sourceValue != currentValue && clock.state() != QAbstractAnimation::Running) {
+ } else if (to != currentValue && clock.state() != QAbstractAnimation::Running) {
lastTime = 0;
currentValue = property.read().toReal();
clock.start(); // infinity??
@@ -239,7 +239,7 @@ void QDeclarativeSpringFollowPrivate::stop()
x: rect1.width
width: 20; height: 20
color: "#ff0000"
- SpringFollow on y { source: rect1.y; velocity: 200 }
+ SpringFollow on y { to: rect1.y; velocity: 200 }
}
\endcode
*/
@@ -260,26 +260,26 @@ void QDeclarativeSpringFollow::setTarget(const QDeclarativeProperty &property)
d->currentValue = property.read().toReal();
}
-qreal QDeclarativeSpringFollow::sourceValue() const
+qreal QDeclarativeSpringFollow::to() const
{
Q_D(const QDeclarativeSpringFollow);
- return d->sourceValue;
+ return d->to;
}
/*!
- \qmlproperty qreal SpringFollow::source
- This property holds the source value which will be tracked.
+ \qmlproperty qreal SpringFollow::to
+ This property holds the target value which will be tracked.
Bind to a property in order to track its changes.
*/
-void QDeclarativeSpringFollow::setSourceValue(qreal value)
+void QDeclarativeSpringFollow::setTo(qreal value)
{
Q_D(QDeclarativeSpringFollow);
- if (d->clock.state() == QAbstractAnimation::Running && d->sourceValue == value)
+ if (d->clock.state() == QAbstractAnimation::Running && d->to == value)
return;
- d->sourceValue = value;
+ d->to = value;
d->start();
}
@@ -307,7 +307,7 @@ void QDeclarativeSpringFollow::setVelocity(qreal velocity)
This property holds the spring constant
The spring constant describes how strongly the target is pulled towards the
- source. Setting spring to 0 turns off spring tracking. Useful values 0 - 5.0
+ source. Setting spring to 0 turns off spring tracking. Useful values 0 - 5.0
When a spring constant is set and the velocity property is greater than 0,
velocity limits the maximum speed.
@@ -417,13 +417,10 @@ void QDeclarativeSpringFollow::setMass(qreal mass)
}
/*!
- \qmlproperty qreal SpringFollow::value
- The current value.
-*/
-
-/*!
\qmlproperty bool SpringFollow::enabled
This property holds whether the target will track the source.
+
+ The default value of this property is 'true'.
*/
bool QDeclarativeSpringFollow::enabled() const
{
@@ -454,6 +451,10 @@ bool QDeclarativeSpringFollow::inSync() const
return d->enabled && d->clock.state() != QAbstractAnimation::Running;
}
+/*!
+ \qmlproperty qreal SpringFollow::value
+ The current value.
+*/
qreal QDeclarativeSpringFollow::value() const
{
Q_D(const QDeclarativeSpringFollow);
diff --git a/src/declarative/util/qdeclarativespringfollow_p.h b/src/declarative/util/qdeclarativespringfollow_p.h
index 2ac0d82..b829c57 100644
--- a/src/declarative/util/qdeclarativespringfollow_p.h
+++ b/src/declarative/util/qdeclarativespringfollow_p.h
@@ -59,7 +59,7 @@ class Q_DECLARATIVE_EXPORT QDeclarativeSpringFollow : public QObject,
Q_DECLARE_PRIVATE(QDeclarativeSpringFollow)
Q_INTERFACES(QDeclarativePropertyValueSource)
- Q_PROPERTY(qreal source READ sourceValue WRITE setSourceValue)
+ Q_PROPERTY(qreal to READ to WRITE setTo)
Q_PROPERTY(qreal velocity READ velocity WRITE setVelocity)
Q_PROPERTY(qreal spring READ spring WRITE setSpring)
Q_PROPERTY(qreal damping READ damping WRITE setDamping)
@@ -76,22 +76,30 @@ public:
virtual void setTarget(const QDeclarativeProperty &);
- qreal sourceValue() const;
- void setSourceValue(qreal value);
+ qreal to() const;
+ void setTo(qreal value);
+
qreal velocity() const;
void setVelocity(qreal velocity);
+
qreal spring() const;
void setSpring(qreal spring);
+
qreal damping() const;
void setDamping(qreal damping);
+
qreal epsilon() const;
void setEpsilon(qreal epsilon);
+
qreal mass() const;
void setMass(qreal modulus);
+
qreal modulus() const;
void setModulus(qreal modulus);
+
bool enabled() const;
void setEnabled(bool enabled);
+
bool inSync() const;
qreal value() const;
diff --git a/src/declarative/util/qdeclarativestate.cpp b/src/declarative/util/qdeclarativestate.cpp
index 5e6c35e..78813fa 100644
--- a/src/declarative/util/qdeclarativestate.cpp
+++ b/src/declarative/util/qdeclarativestate.cpp
@@ -74,6 +74,18 @@ QDeclarativeAction::QDeclarativeAction(QObject *target, const QString &propertyN
fromValue = property.read();
}
+QDeclarativeAction::QDeclarativeAction(QObject *target, const QString &propertyName,
+ QDeclarativeContext *context, const QVariant &value)
+: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false),
+ property(target, propertyName, context), toValue(value),
+ fromBinding(0), toBinding(0), event(0),
+ specifiedObject(target), specifiedProperty(propertyName)
+{
+ if (property.isValid())
+ fromValue = property.read();
+}
+
+
QDeclarativeActionEvent::~QDeclarativeActionEvent()
{
}
@@ -121,14 +133,13 @@ QDeclarativeStateOperation::QDeclarativeStateOperation(QObjectPrivate &dd, QObje
/*!
\qmlclass State QDeclarativeState
- \since 4.7
+ \since 4.7
\brief The State element defines configurations of objects and properties.
A state is specified as a set of batched changes from the default configuration.
- Note that setting the state of an object from within another state of the same object is
- inadvisible. Not only would this have the same effect as going directly to the second state
- it may cause the program to crash.
+ \note setting the state of an object from within another state of the same object is
+ not allowed.
\sa {qmlstates}{States}, {state-transitions}{Transitions}
*/
@@ -191,6 +202,17 @@ bool QDeclarativeState::isWhenKnown() const
This should be set to an expression that evaluates to true when you want the state to
be applied.
+
+ If multiple states in a group have \c when clauses that evaluate to true at the same time,
+ the first matching state will be applied. For example, in the following snippet
+ \c state1 will always be selected rather than \c state2 when sharedCondition becomes
+ \c true.
+ \qml
+ states: [
+ State { name: "state1"; when: sharedCondition },
+ State { name: "state2"; when: sharedCondition }
+ ]
+ \endqml
*/
QDeclarativeBinding *QDeclarativeState::when() const
{
diff --git a/src/declarative/util/qdeclarativestate_p.h b/src/declarative/util/qdeclarativestate_p.h
index ee2b7e8..472897e 100644
--- a/src/declarative/util/qdeclarativestate_p.h
+++ b/src/declarative/util/qdeclarativestate_p.h
@@ -61,6 +61,8 @@ class Q_DECLARATIVE_EXPORT QDeclarativeAction
public:
QDeclarativeAction();
QDeclarativeAction(QObject *, const QString &, const QVariant &);
+ QDeclarativeAction(QObject *, const QString &,
+ QDeclarativeContext *, const QVariant &);
bool restore:1;
bool actionDone:1;
diff --git a/src/declarative/util/qdeclarativestateoperations.cpp b/src/declarative/util/qdeclarativestateoperations.cpp
index 2cc1fcc..410a269 100644
--- a/src/declarative/util/qdeclarativestateoperations.cpp
+++ b/src/declarative/util/qdeclarativestateoperations.cpp
@@ -1090,6 +1090,9 @@ bool QDeclarativeAnchorChanges::changesBindings()
void QDeclarativeAnchorChanges::saveOriginals()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->origLeft = d->target->anchors()->left();
d->origRight = d->target->anchors()->right();
d->origHCenter = d->target->anchors()->horizontalCenter();
@@ -1146,6 +1149,9 @@ void QDeclarativeAnchorChanges::copyOriginals(QDeclarativeActionEvent *other)
void QDeclarativeAnchorChanges::clearBindings()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->fromX = d->target->x();
d->fromY = d->target->y();
d->fromWidth = d->target->width();
@@ -1242,6 +1248,9 @@ void QDeclarativeAnchorChanges::rewind()
void QDeclarativeAnchorChanges::saveCurrentValues()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->rewindLeft = d->target->anchors()->left();
d->rewindRight = d->target->anchors()->right();
d->rewindHCenter = d->target->anchors()->horizontalCenter();
@@ -1259,6 +1268,9 @@ void QDeclarativeAnchorChanges::saveCurrentValues()
void QDeclarativeAnchorChanges::saveTargetValues()
{
Q_D(QDeclarativeAnchorChanges);
+ if (!d->target)
+ return;
+
d->toX = d->target->x();
d->toY = d->target->y();
d->toWidth = d->target->width();
diff --git a/src/declarative/util/qdeclarativeutilmodule.cpp b/src/declarative/util/qdeclarativeutilmodule.cpp
index d4c72bd..b9f1abb 100644
--- a/src/declarative/util/qdeclarativeutilmodule.cpp
+++ b/src/declarative/util/qdeclarativeutilmodule.cpp
@@ -46,6 +46,7 @@
#include "private/qdeclarativebind_p.h"
#include "private/qdeclarativeconnections_p.h"
#include "private/qdeclarativesmoothedanimation_p.h"
+#include "private/qdeclarativesmoothedfollow_p.h"
#include "private/qdeclarativefontloader_p.h"
#include "private/qdeclarativelistaccessor_p.h"
#include "private/qdeclarativelistmodel_p.h"
@@ -71,38 +72,6 @@
#include "private/qdeclarativexmllistmodel_p.h"
#endif
-template<typename T>
-int qmlRegisterTypeEnums(const char *qmlName)
-{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QDeclarativeListProperty<" + name + ">");
-
- QDeclarativePrivate::RegisterType type = {
- 0,
-
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QDeclarativeListProperty<T> >(listName.constData()),
- 0, 0,
-
- "Qt", 4, 6, qmlName, &T::staticMetaObject,
-
- QDeclarativePrivate::attachedPropertiesFunc<T>(),
- QDeclarativePrivate::attachedPropertiesMetaObject<T>(),
-
- QDeclarativePrivate::StaticCastSelector<T,QDeclarativeParserStatus>::cast(),
- QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueSource>::cast(),
- QDeclarativePrivate::StaticCastSelector<T,QDeclarativePropertyValueInterceptor>::cast(),
-
- 0, 0,
-
- 0
- };
-
- return QDeclarativePrivate::registerType(type);
-}
-
void QDeclarativeUtilModule::defineModule()
{
qmlRegisterType<QDeclarativeAnchorAnimation>("Qt",4,6,"AnchorAnimation");
@@ -112,6 +81,7 @@ void QDeclarativeUtilModule::defineModule()
qmlRegisterType<QDeclarativeColorAnimation>("Qt",4,6,"ColorAnimation");
qmlRegisterType<QDeclarativeConnections>("Qt",4,6,"Connections");
qmlRegisterType<QDeclarativeSmoothedAnimation>("Qt",4,6,"SmoothedAnimation");
+ qmlRegisterType<QDeclarativeSmoothedFollow>("Qt",4,6,"SmoothedFollow");
qmlRegisterType<QDeclarativeFontLoader>("Qt",4,6,"FontLoader");
qmlRegisterType<QDeclarativeListElement>("Qt",4,6,"ListElement");
qmlRegisterType<QDeclarativeNumberAnimation>("Qt",4,6,"NumberAnimation");
@@ -142,7 +112,7 @@ void QDeclarativeUtilModule::defineModule()
qmlRegisterType<QDeclarativeStateOperation>();
qmlRegisterType<QDeclarativeAnchorSet>();
- qmlRegisterTypeEnums<QDeclarativeAbstractAnimation>("Animation");
+ qmlRegisterUncreatableType<QDeclarativeAbstractAnimation>("Qt",4,6,"Animation");
qmlRegisterCustomType<QDeclarativeListModel>("Qt", 4,6, "ListModel", "QDeclarativeListModel",
new QDeclarativeListModelParser);
diff --git a/src/declarative/util/qdeclarativexmllistmodel.cpp b/src/declarative/util/qdeclarativexmllistmodel.cpp
index b33af06..7f8b962 100644
--- a/src/declarative/util/qdeclarativexmllistmodel.cpp
+++ b/src/declarative/util/qdeclarativexmllistmodel.cpp
@@ -160,7 +160,7 @@ public:
for (int i=0; i<roleObjects->count(); i++) {
if (!roleObjects->at(i)->isValid()) {
- job.roleQueries << "";
+ job.roleQueries << QString();
continue;
}
job.roleQueries << roleObjects->at(i)->query();
diff --git a/src/declarative/util/util.pri b/src/declarative/util/util.pri
index 4163596..f20bba1 100644
--- a/src/declarative/util/util.pri
+++ b/src/declarative/util/util.pri
@@ -9,6 +9,7 @@ SOURCES += \
$$PWD/qdeclarativesystempalette.cpp \
$$PWD/qdeclarativespringfollow.cpp \
$$PWD/qdeclarativesmoothedanimation.cpp \
+ $$PWD/qdeclarativesmoothedfollow.cpp \
$$PWD/qdeclarativestate.cpp\
$$PWD/qdeclarativetransitionmanager.cpp \
$$PWD/qdeclarativestateoperations.cpp \
@@ -38,6 +39,7 @@ HEADERS += \
$$PWD/qdeclarativesystempalette_p.h \
$$PWD/qdeclarativespringfollow_p.h \
$$PWD/qdeclarativesmoothedanimation_p.h \
+ $$PWD/qdeclarativesmoothedfollow_p.h \
$$PWD/qdeclarativesmoothedanimation_p_p.h \
$$PWD/qdeclarativestate_p.h\
$$PWD/qdeclarativestateoperations_p.h \