/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtCore module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the either Technology Preview License Agreement or the ** Beta Release License Agreement. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://www.qtsoftware.com/contact. ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include class Pixmap : public QObject, public QGraphicsPixmapItem { Q_OBJECT Q_PROPERTY(QPointF pos READ pos WRITE setPos) public: Pixmap(const QPixmap &pix) : QObject(), QGraphicsPixmapItem(pix) { setCacheMode(DeviceCoordinateCache); } }; class Button : public QGraphicsWidget { Q_OBJECT public: Button(const QPixmap &pixmap, QGraphicsItem *parent = 0) : QGraphicsWidget(parent), _pix(pixmap) { setAcceptHoverEvents(true); setCacheMode(DeviceCoordinateCache); } QRectF boundingRect() const { return QRectF(-65, -65, 130, 130); } QPainterPath shape() const { QPainterPath path; path.addEllipse(boundingRect()); return path; } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) { bool down = option->state & QStyle::State_Sunken; QRectF r = boundingRect(); QLinearGradient grad(r.topLeft(), r.bottomRight()); grad.setColorAt(down ? 1 : 0, option->state & QStyle::State_MouseOver ? Qt::white : Qt::lightGray); grad.setColorAt(down ? 0 : 1, Qt::darkGray); painter->setPen(Qt::darkGray); painter->setBrush(grad); painter->drawEllipse(r); QLinearGradient grad2(r.topLeft(), r.bottomRight()); grad.setColorAt(down ? 1 : 0, Qt::darkGray); grad.setColorAt(down ? 0 : 1, Qt::lightGray); painter->setPen(Qt::NoPen); painter->setBrush(grad); if (down) painter->translate(2, 2); painter->drawEllipse(r.adjusted(5, 5, -5, -5)); painter->drawPixmap(-_pix.width()/2, -_pix.height()/2, _pix); } signals: void pressed(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *) { emit pressed(); update(); } void mouseReleaseEvent(QGraphicsSceneMouseEvent *) { update(); } private: QPixmap _pix; }; class View : public QGraphicsView { public: View(QGraphicsScene *scene) : QGraphicsView(scene) { } protected: void resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); fitInView(sceneRect(), Qt::KeepAspectRatio); } }; int main(int argc, char **argv) { Q_INIT_RESOURCE(animatedtiles); QApplication app(argc, argv); QPixmap kineticPix(":/images/kinetic.png"); QPixmap bgPix(":/images/Time-For-Lunch-2.jpg"); QGraphicsScene scene(-350, -350, 700, 700); QList items; for (int i = 0; i < 64; ++i) { Pixmap *item = new Pixmap(kineticPix); item->setOffset(-kineticPix.width()/2, -kineticPix.height()/2); item->setZValue(i); items << item; scene.addItem(item); } // Buttons QGraphicsItem *buttonParent = new QGraphicsRectItem; Button *ellipseButton = new Button(QPixmap(":/images/ellipse.png"), buttonParent); Button *figure8Button = new Button(QPixmap(":/images/figure8.png"), buttonParent); Button *randomButton = new Button(QPixmap(":/images/random.png"), buttonParent); Button *tiledButton = new Button(QPixmap(":/images/tile.png"), buttonParent); Button *centeredButton = new Button(QPixmap(":/images/centered.png"), buttonParent); ellipseButton->setPos(-100, -100); figure8Button->setPos(100, -100); randomButton->setPos(0, 0); tiledButton->setPos(-100, 100); centeredButton->setPos(100, 100); scene.addItem(buttonParent); buttonParent->scale(0.75, 0.75); buttonParent->setPos(200, 200); buttonParent->setZValue(65); // States QState *rootState = new QState; QState *ellipseState = new QState(rootState); QState *figure8State = new QState(rootState); QState *randomState = new QState(rootState); QState *tiledState = new QState(rootState); QState *centeredState = new QState(rootState); // Values for (int i = 0; i < items.count(); ++i) { Pixmap *item = items.at(i); // Ellipse ellipseState->assignProperty(item, "pos", QPointF(cos((i / 63.0) * 6.28) * 250, sin((i / 63.0) * 6.28) * 250)); // Figure 8 figure8State->assignProperty(item, "pos", QPointF(sin((i / 63.0) * 6.28) * 250, sin(((i * 2)/63.0) * 6.28) * 250)); // Random randomState->assignProperty(item, "pos", QPointF(-250 + qrand() % 500, -250 + qrand() % 500)); // Tiled tiledState->assignProperty(item, "pos", QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2, ((i / 8) - 4) * kineticPix.height() + kineticPix.height() / 2)); // Centered centeredState->assignProperty(item, "pos", QPointF()); } // Ui View *view = new View(&scene); view->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Animated Tiles")); view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); view->setBackgroundBrush(bgPix); view->setCacheMode(QGraphicsView::CacheBackground); view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); view->show(); QStateMachine states; states.addState(rootState); states.setInitialState(rootState); rootState->setInitialState(centeredState); QParallelAnimationGroup *group = new QParallelAnimationGroup; for (int i = 0; i < items.count(); ++i) { QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos"); anim->setDuration(750 + i * 25); anim->setEasingCurve(QEasingCurve::InOutBack); group->addAnimation(anim); } QAbstractTransition *trans = rootState->addTransition(ellipseButton, SIGNAL(pressed()), ellipseState); trans->addAnimation(group); group = new QParallelAnimationGroup; for (int i = 0; i < items.count(); ++i) { QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos"); anim->setDuration(750 + i * 25); anim->setEasingCurve(QEasingCurve::InOutBack); group->addAnimation(anim); } trans = rootState->addTransition(figure8Button, SIGNAL(pressed()), figure8State); trans->addAnimation(group); group = new QParallelAnimationGroup; for (int i = 0; i < items.count(); ++i) { QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos"); anim->setDuration(750 + i * 25); anim->setEasingCurve(QEasingCurve::InOutBack); group->addAnimation(anim); } trans = rootState->addTransition(randomButton, SIGNAL(pressed()), randomState); trans->addAnimation(group); group = new QParallelAnimationGroup; for (int i = 0; i < items.count(); ++i) { QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos"); anim->setDuration(750 + i * 25); anim->setEasingCurve(QEasingCurve::InOutBack); group->addAnimation(anim); } trans = rootState->addTransition(tiledButton, SIGNAL(pressed()), tiledState); trans->addAnimation(group); group = new QParallelAnimationGroup; for (int i = 0; i < items.count(); ++i) { QPropertyAnimation *anim = new QPropertyAnimation(items[i], "pos"); anim->setDuration(750 + i * 25); anim->setEasingCurve(QEasingCurve::InOutBack); group->addAnimation(anim); } trans = rootState->addTransition(centeredButton, SIGNAL(pressed()), centeredState); trans->addAnimation(group); states.start(); QTimer timer; timer.start(125); timer.setSingleShot(true); rootState->addTransition(&timer, SIGNAL(timeout()), ellipseState); return app.exec(); } #include "main.moc"