telutils/dialpad/src/dialpad.cpp
changeset 31 a2467631ae02
parent 27 7eb70891911c
child 32 1f002146abb4
--- a/telutils/dialpad/src/dialpad.cpp	Fri Jun 11 14:07:16 2010 +0300
+++ b/telutils/dialpad/src/dialpad.cpp	Wed Jun 23 18:49:32 2010 +0300
@@ -15,7 +15,7 @@
 *
 */
 
-#include <QtGui>
+#include <QGraphicsLinearLayout>
 
 #include <hbframedrawer.h>
 #include <hbinstance.h>
@@ -25,6 +25,8 @@
 #include <hbstyleloader.h>
 #include <hblineedit.h>
 #include <hbapplication.h>
+#include <hbswipegesture.h>
+#include <hbeffect.h>
 
 #include "dialpad.h"
 #include "dialpadinputfield.h"
@@ -32,24 +34,31 @@
 #include "dialpadbutton.h"
 #include "dialpadmultitaphandler.h"
 #include "dialpadbackground.h"
+#include "dialpadbutton.h"
 
 static const QString backgroundGraphics("qtg_fr_input_v_bg");
 static const QString backgroundGraphicsH("qtg_fr_input_h_bg");
 static const QString minimizeIcon("qtg_graf_input_v_swipe");
 static const QString minimizeIconH("qtg_graf_input_h_swipe");
-static const qreal DialpadCloseSwipeDistanceV = 0.25; //compared to total height
-static const qreal DialpadCloseSwipeDistanceH = 0.33; // > button width
-static const int DialpadMaxSwipeTime = 300; // ms
 static const int DialpadCloseAnimDuration = 200; // ms
 static const int DialpadOpenAnimDuration = 200; // ms
 static const qreal DialpadComponentMargin = 0.75; // units
 static const qreal DialpadCloseHandleHeight = 2.23; // units
 static const qreal DialpadCloseHandleWidth = 18.8; // units
+static const qreal DialpadCallButtonHeight = 8.0; // units
+static const qreal DialpadCallButtonHeightH = 6.0; // units
+
+static const QString handsetIcon("qtg_mono_call");
+static const QString vmbxIcon("qtg_mono_voice_mailbox");
+
+const char *DIALPAD_TO_PRT_FXML = ":/dialpad_to_prt.fxml";
+const char *DIALPAD_TO_LSC_FXML = ":/dialpad_to_lsc.fxml";
+const char *DIALPAD_TO_PRT_EVENT = "prt_activated";
+const char *DIALPAD_TO_LSC_EVENT = "lsc_activated";
 
 Dialpad::Dialpad() :
     mMainWindow(*hbInstance->allMainWindows().at(0)),
     mBackgroundItem(0),
-    mMouseButtonPressedDown(false),
     mOpenTimeLine(DialpadOpenAnimDuration),
     mCloseTimeLine(DialpadCloseAnimDuration),
     mAnimationOngoing(false),
@@ -63,7 +72,6 @@
 Dialpad::Dialpad(const HbMainWindow& mainWindow) :
     mMainWindow(mainWindow),
     mBackgroundItem(0),
-    mMouseButtonPressedDown(false),
     mOpenTimeLine(DialpadOpenAnimDuration),
     mCloseTimeLine(DialpadCloseAnimDuration),
     mAnimationOngoing(false),
@@ -83,7 +91,6 @@
 
     // create keypad
     mKeypad = new DialpadKeypad(mMainWindow,*mInputField,this);
-    mKeypad->setLongPressDuration(DialpadMaxSwipeTime);
 
     // layouting params
     qreal unit = HbDeviceProfile::current().unitValue();
@@ -91,6 +98,9 @@
     mCloseHandleHeight = DialpadCloseHandleHeight * unit;
     mCloseHandleWidth = DialpadCloseHandleWidth * unit;
 
+    mKeypad->callButton().setPreferredHeight(DialpadCallButtonHeight*unit);
+    mKeypad->callButton().setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+
     // create popup background
     mBackgroundDrawer = new HbFrameDrawer();
     mIconDrawer = new HbFrameDrawer();
@@ -100,6 +110,7 @@
         new QGraphicsLinearLayout(Qt::Vertical);
     popupLayout->addItem(mInputField);
     popupLayout->addItem(mKeypad);
+    popupLayout->addItem(&mKeypad->callButton());
     popupLayout->setContentsMargins(margin, mCloseHandleHeight, margin, margin);
     popupLayout->setSpacing(margin);
     setLayout(popupLayout);
@@ -109,6 +120,7 @@
     mInputField->editor().installEventFilter(mMultitap);
 
     // close animation
+    mCloseTimeLine.setUpdateInterval(16);
     mCloseTimeLine.setEasingCurve(QEasingCurve::InQuad);
     connect(&mCloseTimeLine, SIGNAL(finished()),
             SLOT(closeAnimFinished()));
@@ -116,6 +128,7 @@
             SLOT(closeAnimValueChanged(qreal)));
 
     // open animation
+    mOpenTimeLine.setUpdateInterval(16);
     mOpenTimeLine.setEasingCurve(QEasingCurve::OutQuad);
     connect(&mOpenTimeLine, SIGNAL(finished()),
             SLOT(openAnimFinished()));
@@ -140,6 +153,10 @@
     grabGesture(Qt::PanGesture);
     grabGesture(Qt::SwipeGesture);
     grabGesture(Qt::PinchGesture);
+
+    // effects
+    HbEffect::add(this, DIALPAD_TO_PRT_FXML, DIALPAD_TO_PRT_EVENT);
+    HbEffect::add(this, DIALPAD_TO_LSC_FXML, DIALPAD_TO_LSC_EVENT);
 }
 
 Dialpad::~Dialpad()
@@ -233,7 +250,6 @@
     }
 
     if (mOrientation!=previousOrientation) {
-        mKeypad->createButtonGrid();
         updateLayout((Qt::Orientation)mOrientation);
     }
 
@@ -295,58 +311,6 @@
     }
 }
 
-bool Dialpad::sceneEvent(QEvent *event)
-{
-    return handleSceneEvent(event);
-}
-
-bool Dialpad::sceneEventFilter(QGraphicsItem *watched, QEvent *event)        
-{
-    Q_UNUSED(watched);
-
-    return handleSceneEvent(event);
-}
-
-bool Dialpad::handleSceneEvent(QEvent *event)
-{
-    // handle close swipe gesture
-    if (event->type() == QEvent::GraphicsSceneMousePress) {
-        mMouseButtonPressedDown = true;
-        mSwipeTimer.start();
-    } else if (event->type() == QEvent::GraphicsSceneMouseRelease &&
-               mMouseButtonPressedDown) {
-        mMouseButtonPressedDown = false;
-        QGraphicsSceneMouseEvent *mouseEvent =
-            static_cast<QGraphicsSceneMouseEvent*> (event);
-
-        // check if mouse has moved DialpadCloseSwipeDistance vertically
-        QPointF delta = mouseEvent->scenePos() -
-                        mouseEvent->buttonDownScenePos(Qt::LeftButton);
-
-        if (mOrientation==Qt::Vertical) {
-            qreal height = geometry().height() * DialpadCloseSwipeDistanceV;
-
-            if ( (delta.y() >= height) &&
-                 (mSwipeTimer.elapsed() <= DialpadMaxSwipeTime)) {
-                startCloseAnimation();
-            }
-        } else {
-            qreal width = geometry().width() * DialpadCloseSwipeDistanceH;
-            bool swipe = (layoutDirection()==Qt::LeftToRight &&
-                          delta.x() >= width) ||
-                         (layoutDirection()==Qt::RightToLeft &&
-                          -delta.x() >= width);
-
-            if ( swipe &&
-                 (mSwipeTimer.elapsed() <= DialpadMaxSwipeTime)) {
-                startCloseAnimation();
-            }
-        }
-    }
-
-    return false;
-}
-
 void Dialpad::startCloseAnimation()
 {
     if (!mAnimationOngoing) {
@@ -359,10 +323,6 @@
 {
     HbWidget::showEvent(event);
 
-    // for closing swipe gesture
-    installSceneEventFilter(this);
-    setFiltersChildEvents(true);
-
     if (mBackgroundItem) {
         layoutBackgroundItem();
         mBackgroundItem->show();
@@ -372,8 +332,6 @@
 void Dialpad::hideEvent(QHideEvent *event)
 {
     HbWidget::hideEvent(event);
-    setFiltersChildEvents(false);
-    removeSceneEventFilter(this);
 }
 
 void Dialpad::closeEvent(QCloseEvent * event)
@@ -450,9 +408,6 @@
 void Dialpad::orientationChangeStarted()
 {
     hide();
-    // needs to re-create grid layout to get
-    // scale with uniform item sizes
-    mKeypad->createButtonGrid();
 }
 
 void Dialpad::orientationChangeFinished(Qt::Orientation current)
@@ -461,6 +416,13 @@
 
     show();
 
+    // run orientation change effect
+    if (current==Qt::Horizontal) {
+        HbEffect::start(this, DIALPAD_TO_LSC_EVENT);
+    } else {
+        HbEffect::start(this, DIALPAD_TO_PRT_EVENT);
+    }
+
     mOrientation = current;
 
     mPosition = pos();
@@ -494,10 +456,40 @@
                                        mCloseHandleHeight,
                                        margin,
                                        margin);
+        mKeypad->callButton().setPreferredHeight(DialpadCallButtonHeight*unit);
     } else {
         mainLayout->setContentsMargins(mCloseHandleHeight,
                                        margin,
                                        margin,
                                        margin);
+        mKeypad->callButton().setPreferredHeight(DialpadCallButtonHeightH*unit);
     }
 }
+
+void Dialpad::gestureEvent(QGestureEvent *event)
+{
+    bool closeGesture(false);
+
+    if(HbSwipeGesture *gesture = qobject_cast<HbSwipeGesture*>(
+           event->gesture(Qt::SwipeGesture))) {
+        if (gesture->state() == Qt::GestureFinished) {
+            if ( mOrientation==Qt::Vertical &&
+                 gesture->sceneVerticalDirection() == QSwipeGesture::Down ) {
+                closeGesture = true;
+            } else if (layoutDirection()==Qt::LeftToRight &&
+                gesture->sceneHorizontalDirection() == QSwipeGesture::Right) {
+                closeGesture = true;
+            } else if (layoutDirection()==Qt::RightToLeft &&
+                gesture->sceneHorizontalDirection() == QSwipeGesture::Left) {
+                closeGesture = true;
+            }
+        }
+    }
+
+    if (closeGesture) {
+        startCloseAnimation();
+        event->accept();
+    } else {
+        event->ignore();
+    }
+}