summaryrefslogtreecommitdiffstats
path: root/hyperui/phoneview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hyperui/phoneview.cpp')
-rw-r--r--hyperui/phoneview.cpp222
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;
}