summaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
authorWarwick Allison <warwick.allison@nokia.com>2009-10-28 00:21:01 (GMT)
committerWarwick Allison <warwick.allison@nokia.com>2009-10-28 00:21:01 (GMT)
commit01885076b037bdd6624744fe67b7de849f26fef3 (patch)
tree9f78647a3e07c31c3dca359472e59fce50c387cf /src/declarative
parentd72970e54390f00be28efaac148b55f027a1eb69 (diff)
parent5f9091771eaa26db5ad35e4788c13ac011512b61 (diff)
downloadQt-01885076b037bdd6624744fe67b7de849f26fef3.zip
Qt-01885076b037bdd6624744fe67b7de849f26fef3.tar.gz
Qt-01885076b037bdd6624744fe67b7de849f26fef3.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Diffstat (limited to 'src/declarative')
-rw-r--r--src/declarative/fx/qfxflickable.cpp26
-rw-r--r--src/declarative/fx/qfxflickable.h4
-rw-r--r--src/declarative/fx/qfxflickable_p.h5
-rw-r--r--src/declarative/fx/qfxlistview.cpp68
-rw-r--r--src/declarative/fx/qfxrepeater.cpp12
-rw-r--r--src/declarative/qml/qmlcompiler.cpp1
-rw-r--r--src/declarative/qml/qmlvmemetaobject.cpp6
7 files changed, 111 insertions, 11 deletions
diff --git a/src/declarative/fx/qfxflickable.cpp b/src/declarative/fx/qfxflickable.cpp
index cbfe9f6..92e79dd 100644
--- a/src/declarative/fx/qfxflickable.cpp
+++ b/src/declarative/fx/qfxflickable.cpp
@@ -157,7 +157,7 @@ QFxFlickablePrivate::QFxFlickablePrivate()
: viewport(new QFxItem), _moveX(viewport, &QFxItem::setX), _moveY(viewport, &QFxItem::setY)
, vWidth(-1), vHeight(-1), overShoot(true), flicked(false), moving(false), stealMouse(false)
, pressed(false), atXEnd(false), atXBeginning(true), atYEnd(false), atYBeginning(true)
- , interactive(true), maxVelocity(5000), reportedVelocitySmoothing(100)
+ , interactive(true), deceleration(500), maxVelocity(5000), reportedVelocitySmoothing(100)
, delayedPressEvent(0), delayedPressTarget(0), pressDelay(0)
, horizontalVelocity(this), verticalVelocity(this), vTime(0), visibleArea(0)
{
@@ -202,7 +202,7 @@ void QFxFlickablePrivate::flickX(qreal velocity)
v = maxVelocity;
}
timeline.reset(_moveX);
- timeline.accel(_moveX, v, 500, maxDistance);
+ timeline.accel(_moveX, v, deceleration, maxDistance);
timeline.execute(fixupXEvent);
if (!flicked) {
flicked = true;
@@ -238,7 +238,7 @@ void QFxFlickablePrivate::flickY(qreal velocity)
v = maxVelocity;
}
timeline.reset(_moveY);
- timeline.accel(_moveY, v, 500, maxDistance);
+ timeline.accel(_moveY, v, deceleration, maxDistance);
timeline.execute(fixupYEvent);
if (!flicked) {
flicked = true;
@@ -1131,7 +1131,7 @@ bool QFxFlickable::sceneEventFilter(QGraphicsItem *i, QEvent *e)
}
/*!
- \qmlproperty int Flickable::maximumFlickVelocity
+ \qmlproperty real Flickable::maximumFlickVelocity
This property holds the maximum velocity that the user can flick the view in pixels/second.
The default is 5000 pixels/s
@@ -1150,6 +1150,24 @@ void QFxFlickable::setMaximumFlickVelocity(qreal v)
d->maxVelocity = v;
}
+/*!
+ \qmlproperty real Flickable::maximumFlickVelocity
+ This property holds the rate at which a flick will decelerate.
+
+ The default is 500.
+*/
+qreal QFxFlickable::flickDeceleration() const
+{
+ Q_D(const QFxFlickable);
+ return d->deceleration;
+}
+
+void QFxFlickable::setFlickDeceleration(qreal deceleration)
+{
+ Q_D(QFxFlickable);
+ d->deceleration = deceleration;
+}
+
bool QFxFlickable::isFlicking() const
{
Q_D(const QFxFlickable);
diff --git a/src/declarative/fx/qfxflickable.h b/src/declarative/fx/qfxflickable.h
index aaf4e0f..4c80e8f 100644
--- a/src/declarative/fx/qfxflickable.h
+++ b/src/declarative/fx/qfxflickable.h
@@ -67,6 +67,7 @@ class Q_DECLARATIVE_EXPORT QFxFlickable : public QFxItem
Q_PROPERTY(bool overShoot READ overShoot WRITE setOverShoot)
Q_PROPERTY(qreal maximumFlickVelocity READ maximumFlickVelocity WRITE setMaximumFlickVelocity)
+ Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration)
Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged)
Q_PROPERTY(bool flicking READ isFlicking NOTIFY flickingChanged)
@@ -118,6 +119,9 @@ public:
qreal maximumFlickVelocity() const;
void setMaximumFlickVelocity(qreal);
+ qreal flickDeceleration() const;
+ void setFlickDeceleration(qreal);
+
bool isInteractive() const;
void setInteractive(bool);
diff --git a/src/declarative/fx/qfxflickable_p.h b/src/declarative/fx/qfxflickable_p.h
index 7224f21..07d66b8 100644
--- a/src/declarative/fx/qfxflickable_p.h
+++ b/src/declarative/fx/qfxflickable_p.h
@@ -70,8 +70,8 @@ class QFxFlickablePrivate : public QFxItemPrivate
public:
QFxFlickablePrivate();
void init();
- void flickX(qreal velocity);
- void flickY(qreal velocity);
+ virtual void flickX(qreal velocity);
+ virtual void flickY(qreal velocity);
virtual void fixupX();
virtual void fixupY();
void updateBeginningEnd();
@@ -106,6 +106,7 @@ public:
QTime pressTime;
QmlTimeLineEvent fixupXEvent;
QmlTimeLineEvent fixupYEvent;
+ qreal deceleration;
qreal maxVelocity;
QTime velocityTime;
QPointF lastFlickablePosition;
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index 28d2bb2..fbb91b1 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -287,6 +287,11 @@ public:
return index;
}
+ //XXX Rough. Only works for fixed size items.
+ qreal snapPosAt(qreal pos) {
+ return qRound((pos - startPosition()) / averageSize) * averageSize + startPosition();
+ }
+
int lastVisibleIndex() const {
int lastIndex = -1;
for (int i = visibleItems.count()-1; i >= 0; --i) {
@@ -365,6 +370,8 @@ public:
void fixupPosition();
virtual void fixupY();
virtual void fixupX();
+ virtual void flickX(qreal velocity);
+ virtual void flickY(qreal velocity);
QFxVisualModel *model;
QVariant modelVariant;
@@ -750,7 +757,6 @@ void QFxListViewPrivate::updateCurrent(int modelIndex)
updateHighlight();
return;
}
-
FxListItem *oldCurrentItem = currentItem;
currentIndex = modelIndex;
currentItem = createItem(modelIndex);
@@ -822,6 +828,66 @@ void QFxListViewPrivate::fixupX()
}
}
+void QFxListViewPrivate::flickX(qreal velocity)
+{
+ Q_Q(QFxListView);
+
+ if (!haveHighlightRange || highlightRange != QFxListView::StrictlyEnforceRange)
+ QFxFlickablePrivate::flickX(velocity);
+
+ qreal maxDistance = -1;
+ // -ve velocity means list is moving up
+ if (velocity > 0) {
+ if (_moveX.value() < q->minXExtent())
+ maxDistance = qAbs(q->minXExtent() -_moveX.value() + (overShoot?30:0));
+ flickTargetX = q->minXExtent();
+ } else {
+ if (_moveX.value() > q->maxXExtent())
+ maxDistance = qAbs(q->maxXExtent() - _moveX.value()) + (overShoot?30:0);
+ flickTargetX = q->maxXExtent();
+ }
+ if (maxDistance > 0) {
+ qreal v = velocity;
+ if (maxVelocity != -1 && maxVelocity < qAbs(v)) {
+ if (v < 0)
+ v = -maxVelocity;
+ else
+ v = maxVelocity;
+ }
+ qreal accel = deceleration;
+ qreal maxAccel = (v * v) / (2.0f * maxDistance);
+ if (maxAccel < accel) {
+ // If we are not flicking to the end then attempt to stop exactly on an item boundary
+ qreal dist = (v * v) / accel / 2.0;
+ if (v > 0)
+ dist = -dist;
+ dist = -_moveX.value() - snapPosAt(-_moveX.value() + dist + highlightRangeStart);
+ if (v < 0 && dist >= 0 || v > 0 && dist <= 0) {
+ timeline.reset(_moveX);
+ fixupX();
+ return;
+ }
+ accel = (v * v) / (2.0f * qAbs(dist));
+ }
+ timeline.reset(_moveX);
+ timeline.accel(_moveX, v, accel, maxDistance);
+ timeline.execute(fixupXEvent);
+ if (!flicked) {
+ flicked = true;
+ emit q->flickingChanged();
+ emit q->flickStarted();
+ }
+ } else {
+ timeline.reset(_moveX);
+ fixupX();
+ }
+}
+
+void QFxListViewPrivate::flickY(qreal velocity)
+{
+ QFxFlickablePrivate::flickY(velocity);
+}
+
//----------------------------------------------------------------------------
/*!
diff --git a/src/declarative/fx/qfxrepeater.cpp b/src/declarative/fx/qfxrepeater.cpp
index 182dcc7..94954e7 100644
--- a/src/declarative/fx/qfxrepeater.cpp
+++ b/src/declarative/fx/qfxrepeater.cpp
@@ -72,10 +72,18 @@ QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,Repeater,QFxRepeater)
The model may be either an object list, a string list, a number or a Qt model.
In each case, the data element and the index is exposed to each instantiated
- component. The index is always exposed as an accessible \c index property.
+ component.
+
+ The index is always exposed as an accessible \c index property.
In the case of an object or string list, the data element (of type string
or object) is available as the \c modelData property. In the case of a Qt model,
- all roles are available as named properties just like in the view classes.
+ all roles are available as named properties just like in the view classes. The
+ following example shows how to use the index property inside the instantiated
+ items.
+
+ \snippet doc/src/snippets/declarative/repeater-index.qml 0
+
+ \image repeater-index.png
Items instantiated by the Repeater are inserted, in order, as
children of the Repeater's parent. The insertion starts immediately after
diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp
index 60282dc..ad74446 100644
--- a/src/declarative/qml/qmlcompiler.cpp
+++ b/src/declarative/qml/qmlcompiler.cpp
@@ -2234,6 +2234,7 @@ bool QmlCompiler::buildDynamicMeta(QmlParser::Object *obj, DynamicMetaMode mode)
}
sig.append(")");
QMetaMethodBuilder b = builder.addSlot(sig);
+ b.setReturnType("QVariant");
b.setParameterNames(s.parameterNames);
((QmlVMEMetaData *)dynamicData.data())->methodCount++;
diff --git a/src/declarative/qml/qmlvmemetaobject.cpp b/src/declarative/qml/qmlvmemetaobject.cpp
index 3e1d931..83f904b 100644
--- a/src/declarative/qml/qmlvmemetaobject.cpp
+++ b/src/declarative/qml/qmlvmemetaobject.cpp
@@ -269,10 +269,11 @@ int QmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
QString code = QString::fromRawData(body, data->bodyLength);
+ QVariant rv;
if (0 == (metaData->methodData() + id)->parameterCount) {
QmlExpression expr(ctxt, code, object);
expr.setTrackChange(false);
- expr.value();
+ rv = expr.value();
} else {
QmlContext newCtxt(ctxt);
QMetaMethod m = method(_id);
@@ -281,8 +282,9 @@ int QmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
newCtxt.setContextProperty(QString::fromLatin1(names.at(ii)), *(QVariant *)a[ii + 1]);
QmlExpression expr(&newCtxt, code, object);
expr.setTrackChange(false);
- expr.value();
+ rv = expr.value();
}
+ if (a[0]) *reinterpret_cast<QVariant *>(a[0]) = rv;
}
return -1;
}