diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2011-06-21 15:51:55 +1000 |
---|---|---|
committer | Andrew den Exter <andrew.den-exter@nokia.com> | 2011-06-21 16:13:21 +1000 |
commit | 6cc53afcd5ae36575e1f59e51640218a0794ac3e (patch) | |
tree | 32f44e5090bb36b1091c938ae0ba048631949bd4 | |
parent | 088bf47172eedb19945bf1e5eba6f036a362d2dc (diff) |
Allow ParentAnimations to be used in ListView add transitions.
-rw-r--r-- | examples/declarative/modelviews/visualdatamodel/visualdatamodel.qml | 5 | ||||
-rw-r--r-- | src/declarative/items/qsganimation.cpp | 7 | ||||
-rw-r--r-- | src/declarative/items/qsganimation_p.h | 6 | ||||
-rw-r--r-- | src/declarative/items/qsglistview.cpp | 38 |
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); |