diff options
Diffstat (limited to 'hyperui/menuview.cpp')
-rw-r--r-- | hyperui/menuview.cpp | 147 |
1 files changed, 127 insertions, 20 deletions
diff --git a/hyperui/menuview.cpp b/hyperui/menuview.cpp index 4c2f88f..fa34193 100644 --- a/hyperui/menuview.cpp +++ b/hyperui/menuview.cpp @@ -29,14 +29,25 @@ ** ****************************************************************************/ +#include <QState> +#include <QStateMachine> +#include <QSignalTransition> +#include <QPropertyAnimation> +#include <QParallelAnimationGroup> + #include "dataresource.h" +#include "global.h" #include "button.h" #include "menuview.h" #include "phoneview.h" -#define FPOS(i, j) QPointF(leftMargin + vSpacing * i, \ - topMargin + hSpacing * j) +#define FPOS(i, j) QPointF(m_leftMargin + m_vSpacing * i, \ + m_topMargin + m_hSpacing * j) + +#define FNPOS(i, j) QPointF(m_vSpacing * -(i + 3), \ + m_topMargin + m_hSpacing * (j + 2)) + MenuView::MenuView(QGraphicsItem *parent) : View(parent) @@ -46,30 +57,33 @@ MenuView::MenuView(QGraphicsItem *parent) setFlag(QGraphicsItem::ItemClipsChildrenToShape); // read settings - const int topMargin = Resource::intValue("menu-view/margin-top"); - const int leftMargin = Resource::intValue("menu-view/margin-left"); - const int vSpacing = Resource::intValue("menu-view/spacing-vertical"); - const int hSpacing = Resource::intValue("menu-view/spacing-horizontal"); - const QPointF &mainIconPos = Resource::value("menu-view/main-icon-pos").toPoint(); + m_topMargin = Resource::intValue("menu-view/margin-top"); + m_leftMargin = Resource::intValue("menu-view/margin-left"); + m_vSpacing = Resource::intValue("menu-view/spacing-vertical"); + m_hSpacing = Resource::intValue("menu-view/spacing-horizontal"); + m_mainIconIPos = Resource::value("menu-view/main-icon-pos").toPoint(); + m_mainIconFPos = Resource::value("menu-view/main-icon-out-pos").toPoint(); // initialize interface - addIcon(Resource::pixmap("menu_bt_twitter.png"), FPOS(0, 0)); + m_btnTwitter = addIcon(Resource::pixmap("menu_bt_twitter.png"), FPOS(0, 0)); - addIcon(Resource::pixmap("menu_bt_email.png"), FPOS(0, 2)); - addIcon(Resource::pixmap("menu_bt_settings.png"), FPOS(1, 1)); - addIcon(Resource::pixmap("menu_bt_music.png"), FPOS(2, 0)); + m_btnEmail = addIcon(Resource::pixmap("menu_bt_email.png"), FPOS(0, 2)); + m_btnSettings = addIcon(Resource::pixmap("menu_bt_settings.png"), FPOS(1, 1)); + m_btnMusic = addIcon(Resource::pixmap("menu_bt_music.png"), FPOS(2, 0)); - addIcon(Resource::pixmap("menu_bt_navigation.png"), FPOS(0, 4)); - addIcon(Resource::pixmap("menu_bt_chat.png"), FPOS(1, 3)); - addIcon(Resource::pixmap("menu_bt_games.png"), FPOS(2, 2)); - addIcon(Resource::pixmap("menu_bt_web.png"), FPOS(3, 1)); + m_btnNavigation = addIcon(Resource::pixmap("menu_bt_navigation.png"), FPOS(0, 4)); + m_btnChat = addIcon(Resource::pixmap("menu_bt_chat.png"), FPOS(1, 3)); + m_btnGames = addIcon(Resource::pixmap("menu_bt_games.png"), FPOS(2, 2)); + m_btnWeb = addIcon(Resource::pixmap("menu_bt_web.png"), FPOS(3, 1)); - addIcon(Resource::pixmap("menu_bt_folder.png"), FPOS(1, 5)); - addIcon(Resource::pixmap("menu_bt_calendar.png"), FPOS(2, 4)); - addIcon(Resource::pixmap("menu_bt_camera.png"), FPOS(3, 3)); + m_btnFolder = addIcon(Resource::pixmap("menu_bt_folder.png"), FPOS(1, 5)); + m_btnCalendar = addIcon(Resource::pixmap("menu_bt_calendar.png"), FPOS(2, 4)); + m_btnCamera = addIcon(Resource::pixmap("menu_bt_camera.png"), FPOS(3, 3)); - addIcon(Resource::pixmap("menu_bt_phone.png"), - mainIconPos, SLOT(onPhoneClicked())); + m_btnPhone = addIcon(Resource::pixmap("menu_bt_phone.png"), + m_mainIconIPos, SLOT(onPhoneClicked())); + + createStateMachine(); } Button *MenuView::addIcon(const QPixmap &pixmap, const QPointF &pos, @@ -88,3 +102,96 @@ void MenuView::onPhoneClicked() { pageView()->add(new PhoneView()); } + +void MenuView::createStateMachine() +{ + QStateMachine *machine = new QStateMachine(this); + + QState *state1 = new QState(); + state1->assignProperty(m_btnTwitter, "pos", FNPOS(2, 3)); + state1->assignProperty(m_btnEmail, "pos", FNPOS(2, 5)); + state1->assignProperty(m_btnSettings, "pos", FNPOS(1, 4)); + state1->assignProperty(m_btnMusic, "pos", FNPOS(0, 3)); + state1->assignProperty(m_btnNavigation, "pos", FNPOS(2, 7)); + state1->assignProperty(m_btnChat, "pos", FNPOS(1, 6)); + state1->assignProperty(m_btnGames, "pos", FNPOS(0, 5)); + state1->assignProperty(m_btnWeb, "pos", FNPOS(-1, 4)); + state1->assignProperty(m_btnFolder, "pos", FNPOS(1, 8)); + state1->assignProperty(m_btnCalendar, "pos", FNPOS(0, 7)); + state1->assignProperty(m_btnCamera, "pos", FNPOS(-1, 6)); + state1->assignProperty(m_btnPhone, "pos", m_mainIconFPos); + + QState *state2 = new QState(); + state2->assignProperty(m_btnTwitter, "pos", FPOS(0, 0)); + state2->assignProperty(m_btnEmail, "pos", FPOS(0, 2)); + state2->assignProperty(m_btnSettings, "pos", FPOS(1, 1)); + state2->assignProperty(m_btnMusic, "pos", FPOS(2, 0)); + state2->assignProperty(m_btnNavigation, "pos", FPOS(0, 4)); + state2->assignProperty(m_btnChat, "pos", FPOS(1, 3)); + state2->assignProperty(m_btnGames, "pos", FPOS(2, 2)); + state2->assignProperty(m_btnWeb, "pos", FPOS(3, 1)); + state2->assignProperty(m_btnFolder, "pos", FPOS(1, 5)); + state2->assignProperty(m_btnCalendar, "pos", FPOS(2, 4)); + state2->assignProperty(m_btnCamera, "pos", FPOS(3, 3)); + state2->assignProperty(m_btnPhone, "pos", m_mainIconIPos); + + QSignalTransition *transition1 = + state1->addTransition(this, SIGNAL(transitionInStarted()), state2); + transition1->addAnimation(createInOutAnimation(false)); + + QSignalTransition *transition2 = + state2->addTransition(this, SIGNAL(transitionOutStarted()), state1); + transition2->addAnimation(createInOutAnimation(true)); + + machine->addState(state1); + machine->addState(state2); + + machine->setInitialState(state2); + machine->start(); +} + +QAbstractAnimation *MenuView::createInOutAnimation(bool out) +{ + QParallelAnimationGroup *result = new QParallelAnimationGroup(); + + const int t = 200; + const int d = 50; + + if (!out) { + const QEasingCurve::Type ec = QEasingCurve::OutQuart; + + result->addAnimation(propertyAnimation(m_btnWeb, "pos", t, ec)); + result->addAnimation(propertyAnimation(m_btnMusic, "pos", t + d, ec)); + result->addAnimation(propertyAnimation(m_btnCamera, "pos", t + 2 * d, ec)); + result->addAnimation(propertyAnimation(m_btnGames, "pos", t + 3 * d, ec)); + result->addAnimation(propertyAnimation(m_btnSettings, "pos", t + 4 * d, ec)); + result->addAnimation(propertyAnimation(m_btnTwitter, "pos", t + 5 * d, ec)); + result->addAnimation(propertyAnimation(m_btnCalendar, "pos", t + 6 * d, ec)); + result->addAnimation(propertyAnimation(m_btnChat, "pos", t + 7 * d, ec)); + result->addAnimation(propertyAnimation(m_btnEmail, "pos", t + 8 * d, ec)); + result->addAnimation(propertyAnimation(m_btnFolder, "pos", t + 9 * d, ec)); + result->addAnimation(propertyAnimation(m_btnNavigation, "pos", t + 10 * d, ec)); + result->addAnimation(propertyAnimation(m_btnPhone, "pos", t + 11 * d, ec)); + + connect(result, SIGNAL(finished()), SIGNAL(transitionInFinished())); + } else { + const QEasingCurve::Type ec = QEasingCurve::InQuart; + + result->addAnimation(propertyAnimation(m_btnPhone, "pos", t, ec)); + result->addAnimation(propertyAnimation(m_btnFolder, "pos", t + d, ec)); + result->addAnimation(propertyAnimation(m_btnNavigation, "pos", t + 2 * d, ec)); + result->addAnimation(propertyAnimation(m_btnCalendar, "pos", t + 3 * d, ec)); + result->addAnimation(propertyAnimation(m_btnChat, "pos", t + 4 * d, ec)); + result->addAnimation(propertyAnimation(m_btnEmail, "pos", t + 5 * d, ec)); + result->addAnimation(propertyAnimation(m_btnCamera, "pos", t + 6 * d, ec)); + result->addAnimation(propertyAnimation(m_btnGames, "pos", t + 7 * d, ec)); + result->addAnimation(propertyAnimation(m_btnSettings, "pos", t + 8 * d, ec)); + result->addAnimation(propertyAnimation(m_btnTwitter, "pos", t + 9 * d, ec)); + result->addAnimation(propertyAnimation(m_btnWeb, "pos", t + 10 * d, ec)); + result->addAnimation(propertyAnimation(m_btnMusic, "pos", t + 11 * d, ec)); + + connect(result, SIGNAL(finished()), SIGNAL(transitionOutFinished())); + } + + return result; +} |