diff options
author | Marius Bugge Monsen <mmonsen@trolltech.com> | 2009-06-02 19:43:36 +0200 |
---|---|---|
committer | Marius Bugge Monsen <mmonsen@trolltech.com> | 2009-06-02 19:43:36 +0200 |
commit | c90d1a71b71a63ea5c8e7d731e2a1cb14e64ff74 (patch) | |
tree | 239936b3a3eb5472fa746bafc8614fa98370bbd3 | |
parent | a23b6831751d9979ae7a4b6bb15190160526c21f (diff) |
Add some animation to the photoAlbum example.
-rw-r--r-- | examples/photoAlbum/main.cpp | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/examples/photoAlbum/main.cpp b/examples/photoAlbum/main.cpp index 3f47cb5..10c2d68 100644 --- a/examples/photoAlbum/main.cpp +++ b/examples/photoAlbum/main.cpp @@ -27,6 +27,8 @@ #include <qlistdefaultmodel.h> #include <qlistselectionmanager.h> #include <qkineticlistcontroller.h> +#include <qsequentialanimationgroup.h> +#include <qparallelanimationgroup.h> #include <qpropertyanimation.h> class Photo : public QtGraphicsListViewItem @@ -71,34 +73,72 @@ void Photo::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWi painter->drawPixmap(aligned, pixmap, pixmap.rect()); } +// ### FIXME use state-machine + class Switcher : public QObject { Q_OBJECT public: Switcher(QtGraphicsGridView *grid, QtGraphicsListView *list, QObject *parent = 0) - : QObject(parent), grid(grid), list(list), photo(0) { animation.setPropertyName("geometry"); } + : QObject(parent), gridView(grid), listView(list), geometryAnimation(0) + { + geometryAnimation = new QPropertyAnimation(0, "geometry", this); // unknown target + connect(geometryAnimation, SIGNAL(finished()), this, SLOT(finished())); + geometryAnimation->setEasingCurve(QEasingCurve::OutElastic); + geometryAnimation->setDuration(500); + // ### FIXME: animate zValue too + } ~Switcher() {} public slots: void gridItemClicked(int index) { - grid->hide(); - list->setHorizontalOffset(index * list->size().width()); // ### ensure visible - list->show(); - // ### start animation + listView->setHorizontalOffset(index * listView->size().width()); // ### ensure visible + QtGraphicsListViewItem *from = itemForIndex(gridView, index); + QtGraphicsListViewItem *to = itemForIndex(listView, index); + if (from && to) { + geometryAnimation->setTargetObject(to); + geometryAnimation->setStartValue(from->geometry()); + geometryAnimation->setEndValue(to->geometry()); + } + listView->setLayoutsBlocked(true); + gridView->setLayoutsBlocked(true); + listView->show(); + gridView->hide(); + geometryAnimation->start(); } + void listItemClicked(int index) { - Q_UNUSED(index); - list->hide(); - grid->setHorizontalOffset(0); - grid->show(); - // ### start animation + //gridView->setVerticalOffset(0); // ### ensure visible + QtGraphicsListViewItem *from = itemForIndex(listView, index); + QtGraphicsListViewItem *to = itemForIndex(gridView, index); + if (from && to) { + geometryAnimation->setTargetObject(to); + geometryAnimation->setStartValue(from->geometry()); + geometryAnimation->setEndValue(to->geometry()); + } + gridView->setLayoutsBlocked(true); + listView->setLayoutsBlocked(true); + gridView->show(); + listView->hide(); + geometryAnimation->start(); + } + + void finished() { listView->setLayoutsBlocked(false); gridView->setLayoutsBlocked(false); } + +protected: + QtGraphicsListViewItem * itemForIndex(QtGraphicsListView *view, int index) const + { + const QList<QtGraphicsListViewItem*> items = view->visibleItems(); + for (int i = 0; i < items.count(); ++i) + if (items.at(i)->index() == index) + return items.at(i); + return 0; } private: - QtGraphicsGridView *grid; - QtGraphicsListView *list; - Photo *photo; - QPropertyAnimation animation; + QtGraphicsGridView *gridView; + QtGraphicsListView *listView; + QPropertyAnimation *geometryAnimation; }; int main(int argc, char *argv[]) @@ -159,7 +199,7 @@ int main(int argc, char *argv[]) gridView->setItemCreator(new QtGraphicsListViewItemCreator<Photo>()); gridView->setGeometry(0, 0, 640, 480); //gridView->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true); // ### - gridView->hide(); + gridView->hide(); // starts out hidden gridController->setView(gridView); gridController->setModel(model); |