summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Bugge Monsen <mmonsen@trolltech.com>2009-05-28 15:14:25 +0200
committerMarius Bugge Monsen <mmonsen@trolltech.com>2009-05-28 15:14:25 +0200
commit203f6100eea1b75e50e7cb7d57836decbc8d4819 (patch)
tree38224e46bf1224ae8d11bc0c7384b2f8e62130f3
parentbf6d287025d24dfa36523b5eaf9464c6168cf811 (diff)
Start expanding the photoAlbum example to include a grid view too.
-rw-r--r--examples/photoAlbum/main.cpp123
1 files changed, 102 insertions, 21 deletions
diff --git a/examples/photoAlbum/main.cpp b/examples/photoAlbum/main.cpp
index c2120f3..4edba9d 100644
--- a/examples/photoAlbum/main.cpp
+++ b/examples/photoAlbum/main.cpp
@@ -22,10 +22,12 @@
****************************************************************************/
#include <QtGui>
-#include <qlistwidgetng.h>
-#include <qkineticlistcontroller.h>
#include <qgraphicslistview.h>
+#include <qgraphicsgridview.h>
#include <qlistdefaultmodel.h>
+#include <qlistselectionmanager.h>
+#include <qkineticlistcontroller.h>
+#include <qpropertyanimation.h>
class Photo : public QtGraphicsListViewItem
{
@@ -44,42 +46,73 @@ QSizeF Photo::sizeHint(int index, const QStyleOptionViewItemV4 *option, Qt::Size
{
Q_UNUSED(option);
Q_UNUSED(index);
- Q_UNUSED(which);
Q_UNUSED(constraint);
- return QSizeF(640, 480);
+ switch (which) {
+ case Qt::MinimumSize:
+ return QSizeF(1, 1);
+ case Qt::PreferredSize:
+ return QSizeF(640, 480).boundedTo(constraint);
+ case Qt::MaximumSize:
+ return constraint;
+ default:
+ break;
+ }
+ return QSize();
}
void Photo::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
- Q_UNUSED(option);
Q_UNUSED(widget);
const QPixmap pixmap = qvariant_cast<QPixmap>(data().value(Qt::DecorationRole));
- painter->drawPixmap(70, 52, pixmap);
- painter->drawRect(69, 51, 501, 376);
+ const QSizeF bounded = pixmap.size().boundedTo(option->rect.size());
+ QSizeF scaled = pixmap.size();
+ scaled.scale(bounded, Qt::KeepAspectRatio);
+ const QRectF aligned = QStyle::alignedRect(option->direction, Qt::AlignCenter, scaled.toSize(), option->rect);
+ painter->drawPixmap(aligned, pixmap, pixmap.rect());
}
+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"); }
+ ~Switcher() {}
+
+public slots:
+ void gridItemClicked(int index) {
+ grid->hide();
+ list->setHorizontalOffset(index * list->size().width()); // ### ensure visible
+ list->show();
+ // ### start animation
+ }
+ void listItemClicked(int index) {
+ Q_UNUSED(index);
+ list->hide();
+ grid->setHorizontalOffset(0);
+ grid->show();
+ // ### start animation
+ }
+
+private:
+ QtGraphicsGridView *grid;
+ QtGraphicsListView *list;
+ Photo *photo;
+ QPropertyAnimation animation;
+};
+
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsView widget;
widget.setScene(new QGraphicsScene(&widget));
- widget.resize(QSize(648, 490));
+ widget.resize(QSize(640, 480));
widget.scene()->setSceneRect(0, 0, 640, 480);
- widget.setBackgroundBrush(QPixmap(":images/background.jpg"));
- QtGraphicsListView *view = new QtGraphicsListView(Qt::Horizontal);
- QtListDefaultModel *model = new QtListDefaultModel(&widget);
- QtKineticListController *controller = new QtKineticListController(&widget);
+ // data
- view->setItemCreator(new QtGraphicsListViewItemCreator<Photo>());
- view->setParent(controller);
- view->setGeometry(0, 0, 640, 480);
- view->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
- controller->setView(view);
- controller->setModel(model);
- controller->setHorizontalOvershootEnabled(true);
- controller->setCenterOnItemEnabled(true);
+ QtListDefaultModel *model = new QtListDefaultModel(&widget);
QtListDefaultItem *item = new QtListDefaultItem;
item->setData(QPixmap(":images/go.jpg"), Qt::DecorationRole);
@@ -101,8 +134,56 @@ int main(int argc, char *argv[])
item->setData(QPixmap(":images/beach.jpg"), Qt::DecorationRole);
model->appendItem(item);
- widget.scene()->addItem(view);
+ item = new QtListDefaultItem;
+ item->setData(QPixmap(":images/background.jpg"), Qt::DecorationRole);
+ model->appendItem(item);
+
+ // selections
+
+ QtListSelectionManager *selections = new QtListSelectionManager(&widget);
+
+ // views and controllers
+
+ QtGraphicsListView *listView = new QtGraphicsListView(Qt::Horizontal);
+ QtKineticListController *listController = new QtKineticListController(&widget);
+
+ listView->setItemCreator(new QtGraphicsListViewItemCreator<Photo>());
+ listView->setGeometry(0, 0, 640, 480);
+ //listView->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true); // ###
+ //listView->hide();
+
+ listController->setView(listView);
+ listController->setModel(model);
+ listController->setSelectionManager(selections);
+ listController->setHorizontalOvershootEnabled(true);
+ listController->setCenterOnItemEnabled(true);
+
+ QtGraphicsGridView *gridView = new QtGraphicsGridView(4, Qt::Vertical);
+ //QtKineticListController *gridController = new QtKineticListController(&widget);
+ QtListController *gridController = new QtListController(&widget);
+
+ gridView->setItemCreator(new QtGraphicsListViewItemCreator<Photo>());
+ gridView->setGeometry(0, 0, 640, 480);
+ //gridView->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true); // ###
+ gridView->hide();
+
+ gridController->setView(gridView);
+ gridController->setModel(model);
+ gridController->setSelectionManager(selections);
+ //gridController->setHorizontalOvershootEnabled(true);
+ //gridController->setCenterOnItemEnabled(true);
+
+ Switcher switcher(gridView, listView);
+ QObject::connect(listController, SIGNAL(itemClicked(int, Qt::MouseButton)),
+ &switcher, SLOT(listItemClicked(int)));
+ QObject::connect(gridController, SIGNAL(itemClicked(int, Qt::MouseButton)),
+ &switcher, SLOT(gridItemClicked(int)));
+
+ widget.scene()->addItem(listView);
+ widget.scene()->addItem(gridView);
widget.show();
return app.exec();
}
+
+#include "main.moc"