aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2011-06-21 15:51:55 +1000
committerAndrew den Exter <andrew.den-exter@nokia.com>2011-06-21 16:13:21 +1000
commit6cc53afcd5ae36575e1f59e51640218a0794ac3e (patch)
tree32f44e5090bb36b1091c938ae0ba048631949bd4
parent088bf47172eedb19945bf1e5eba6f036a362d2dc (diff)
Allow ParentAnimations to be used in ListView add transitions.
-rw-r--r--examples/declarative/modelviews/visualdatamodel/visualdatamodel.qml5
-rw-r--r--src/declarative/items/qsganimation.cpp7
-rw-r--r--src/declarative/items/qsganimation_p.h6
-rw-r--r--src/declarative/items/qsglistview.cpp38
4 files changed, 38 insertions, 18 deletions
diff --git a/examples/declarative/modelviews/visualdatamodel/visualdatamodel.qml b/examples/declarative/modelviews/visualdatamodel/visualdatamodel.qml
index 6602459071..528f89cb79 100644
--- a/examples/declarative/modelviews/visualdatamodel/visualdatamodel.qml
+++ b/examples/declarative/modelviews/visualdatamodel/visualdatamodel.qml
@@ -37,7 +37,10 @@ Rectangle {
spacing: 5
add: Transition {
- NumberAnimation { properties: "y"; easing.type: Easing.InOutQuad; duration: 1500 }
+ ParentAnimation {
+ via: root
+ NumberAnimation { properties: "x,y"; easing.type: Easing.InOutQuad; duration: 1500 }
+ }
}
model: VisualItemModel {
diff --git a/src/declarative/items/qsganimation.cpp b/src/declarative/items/qsganimation.cpp
index ad6ed030fd..eceff81c7f 100644
--- a/src/declarative/items/qsganimation.cpp
+++ b/src/declarative/items/qsganimation.cpp
@@ -151,7 +151,8 @@ QPointF QSGParentAnimationPrivate::computeTransformOrigin(QSGItem::TransformOrig
void QSGParentAnimation::transition(QDeclarativeStateActions &actions,
QDeclarativeProperties &modified,
- TransitionDirection direction)
+ TransitionDirection direction,
+ const QObjectList &)
{
Q_D(QSGParentAnimation);
@@ -209,7 +210,6 @@ void QSGParentAnimation::transition(QDeclarativeStateActions &actions,
QDeclarativeAction &action = actions[i];
if (action.event && action.event->typeName() == QLatin1String("ParentChange")
&& (!d->target || static_cast<QSGParentChange*>(action.event)->object() == d->target)) {
-
QSGParentChange *pc = static_cast<QSGParentChange*>(action.event);
QDeclarativeAction myAction = action;
data->reverse = action.reverseEvent;
@@ -406,7 +406,8 @@ void QSGAnchorAnimation::setEasing(const QEasingCurve &e)
void QSGAnchorAnimation::transition(QDeclarativeStateActions &actions,
QDeclarativeProperties &modified,
- TransitionDirection direction)
+ TransitionDirection direction,
+ const QObjectList &)
{
Q_UNUSED(modified);
Q_D(QSGAnchorAnimation);
diff --git a/src/declarative/items/qsganimation_p.h b/src/declarative/items/qsganimation_p.h
index 7c63331cfe..61e51731ec 100644
--- a/src/declarative/items/qsganimation_p.h
+++ b/src/declarative/items/qsganimation_p.h
@@ -86,7 +86,8 @@ Q_SIGNALS:
protected:
virtual void transition(QDeclarativeStateActions &actions,
QDeclarativeProperties &modified,
- TransitionDirection direction);
+ TransitionDirection direction,
+ const QObjectList &defaultTargets = QObjectList());
virtual QAbstractAnimation *qtAnimation();
};
@@ -118,7 +119,8 @@ Q_SIGNALS:
protected:
virtual void transition(QDeclarativeStateActions &actions,
QDeclarativeProperties &modified,
- TransitionDirection direction);
+ TransitionDirection direction,
+ const QObjectList &defaultTargets = QObjectList());
virtual QAbstractAnimation *qtAnimation();
};
diff --git a/src/declarative/items/qsglistview.cpp b/src/declarative/items/qsglistview.cpp
index 8ebb819f48..e2c148284d 100644
--- a/src/declarative/items/qsglistview.cpp
+++ b/src/declarative/items/qsglistview.cpp
@@ -54,6 +54,7 @@
#include <private/qdeclarativesmoothedanimation_p_p.h>
#include <private/qlistmodelinterface_p.h>
#include <private/qdeclarativetransitionmanager_p_p.h>
+#include <private/qsgstateoperations_p.h>
QT_BEGIN_NAMESPACE
@@ -227,13 +228,13 @@ class ListViewTransitionManager : public QDeclarativeTransitionManager
public:
~ListViewTransitionManager();
- void addItem(FxListItemSG *item, const QPointF &pos);
+ void addItem(FxListItemSG *item, const QPointF &pos, QSGItem *parentItem);
void startTransition();
bool isActive() const;
void itemReleased(FxListItemSG *);
- static ListViewTransitionManager *getManager(QSGListViewPrivate *p, QDeclarativeComponent *transitionComponent);
+ static ListViewTransitionManager *getManager(QSGListViewPrivate *p, QDeclarativeComponent *transitionComponent, QDeclarativeContext *context);
protected:
virtual void finished();
@@ -751,9 +752,8 @@ FxListItemSG *QSGListViewPrivate::createItem(int modelIndex)
listItem->item->setParentItem(q->contentItem());
model->completeItem();
} else {
- if (item->parentItem())
- item->setPos(q->contentItem()->mapFromItem(item->parentItem(), item->pos()));
- listItem->item->setParentItem(q->contentItem());
+ if (!item->parentItem())
+ listItem->item->setParentItem(q->contentItem());
}
QSGItemPrivate *itemPrivate = QSGItemPrivate::get(item);
itemPrivate->addItemChangeListener(this, QSGItemPrivate::Geometry);
@@ -1649,12 +1649,21 @@ bool ListViewTransitionManager::isActive() const
return listItems.count() > 0;
}
-void ListViewTransitionManager::addItem(FxListItemSG *item, const QPointF &pos)
+void ListViewTransitionManager::addItem(FxListItemSG *item, const QPointF &pos, QSGItem *parentItem)
{
item->posTransition = this;
item->posAfterTransition = pos;
listItems << item;
+ if (item->item->parentItem() != parentItem) {
+ QSGParentChange *pc = new QSGParentChange(item->item);
+ pc->setObject(item->item);
+ pc->setParent(parentItem);
+ QDeclarativeAction pcAction;
+ pcAction.specifiedObject = item->item;
+ pcAction.event = pc;
+ actions << pcAction;
+ }
actions << QDeclarativeAction(item->item, QLatin1String("x"), QVariant(pos.x()));
actions << QDeclarativeAction(item->item, QLatin1String("y"), QVariant(pos.y()));
@@ -1692,18 +1701,23 @@ void ListViewTransitionManager::finished()
delete this;
}
-ListViewTransitionManager *ListViewTransitionManager::getManager(QSGListViewPrivate *p, QDeclarativeComponent *transitionComponent)
+ListViewTransitionManager *ListViewTransitionManager::getManager(QSGListViewPrivate *p, QDeclarativeComponent *transitionComponent, QDeclarativeContext *context)
{
static ListViewTransitionManager *defaultManager = 0;
if (!defaultManager) {
- defaultManager = new ListViewTransitionManager(p, false,
- qobject_cast<QDeclarativeTransition*>(transitionComponent->create()));
+ QDeclarativeContext *c = new QDeclarativeContext(context);
+ QDeclarativeTransition *transition = qobject_cast<QDeclarativeTransition*>(transitionComponent->create(c));
+ defaultManager = new ListViewTransitionManager(p, false, transition);
+ c->setParent(transition);
}
if (!defaultManager->isActive())
return defaultManager;
- return new ListViewTransitionManager(p, true, qobject_cast<QDeclarativeTransition*>(transitionComponent->create()));
+ QDeclarativeContext *c = new QDeclarativeContext(context);
+ QDeclarativeTransition *transition = qobject_cast<QDeclarativeTransition*>(transitionComponent->create(c));
+ c->setParent(transition);
+ return new ListViewTransitionManager(p, true, transition);
}
@@ -2898,7 +2912,7 @@ void QSGListView::itemsInserted(int modelIndex, int count)
int diff = 0;
QList<FxListItemSG*> added;
ListViewTransitionManager *transition = d->addTransitionComponent ?
- ListViewTransitionManager::getManager(d, d->addTransitionComponent) : 0;
+ ListViewTransitionManager::getManager(d, d->addTransitionComponent, qmlContext(this)) : 0;
bool addedVisible = false;
FxListItemSG *firstVisible = d->firstVisibleItem();
if (firstVisible && pos < firstVisible->position()) {
@@ -2944,7 +2958,7 @@ void QSGListView::itemsInserted(int modelIndex, int count)
FxListItemSG *item = d->createItem(modelIndex + i);
d->visibleItems.insert(index, item);
if (transition) {
- transition->addItem(item, item->positionIfMovedTo(pos, true));
+ transition->addItem(item, item->positionIfMovedTo(pos, true), contentItem());
d->indexesInTransition.insert(item->index);
} else {
item->setPosition(pos);