diff options
Diffstat (limited to 'hyperui/phoneview.cpp')
-rw-r--r-- | hyperui/phoneview.cpp | 222 |
1 files changed, 141 insertions, 81 deletions
diff --git a/hyperui/phoneview.cpp b/hyperui/phoneview.cpp index 8e95a37..10ebac6 100644 --- a/hyperui/phoneview.cpp +++ b/hyperui/phoneview.cpp @@ -41,8 +41,11 @@ #include "dataresource.h" #include "label.h" +#include "global.h" #include "button.h" #include "phoneview.h" +#include "contactlist.h" +#include "contactresource.h" static QFont resourceButtonFont() @@ -425,43 +428,49 @@ PhoneView::PhoneView(QGraphicsItem *parent) // initialize interface setFlag(QGraphicsItem::ItemHasNoContents); - m_display = new DialerDisplay(this); + m_frame = new QGraphicsWidget(this); + + m_display = new DialerDisplay(m_frame); m_display->setPos(displayPos); - m_contactsButton = new Button(Resource::pixmap("dialer_bt_contacts.png"), this); + m_contactsButton = new Button(Resource::pixmap("dialer_bt_contacts.png"), m_frame); m_contactsButton->setPos(contactsButtonPos); m_contactsButton->setFont(resourceButtonFont()); - m_overlay = new Overlay(this); + m_overlay = new Overlay(m_frame); m_overlay->setBrush(Qt::black); m_overlay->setRect(Resource::value("phone-view/overlay-rect").toRect()); m_callButton = new Button(Resource::pixmap("dialer_bt_call.png"), - Resource::pixmap("dialer_bt_call_over.png"), this); + Resource::pixmap("dialer_bt_call_over.png"), m_frame); m_callButton->setText(tr("CALL")); m_callButton->setPos(callButtonPos); m_callButton->setFont(resourceButtonFont()); m_endCallButton = new Button(Resource::pixmap("dialer_bt_endcall.png"), - Resource::pixmap("dialer_bt_endcall_over.png"), this); + Resource::pixmap("dialer_bt_endcall_over.png"), m_frame); m_endCallButton->setText(tr("END CALL")); m_endCallButton->setPos(callButtonPos); m_endCallButton->setFont(resourceButtonFont()); - m_board = new CallBoard(this); + m_board = new CallBoard(m_frame); m_board->setPos(dialerBackPos); - m_board->setPhoto(Resource::pixmap("dialer_photo.png")); - // dummy name - m_board->setName(Resource::stringValue("phone-view/contact-dummy-name")); + m_board->setPhoto(Resource::pixmap("call_photo_nobody.png")); - m_dialer = new DialerWidget(this); + m_dialer = new DialerWidget(m_frame); m_dialer->setPos(dialerBackPos); connect(m_dialer, SIGNAL(buttonClicked(const QString &)), SLOT(dialButtonClicked(const QString &))); + m_contactList = new ContactList(this); + m_contactList->setGeometry(Resource::value("phone-view/contactlist-rect").toRect()); + m_contactList->hide(); + connect(m_contactList, SIGNAL(contactClicked(int)), SLOT(contactClicked(int))); + m_callTimer.setInterval(callTimeout); m_callTimer.setSingleShot(true); + setOpacity(0.0); createStateMachine(); connect(m_callButton, SIGNAL(clicked()), SLOT(callClicked())); @@ -473,7 +482,29 @@ PhoneView::PhoneView(QGraphicsItem *parent) void PhoneView::callClicked() { // update phone number - m_board->setPhone(m_display->text()); + m_board->setName(m_display->text()); + m_board->setPhone(""); + m_board->setPhoto(Resource::pixmap("call_photo_nobody.png")); + + // simulate call wait + m_callTimer.start(); +} + +/*! + Handle contact click. +*/ +void PhoneView::contactClicked(int index) +{ + m_board->setName(ContactResource::name(index)); + m_board->setPhone(ContactResource::phone(index)); + + const QString &photo = ContactResource::photo(index, ContactResource::LargePhoto); + if (!photo.isEmpty()) + m_board->setPhoto(Resource::pixmap(photo)); + else + m_board->setPhoto(Resource::pixmap("call_photo_nobody.png")); + + emit callContact(); // simulate call wait m_callTimer.start(); @@ -494,8 +525,14 @@ void PhoneView::createStateMachine() { QStateMachine *machine = new QStateMachine(this); + QState *state0 = new QState(); + state0->assignProperty(this, "opacity", 0.0); + // create default state QState *state1 = new QState(); + state1->assignProperty(this, "opacity", 1.0); + state1->assignProperty(m_frame, "opacity", 1.0); + state1->assignProperty(m_frame, "visible", true); state1->assignProperty(m_dialer, "opacity", 1.0); state1->assignProperty(m_display, "visible", true); state1->assignProperty(m_board, "visible", false); @@ -505,9 +542,13 @@ void PhoneView::createStateMachine() state1->assignProperty(m_board, "geometry", m_board->geometry()); state1->assignProperty(m_overlay, "opacity", 0.0); state1->assignProperty(m_overlay, "visible", false); + state1->assignProperty(m_contactList, "y", m_contactList->size().height() * 1.5); + state1->assignProperty(m_contactList, "visible", false); // create calling state QState *state2 = new QState(); + state2->assignProperty(m_frame, "opacity", 1.0); + state2->assignProperty(m_frame, "visible", true); state2->assignProperty(m_dialer, "opacity", 0.0); state2->assignProperty(m_display, "visible", false); state2->assignProperty(m_board, "visible", true); @@ -524,6 +565,8 @@ void PhoneView::createStateMachine() state2->assignProperty(m_board->panelInCall, "visible", false); state2->assignProperty(m_overlay, "opacity", 0.5); state2->assignProperty(m_overlay, "visible", true); + state2->assignProperty(m_contactList, "y", m_contactList->size().height() * 1.5); + state2->assignProperty(m_contactList, "visible", false); // create in-call state QState *state3 = new QState(); @@ -534,6 +577,13 @@ void PhoneView::createStateMachine() state3->assignProperty(m_overlay, "opacity", 0.5); state3->assignProperty(m_overlay, "visible", true); + // create contact list state + QState *state4 = new QState(); + state4->assignProperty(m_frame, "opacity", 0.0); + state4->assignProperty(m_frame, "visible", false); + state4->assignProperty(m_contactList, "y", 0); + state4->assignProperty(m_contactList, "visible", true); + // associates state1-state2 transition QSignalTransition *transition1 = state1->addTransition(m_callButton, SIGNAL(clicked()), state2); @@ -554,38 +604,88 @@ void PhoneView::createStateMachine() state2->addTransition(&m_callTimer, SIGNAL(timeout()), state3); transition4->addAnimation(createInCallAnimation()); + // associates state0-state1 transition + QSignalTransition *transition5 = + state0->addTransition(this, SIGNAL(transitionInStarted()), state1); + transition5->addAnimation(createInOutAnimation(false)); + + // associates state1-state0 transition + QSignalTransition *transition6 = + state1->addTransition(this, SIGNAL(transitionOutStarted()), state0); + transition6->addAnimation(createInOutAnimation(true)); + + // associates state1-state4 transition + QSignalTransition *transition7 = + state1->addTransition(m_contactsButton, SIGNAL(clicked()), state4); + transition7->addAnimation(createContactAnimation(false)); + + // associates state4-state2 transition + QSignalTransition *transition8 = + state4->addTransition(this, SIGNAL(callContact()), state2); + transition8->addAnimation(createContactAnimation(true)); + + // associates state4-state0 transition + QSignalTransition *transition9 = + state4->addTransition(this, SIGNAL(transitionOutStarted()), state0); + transition9->addAnimation(createInOutAnimation(true)); + + machine->addState(state0); machine->addState(state1); machine->addState(state2); machine->addState(state3); + machine->addState(state4); - machine->setInitialState(state1); + machine->setInitialState(state0); machine->start(); } +QAbstractAnimation *PhoneView::createInOutAnimation(bool out) +{ + QSequentialAnimationGroup *result = new QSequentialAnimationGroup(); + result->addAnimation(propertyAnimation(this, "opacity", 400)); + + if (!out) + connect(result, SIGNAL(finished()), SIGNAL(transitionInFinished())); + else + connect(result, SIGNAL(finished()), SIGNAL(transitionOutFinished())); + + return result; +} + /*! - Creates the animation executed in the call action. + Creates the animation executed in the contacts action. */ -QAbstractAnimation *PhoneView::createCallAnimation() +QAbstractAnimation *PhoneView::createContactAnimation(bool close) { - QPropertyAnimation *animation; - QSequentialAnimationGroup *result = new QSequentialAnimationGroup(); - animation = new QPropertyAnimation(m_dialer, "opacity"); - animation->setDuration(200); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_board, "geometry"); - animation->setDuration(300); - result->addAnimation(animation); + if (close) { + result->addAnimation(propertyAnimation(m_contactList, "y", 600, + QEasingCurve::InQuart)); + result->addAnimation(propertyAnimation(m_contactList, "visible", 0)); + result->addAnimation(propertyAnimation(m_frame, "visible", 0)); + result->addAnimation(propertyAnimation(m_frame, "opacity", 400)); + } else { + result->addAnimation(propertyAnimation(m_contactList, "visible", 0)); + result->addAnimation(propertyAnimation(m_frame, "opacity", 400)); + result->addAnimation(propertyAnimation(m_contactList, "y", 600, + QEasingCurve::OutQuart)); + result->addAnimation(propertyAnimation(m_frame, "visible", 0)); + } - animation = new QPropertyAnimation(m_board->contents, "opacity"); - animation->setDuration(200); - result->addAnimation(animation); + return result; +} - animation = new QPropertyAnimation(m_overlay, "opacity"); - animation->setDuration(200); - result->addAnimation(animation); +/*! + Creates the animation executed in the call action. +*/ +QAbstractAnimation *PhoneView::createCallAnimation() +{ + QSequentialAnimationGroup *result = new QSequentialAnimationGroup(); + result->addAnimation(propertyAnimation(m_dialer, "opacity", 200)); + result->addAnimation(propertyAnimation(m_board, "geometry", 300)); + result->addAnimation(propertyAnimation(m_board->contents, "opacity", 200)); + result->addAnimation(propertyAnimation(m_overlay, "opacity", 200)); return result; } @@ -595,29 +695,12 @@ QAbstractAnimation *PhoneView::createCallAnimation() */ QAbstractAnimation *PhoneView::createInCallAnimation() { - QPropertyAnimation *animation; - QSequentialAnimationGroup *result = new QSequentialAnimationGroup(); - - animation = new QPropertyAnimation(m_overlay, "opacity"); - animation->setDuration(200); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_board->panelWait, "opacity"); - animation->setDuration(300); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_board->panelWait, "visible"); - animation->setDuration(0); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_board->panelInCall, "opacity"); - animation->setDuration(300); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_overlay, "visible"); - animation->setDuration(0); - result->addAnimation(animation); + result->addAnimation(propertyAnimation(m_overlay, "opacity", 200)); + result->addAnimation(propertyAnimation(m_board->panelWait, "opacity", 300)); + result->addAnimation(propertyAnimation(m_board->panelWait, "visible", 0)); + result->addAnimation(propertyAnimation(m_board->panelInCall, "opacity", 300)); + result->addAnimation(propertyAnimation(m_overlay, "visible", 0)); return result; } @@ -627,37 +710,14 @@ QAbstractAnimation *PhoneView::createInCallAnimation() */ QAbstractAnimation *PhoneView::createEndCallAnimation() { - QPropertyAnimation *animation; - QSequentialAnimationGroup *result = new QSequentialAnimationGroup(); - - animation = new QPropertyAnimation(m_overlay, "opacity"); - animation->setDuration(200); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_board->contents, "opacity"); - animation->setDuration(200); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_board, "geometry"); - animation->setDuration(300); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_dialer, "opacity"); - animation->setDuration(200); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_board, "visible"); - animation->setDuration(0); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_display, "visible"); - animation->setDuration(0); - result->addAnimation(animation); - - animation = new QPropertyAnimation(m_overlay, "visible"); - animation->setDuration(0); - result->addAnimation(animation); + result->addAnimation(propertyAnimation(m_overlay, "opacity", 200)); + result->addAnimation(propertyAnimation(m_board->contents, "opacity", 200)); + result->addAnimation(propertyAnimation(m_board, "geometry", 300)); + result->addAnimation(propertyAnimation(m_dialer, "opacity", 200)); + result->addAnimation(propertyAnimation(m_board, "visible", 0)); + result->addAnimation(propertyAnimation(m_display, "visible", 0)); + result->addAnimation(propertyAnimation(m_overlay, "visible", 0)); return result; } |