summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Bugge Monsen <mmonsen@trolltech.com>2009-06-02 19:43:36 +0200
committerMarius Bugge Monsen <mmonsen@trolltech.com>2009-06-02 19:43:36 +0200
commitc90d1a71b71a63ea5c8e7d731e2a1cb14e64ff74 (patch)
tree239936b3a3eb5472fa746bafc8614fa98370bbd3
parenta23b6831751d9979ae7a4b6bb15190160526c21f (diff)
Add some animation to the photoAlbum example.
-rw-r--r--examples/photoAlbum/main.cpp70
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);