diff options
author | unknown <Roopesh Chander@.(none)> | 2009-11-10 12:52:14 +0530 |
---|---|---|
committer | unknown <Roopesh Chander@.(none)> | 2009-11-10 12:52:14 +0530 |
commit | d4fc90c52482661418de2d91525b6cbe85398d65 (patch) | |
tree | e993768653a906224e60c3bbee07cc6cb8db0249 | |
parent | 4743c29415dfac9749e3076de96ab41fe2228e0d (diff) |
refactor the animations as associated with state transitions
-rw-r--r-- | mainwindow.cpp | 119 | ||||
-rw-r--r-- | mainwindow.h | 15 | ||||
-rw-r--r-- | webscrap.h | 4 |
3 files changed, 87 insertions, 51 deletions
diff --git a/mainwindow.cpp b/mainwindow.cpp index 446e16c..3f34eca 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -7,6 +7,7 @@ #include <QDebug> #include <QWebFrame> #include <QState> +#include <QSignalTransition> #include "mainwindow.h" #include "ui_mainwindow.h" #include "webview.h" @@ -23,6 +24,7 @@ MainWindow::MainWindow(QWidget *parent) : m_webView->setVisible(false); m_browserToolbar->setVisible(false); adjustTitle(); + createAnimations(); m_settings = new QSettings("Nokia", "WebScraps", this); loadSettings(); @@ -30,14 +32,23 @@ MainWindow::MainWindow(QWidget *parent) : QState *seeScraps = new QState; QState *browseWeb = new QState; - connect(browseWeb, SIGNAL(entered()), m_webView, SLOT(show())); - connect(browseWeb, SIGNAL(exited()), m_webView, SLOT(hide())); - seeScraps->addTransition(m_gotoBrowserButton, SIGNAL(clicked()), browseWeb); - browseWeb->addTransition(m_gotoScrapsButton, SIGNAL(clicked()), seeScraps); m_stateMachine.addState(seeScraps); m_stateMachine.addState(browseWeb); m_stateMachine.setInitialState(seeScraps); + QSignalTransition *transitionToBrowser = seeScraps->addTransition(m_gotoBrowserButton, SIGNAL(clicked()), browseWeb); + QSignalTransition *transitionToScraps = browseWeb->addTransition(m_gotoScrapsButton, SIGNAL(clicked()), seeScraps); + QSignalTransition *transitionToScraps2 = browseWeb->addTransition(m_webView, SIGNAL(scrapAdded(QUrl,QSize,QRect,QPoint)), seeScraps); + + transitionToBrowser->addAnimation(m_scrapsToBrowserAnimation); + transitionToScraps->addAnimation(m_browserToScrapsAnimation); + transitionToScraps2->addAnimation(m_browserToScrapsAnimation); + connect(browseWeb, SIGNAL(entered()), m_webView, SLOT(show())); + connect(m_browserToScrapsAnimation, SIGNAL(finished()), m_webView, SLOT(hide())); + + connect(browseWeb, SIGNAL(entered()), SLOT(showBrowserToolbar())); + connect(seeScraps, SIGNAL(entered()), SLOT(showScrapsToolbar())); + seeScraps->assignProperty(this, "webTitleShown", false); browseWeb->assignProperty(this, "webTitleShown", true); connect(seeScraps, SIGNAL(polished()), SLOT(adjustTitle())); @@ -74,6 +85,7 @@ void MainWindow::addScrap(QUrl url, QSize pageSize, m_scraps << container; container->setZValue(m_scraps.count()); bubbleUpScrap(container); + addScrapToAnimations(container); } void MainWindow::initBrowser() { @@ -84,7 +96,6 @@ void MainWindow::initBrowser() { connect(m_webView, SIGNAL(loadFinished(bool)), SLOT(adjustLocation())); connect(m_webView, SIGNAL(titleChanged(const QString&)), SLOT(adjustTitle())); connect(m_webView, SIGNAL(scrapAdded(QUrl,QSize,QRect,QPoint)), SLOT(addScrap(QUrl, QSize, QRect, QPoint))); - connect(m_webView, SIGNAL(scrapAdded(QUrl,QSize,QRect,QPoint)), SLOT(showScraps())); createBrowserToolbar(scene()); m_browserToolbar->setFillLevelBrush(QColor(50, 50, 200, 50)); connect(m_webView->page(), SIGNAL(loadProgress(int)), m_browserToolbar, SLOT(setFillLevel(int))); @@ -111,7 +122,6 @@ void MainWindow::createScrapsToolbar(QGraphicsScene *scene) { connect(m_dropDownList, SIGNAL(activated(int)), SLOT(scrapDropDownListActivated(int))); connect(m_searchBar, SIGNAL(textChanged(QString)), SLOT(searchTextChanged(QString))); - connect(m_gotoBrowserButton, SIGNAL(clicked()), SLOT(showBrowser())); } void MainWindow::createBrowserToolbar(QGraphicsScene *scene) { @@ -148,7 +158,6 @@ void MainWindow::createBrowserToolbar(QGraphicsScene *scene) { connect(m_selectScrapsButton, SIGNAL(clicked(bool)), m_webView, SLOT(setScrapSelectionEnabled(bool))); connect(m_addressBar, SIGNAL(returnPressed()), SLOT(changeLocation())); - connect(m_gotoScrapsButton, SIGNAL(clicked()), SLOT(showScraps())); } MainWindow::~MainWindow() @@ -178,60 +187,63 @@ void MainWindow::adjustTitle() setWindowTitle(title); } -void MainWindow::showBrowser() { - QParallelAnimationGroup *anim = new QParallelAnimationGroup(this); - anim->addAnimation(createScrapsAnim(Leave, anim)); - anim->addAnimation(createBrowserAnim(Enter, anim)); - anim->addAnimation(createToolbarAnim(m_scrapsToolbar, m_browserToolbar, AntiClockwise, anim)); - anim->start(QAbstractAnimation::DeleteWhenStopped); - m_selectScrapsButton->setChecked(false); - m_webView->setScrapSelectionEnabled(false); - adjustTitle(); +void MainWindow::createAnimations() { + m_scrapsEnter = new QParallelAnimationGroup(this); + m_scrapsLeave = new QParallelAnimationGroup(this); + QAbstractAnimation *browserEnter = createBrowserAnim(Enter, this); + QAbstractAnimation *browserLeave = createBrowserAnim(Leave, this); + + m_browserToScrapsAnimation = new QParallelAnimationGroup(this); + m_browserToScrapsAnimation->addAnimation(browserLeave); + m_browserToScrapsAnimation->addAnimation(m_scrapsEnter); + + m_scrapsToBrowserAnimation = new QParallelAnimationGroup(this); + m_scrapsToBrowserAnimation->addAnimation(m_scrapsLeave); + m_scrapsToBrowserAnimation->addAnimation(browserEnter); } -void MainWindow::showScraps() { - QParallelAnimationGroup *anim = new QParallelAnimationGroup(this); - anim->addAnimation(createScrapsAnim(Enter, anim)); - anim->addAnimation(createBrowserAnim(Leave, anim)); - anim->addAnimation(createToolbarAnim(m_browserToolbar, m_scrapsToolbar, Clockwise, anim)); - anim->start(QAbstractAnimation::DeleteWhenStopped); - adjustTitle(); +void MainWindow::addScrapToAnimations(WebScrapContainer *container) { + Q_ASSERT(m_scrapsEnter); + Q_ASSERT(m_scrapsLeave); + + QPointF flyOffset = QPointF(3000, 1000); + + QPropertyAnimation *enterAnim = new QPropertyAnimation(container, "pos", this); + enterAnim->setDuration(500 + 150 * m_scraps.count()); + enterAnim->setEndValue(container->data(WebScrapContainer::Position).toPointF()); + enterAnim->setEasingCurve(QEasingCurve::OutCubic); + m_scrapsEnter->addAnimation(enterAnim); + + QPropertyAnimation *leaveAnim = new QPropertyAnimation(container, "pos", this); + leaveAnim->setDuration(500 + 150 * m_scraps.count()); + leaveAnim->setEndValue(sceneRect().center() + flyOffset); + leaveAnim->setEasingCurve(QEasingCurve::InCubic); + m_scrapsLeave->addAnimation(leaveAnim); + + container->setData(WebScrapContainer::EnterAnimation, qVariantFromValue(enterAnim)); + container->setData(WebScrapContainer::LeaveAnimation, qVariantFromValue(leaveAnim)); } -QAbstractAnimation* MainWindow::createScrapsAnim(const Movement move, QObject *parent) { - QParallelAnimationGroup *allScrapsAnim = new QParallelAnimationGroup(parent); - int i = 0; - QPointF flyOffset = QPointF(3000, ((rand() % 3) - 1) * 1000); - foreach (QGraphicsWidget *scrap, m_scraps) { - ++i; - QPropertyAnimation *moveAnim = new QPropertyAnimation(scrap, "pos", allScrapsAnim); - moveAnim->setDuration(500 + 150 * (rand() % 10)); - if (move == Enter) { - moveAnim->setEndValue(scrap->data(WebScrapContainer::Position).toPointF()); - moveAnim->setEasingCurve(QEasingCurve::OutCubic); - } - if (move == Leave) { - scrap->setData(WebScrapContainer::Position, scrap->pos()); - moveAnim->setEndValue(sceneRect().center() + flyOffset); - moveAnim->setEasingCurve(QEasingCurve::InCubic); - } - allScrapsAnim->addAnimation(moveAnim); - } - return allScrapsAnim; +void MainWindow::removeScrapFromAnimations(WebScrapContainer *container) { + QPropertyAnimation *enterAnim = container->data(WebScrapContainer::EnterAnimation).value<QPropertyAnimation*>(); + m_scrapsEnter->removeAnimation(enterAnim); + enterAnim->deleteLater(); + + QPropertyAnimation *leaveAnim = container->data(WebScrapContainer::LeaveAnimation).value<QPropertyAnimation*>(); + m_scrapsLeave->removeAnimation(leaveAnim); + leaveAnim->deleteLater(); } QAbstractAnimation* MainWindow::createBrowserAnim(const Movement move, QObject *parent) { QPropertyAnimation *moveAnim = new QPropertyAnimation(m_webView, "pos", parent); moveAnim->setDuration(1000); if (move == Enter) { - m_webView->setPos(sceneRect().topLeft() - QPointF(3000, 0)); - m_webView->show(); + moveAnim->setStartValue(sceneRect().topLeft() - QPointF(3000, 0)); moveAnim->setEndValue(sceneRect().topLeft()); moveAnim->setEasingCurve(QEasingCurve::OutCubic); } if (move == Leave) { moveAnim->setEndValue(sceneRect().topLeft() - QPointF(3000, 0)); - connect(moveAnim, SIGNAL(finished()), m_webView, SLOT(hide())); moveAnim->setEasingCurve(QEasingCurve::InCubic); } return moveAnim; @@ -292,9 +304,9 @@ void MainWindow::bubbleUpScraps(QList<QGraphicsWidget*> scraps) { } void MainWindow::removeSenderScrap() { - QGraphicsWidget *scrap = 0; + WebScrapContainer *scrap = 0; if (sender()) - scrap = qobject_cast<QGraphicsWidget*>(sender()); + scrap = qobject_cast<WebScrapContainer*>(sender()); if (scrap) { scene()->removeItem(scrap); for (int i = 0; i < m_scraps.count(); i++) { @@ -304,6 +316,7 @@ void MainWindow::removeSenderScrap() { } } scrap->deleteLater(); + removeScrapFromAnimations(scrap); } adjustTitle(); } @@ -413,3 +426,13 @@ void MainWindow::setWebTitleShown(bool shown) { bool MainWindow::webTitleShown() const { return m_isWebTitleShown; } + +void MainWindow::showBrowserToolbar() { + QAbstractAnimation *anim = createToolbarAnim(m_scrapsToolbar, m_browserToolbar, AntiClockwise, this); + anim->start(QAbstractAnimation::DeleteWhenStopped); +} + +void MainWindow::showScrapsToolbar() { + QAbstractAnimation *anim = createToolbarAnim(m_browserToolbar, m_scrapsToolbar, Clockwise, this); + anim->start(QAbstractAnimation::DeleteWhenStopped); +} diff --git a/mainwindow.h b/mainwindow.h index 6fb6209..6f3a584 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -10,6 +10,7 @@ #include <QComboBox> #include <QSettings> #include <QStateMachine> +#include <QParallelAnimationGroup> #include "webview.h" #include "graphicsview.h" #include "graphicstoolbar.h" @@ -50,18 +51,22 @@ public: void setWebTitleShown(bool shown); bool webTitleShown() const; + void createAnimations(); + void addScrapToAnimations(WebScrapContainer *scrapContainer); + void removeScrapFromAnimations(WebScrapContainer *scrapContainer); + public slots: void adjustLocation(); void changeLocation(); void adjustTitle(); - void showBrowser(); - void showScraps(); void addScrap(QUrl url, QSize pageSize, QRect scrapRect, QPoint position, qreal xScale = 1.0, qreal yScale = 1.0, int refreshMins = 60); void bubbleUpScrap(QGraphicsWidget *scrap = 0); void removeSenderScrap(); void updateDropDownList(); void scrapDropDownListActivated(int index); void searchTextChanged(const QString& text); + void showBrowserToolbar(); + void showScrapsToolbar(); private: Ui::MainWindow *ui; @@ -82,6 +87,12 @@ private: QLineEdit *m_addressBar; QToolButton *m_selectScrapsButton, *m_addScrapButton, *m_gotoScrapsButton; GraphicsToolBar *m_browserToolbar; + + // animations + QParallelAnimationGroup *m_browserToScrapsAnimation, *m_scrapsToBrowserAnimation; + QParallelAnimationGroup *m_scrapsEnter, *m_scrapsLeave; + QAbstractAnimation *m_toBrowserToolbarAnimation, *m_toScrapsToolbarAnimation; }; +Q_DECLARE_METATYPE(QPropertyAnimation*) #endif // MAINWINDOW_H @@ -56,7 +56,9 @@ class WebScrapContainer : public QGraphicsWidget { Q_OBJECT public: enum Data { - Position = 0 + Position = 0, + EnterAnimation, + LeaveAnimation }; WebScrapContainer(WebScrap *scrap, QGraphicsScene *scene, qreal xScale = 1.0, qreal yScale = 1.0); void createToolbar(); |