src/hbinput/inputwidgets/hbinputvkbwidget.cpp
changeset 1 f7ac710697a9
parent 0 16d8024aca5e
child 2 06ff229162e9
--- a/src/hbinput/inputwidgets/hbinputvkbwidget.cpp	Mon Apr 19 14:02:13 2010 +0300
+++ b/src/hbinput/inputwidgets/hbinputvkbwidget.cpp	Mon May 03 12:48:33 2010 +0300
@@ -45,20 +45,21 @@
 #include <hbstackedwidget.h>
 #include <hbframedrawer.h>
 #include <hbevent.h>
+#include <hbdataform.h>
 
 #include <hbinputmethod.h>
 #include <hbinputsettingproxy.h>
 #include <hbinpututils.h>
 #include <hbinputdef.h>
 #include <hbinputvkbhost.h>
-#include <hbinputsettingdialog.h>
+#include <hbinputsettingwidget.h>
 #include <hbinputcommondialogs.h>
 #include <hbinputkeymap.h>
 #include <hbinputkeymapfactory.h>
 #include <hbwidgetfeedback.h>
-#include <hbsmileyengine.h>
 #include <hbinputpredictionfactory.h>
-
+#include <HbSwipeGesture>
+#include <HbTapGesture>
 #include "hbinputvirtualrocker.h"
 #include "hbinputvkbwidget.h"
 #include "hbinputvkbwidget_p.h"
@@ -129,9 +130,12 @@
 mAnimateWhenDialogCloses(false),
 mKeyboardSize(HbQwerty4x10),
 mCloseHandleHeight(0),
-mCloseHandle(NULL),
+mCloseHandle(0),
+mSettingView(0),
+mCurrentView(0),
 mKeyboardDimmed(false)
 {
+    mScreenshotTimeLine.setUpdateInterval(16);
 }
 
 
@@ -173,6 +177,12 @@
     mReleaseMapper = new QSignalMapper(q);
     mPressMapper = new QSignalMapper(q);
     mActionMapper = new QSignalMapper(q);
+
+    q->grabGesture(Qt::SwipeGesture);
+
+    // eating gestures below the panel (remove when panel starts to do this)
+    q->grabGesture(Qt::TapGesture);
+    q->grabGesture(Qt::PanGesture);
 }
 
 // re-implemented by inherited keyboards
@@ -307,14 +317,10 @@
     if (mOwner->focusObject()->editorInterface().editor()->inherits("HbAbstractEdit")) {
         if (!mOwner->focusObject()->editorInterface().smileyTheme().isNull()) {
             ret = true;
-        }		
-    }	else {
-        HbSmileyEngine smileyEngine;
-        if (!smileyEngine.defaultTheme().isNull()) {
-            ret = true;
-        }	
-    }	
-    return ret;	
+        }
+    }
+
+    return ret;
 }
 /// @endcond
 
@@ -335,11 +341,9 @@
     HbEffect::disable(this);
 #endif // HB_EFFECTS
 
-#if QT_VERSION >= 0x040600
     // Make sure the keypad never steals focus.
     setFlag(QGraphicsItem::ItemIsPanel, true);
     setActive(false);
-#endif
 }
 
 /*!
@@ -359,11 +363,9 @@
     HbEffect::disable(this);
 #endif // HB_EFFECTS
 
-#if QT_VERSION >= 0x040600
     // Make sure the keypad never steals focus.
     setFlag(QGraphicsItem::ItemIsPanel, true);
     setActive(false);
-#endif
 }
 
 /*!
@@ -383,6 +385,7 @@
     d->mCurrentHost = host;
     d->mRocker->setVisible(d->mShowRocker);
     d->setRockerPosition();
+    d->mFlickDirection = HbFlickDirectionNone;
 }
 
 /*!
@@ -396,6 +399,7 @@
     Q_D(HbInputVkbWidget);
 
     d->mRocker->setVisible(false);
+    d->mFlickDirection = HbFlickDirectionNone;
 }
 
 /*!
@@ -406,71 +410,22 @@
 void HbInputVkbWidget::keyboardMinimized(HbVkbHost *host)
 {
     Q_UNUSED(host);
-}
-
-/*!
-handles mouse press event.
-*/
-void HbInputVkbWidget::mousePressEvent(QGraphicsSceneMouseEvent* event)
-{
     Q_D(HbInputVkbWidget);
-    Q_UNUSED(event);
-    if (!d->mMouseButtonPressedDown) {
-        d->mMouseButtonPressedDown = true;
-        d->mMousePressTime.start();
-    }
+    d->mFlickDirection = HbFlickDirectionNone;
 }
 
 /*!
-Handles mouse release event.
+\deprecated HbInputVkbWidget::mousePressEvent(QGraphicsSceneMouseEvent*)
+    is deprecated.
 */
-void HbInputVkbWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
+void HbInputVkbWidget::mousePressEvent(QGraphicsSceneMouseEvent* event)
 {
-    Q_D(HbInputVkbWidget);
-    d->mFlickDirection = HbFlickDirectionNone;
-    d->mMouseButtonPressedDown = false;
-
-    QPointF mouseDownpoint = event->buttonDownScenePos(Qt::LeftButton);
-
-    if (d->mCurrentHost && d->mCurrentHost->keypadStatus() != HbVkbHost::HbVkbStatusOpened &&
-        d->mCurrentHost->activeKeypad() && d->mOwner) {
-        HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
-        d->mCurrentHost->openKeypad(d->mCurrentHost->activeKeypad(), d->mOwner);
-    } else if (d->mMousePressTime.elapsed() < MaxSweepTime || mouseDownpoint.y() <= scenePos().y() + d->mCloseHandleHeight) {
-        QPointF delta = event->scenePos() - mouseDownpoint;
-
-        qreal height;
-        if (HbInputSettingProxy::instance()->screenOrientation() == Qt::Horizontal) {
-            height = geometry().height() * 0.5;
-        } else {
-            // For ITU-T, 40% of the scene height is considered.
-            height = 0.4 * geometry().height();
-        }
-        // If the user drags the mouse on keypad and the
-        // delta is greater than 10% of the height, keypad is closed
-        height = HbMouseDragDelta * height;
-
-        if (delta.y() > height) {
-            HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
-            d->mFlickDirection = HbFlickDirectionDown;
-            emit keypadCloseEventDetected(HbVkbCloseMethodButtonDrag);
-        }
-
-        if (qAbs(delta.x()) > SweepLength) {
-
-            d->mFlickDirection = delta.x()>0 ? HbFlickDirectionRight : HbFlickDirectionLeft;
-
-            if (d->mFlickAnimation){
-                HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
-                animKeyboardChange();
-            }
-            emit flickEvent(d->mFlickDirection);
-        }
-    }
+    Q_UNUSED(event);
 }
 
 /*!
-Handles virtual key press
+\deprecated HbInputVkbWidget::mappedKeyPress(int)
+    is deprecated.
 */
 void HbInputVkbWidget::mappedKeyPress(int buttonid)
 {
@@ -479,7 +434,8 @@
 }
 
 /*!
-Handles virtual key release
+\deprecated HbInputVkbWidget::mappedKeyRelease(int)
+    is deprecated.
 */
 void HbInputVkbWidget::mappedKeyRelease(int buttonid)
 {
@@ -572,8 +528,7 @@
 }
 
 /*!
-This is called right before the keypad is about to open. This gives inheriting classes opportunity
-to do whatever initialization they need to do at this point.
+\reimp
 */
 void HbInputVkbWidget::aboutToOpen(HbVkbHost *host)
 {
@@ -594,7 +549,7 @@
 
         d->mCloseHandle = new QGraphicsWidget();
         d->mCloseHandle->setObjectName("vkbHandle");
-        d->mCloseHandleHeight = HbCloseHandleHeight;
+        d->mCloseHandleHeight = (int)HbCloseHandleHeight;
         d->mCloseHandle->setMinimumHeight(d->mCloseHandleHeight);
         d->mCloseHandle->setMaximumHeight(d->mCloseHandleHeight);
 
@@ -613,7 +568,7 @@
 }
 
 /*!
-This is called right before the keypad is about to close.
+\reimp
 */
 void HbInputVkbWidget::aboutToClose(HbVkbHost *host)
 {
@@ -662,28 +617,36 @@
 
     if (!d->mSettingList) {
         d->mSettingList = new HbInputSettingList();
-        connect(d->mSettingList, SIGNAL(aboutToClose()), this, SLOT(settingsClosed()));
-        connect(d->mSettingList, SIGNAL(inputSettingsButtonClicked()), this, SLOT(executeSettingsDialog()));
+        connect(d->mSettingList, SIGNAL(inputSettingsButtonClicked()), this, SLOT(showSettingsView()));
         connect(d->mSettingList, SIGNAL(inputMethodsButtonClicked()), this, SLOT(executeMethodDialog()));
     }
 
-#if QT_VERSION >= 0x040600
     HbInputFocusObject *focusObject = d->mOwner->focusObject();
     if (focusObject &&
         focusObject->editorInterface().isPredictionAllowed() &&
-        !focusObject->editorInterface().isNumericEditor() &&
         predFactory->predictionEngineForLanguage(HbInputSettingProxy::instance()->globalInputLanguage())) {
         d->mSettingList->setPredictionSelectionEnabled(true);
     } else {
         d->mSettingList->setPredictionSelectionEnabled(false);
     }
-#endif
 
     d->mSettingsButton->setBackgroundAttributes(HbTouchKeypadButton::HbTouchButtonLatched);
     qreal x = d->mSettingsButton->scenePos().x() + d->mSettingsButton->rect().width();
     qreal y = d->mSettingsButton->scenePos().y();
     d->mSettingList->setPreferredPos(QPointF(x, y), HbPopup::BottomRightCorner);
-    d->mSettingList->showSettingList();
+    d->mSettingList->updateSettingList();
+    d->mSettingList->open(this, SLOT(settingsClosed()));
+}
+
+/*!
+Slot which is called when settings list is closed.
+*/
+void HbInputVkbWidget::settingsClosed()
+{
+    Q_D(HbInputVkbWidget);
+
+    d->mSettingsButton->setBackgroundAttributes(HbTouchKeypadButton::HbTouchButtonReleased);
+
     d->mSettingsListOpen = false;
     if ( d->mAnimateWhenDialogCloses ) {
         animKeyboardChange();
@@ -694,15 +657,6 @@
 }
 
 /*!
-Slot to connect aboutToClose of settings list to update keyboard graphics.
-*/
-void HbInputVkbWidget::settingsClosed()
-{
-    Q_D(HbInputVkbWidget);
-    d->mSettingsButton->setBackgroundAttributes(HbTouchKeypadButton::HbTouchButtonReleased);
-}
-
-/*!
 Closes settings list
 */
 void HbInputVkbWidget::closeSettingList()
@@ -713,39 +667,62 @@
 }
 
 /*!
-Toggles prediction status.
+\deprecated HbInputVkbWidget::togglePredictionStatus()
+    is deprecated.
 */
 void HbInputVkbWidget::togglePredictionStatus()
 {
     closeSettingList();
-    bool predictionStatus = HbInputSettingProxy::instance()->predictiveInputStatus();
-    HbInputSettingProxy::instance()->setPredictiveInputStatus(!predictionStatus);
+    HbInputSettingProxy::instance()->togglePrediction();
     update();
 }
 
 /*!
-Executes settingsDialog
+\deprecated HbInputVkbWidget::executeSettingsDialog()
+    is deprecated. Use showSettingsView instead.
 */
 void HbInputVkbWidget::executeSettingsDialog()
 {
+}
+
+/*!
+Shows settings view
+*/
+void HbInputVkbWidget::showSettingsView()
+{
     Q_D(HbInputVkbWidget);
 
     closeSettingList();
-    HbInputSettingDialog::HbSettingItems items = HbInputSettingDialog::HbSettingItemAll;
-    if (d->mOwner->focusObject()->editorInterface().isNumericEditor()) {
-        items &=  (~HbInputSettingDialog::HbSettingItemPrediction);
-    }
-    HbInputSettingDialog* settings = new HbInputSettingDialog(items);
-    d->mSettingsListOpen = true;
-    settings->exec();
-    delete settings;
-    d->mSettingsListOpen = false;
-    if ( d->mAnimateWhenDialogCloses ) {
-        animKeyboardChange();
-        d->mAnimateWhenDialogCloses = false;
-    } else {
-        keypadLanguageChangeFinished();
-    }
+
+    d->mSettingView = new HbView(this);
+    d->mSettingView->setTitle(tr("Input Settings"));
+    mainWindow()->addView(d->mSettingView);
+
+    HbAction *backAction = new HbAction(Hb::BackNaviAction, d->mSettingView);
+    backAction->setText(tr("Back"));
+    connect(backAction, SIGNAL(triggered(bool)), this, SLOT(closeSettingsView()));
+    d->mSettingView->setNavigationAction(backAction);
+
+    HbDataForm *dataForm = new HbDataForm();
+    d->mSettingView->setWidget(dataForm);
+    HbInputSettingWidget *settingWidget = new HbInputSettingWidget(dataForm, d->mSettingView);
+    settingWidget->initializeWidget();
+
+    d->mCurrentView = mainWindow()->currentView();
+    mainWindow()->setCurrentView(d->mSettingView);
+}
+
+/*!
+Closes settings view and returns to previous view
+*/
+void HbInputVkbWidget::closeSettingsView()
+{
+    Q_D(HbInputVkbWidget);
+
+    mainWindow()->setCurrentView(d->mCurrentView);
+    mainWindow()->removeView(d->mSettingView);
+    delete d->mSettingView;
+    d->mSettingView = 0;
 }
 
 /*!
@@ -764,9 +741,8 @@
 }
 
 /*!
-Virtual function, each derived keypads should calculate and provide the
-layout information through this functions. This layout information is used
-by HbInputVkbWidget for layouting different components of vkb.
+\deprecated HbInputVkbWidget::keypadLayout()
+    is deprecated.
 */
 QGraphicsLayout *HbInputVkbWidget::keypadLayout()
 {
@@ -775,7 +751,7 @@
 }
 
 /*!
-Returns the keypad in QWidget form.
+\reimp
 */
 QWidget* HbInputVkbWidget::asWidget()
 {
@@ -783,7 +759,7 @@
 }
 
 /*!
-Returns the keypad in QGraphicsWidget form.
+\reimp
 */
 QGraphicsWidget* HbInputVkbWidget::asGraphicsWidget()
 {
@@ -791,7 +767,7 @@
 }
 
 /*!
-Returns preferred keyboard size. HbVkbHost uses this information when it opens the keyboard.
+\reimp
 */
 QSizeF HbInputVkbWidget::preferredKeyboardSize()
 {
@@ -807,7 +783,7 @@
 }
 
 /*!
-This method is called every time vkb host draws an opening animation frame.
+\reimp
 */
 void HbInputVkbWidget::keyboardAnimationFrame(HbVkbAnimationType type, qreal x)
 {
@@ -827,7 +803,7 @@
     QSizeF ret = preferredKeyboardSize();
     if (ret.height() >  d->mCloseHandleHeight) {
         ret.setHeight(ret.height() - d->mCloseHandleHeight);
-	}
+    }
 
     return ret;
 }
@@ -844,7 +820,6 @@
     d->mDrawbackground = backgroundEnabled;
 }
 
-
 /*!
 Returns all possible keys those the user could have intended to press
 for the last registered touch along with their corresponding probability.
@@ -915,7 +890,8 @@
 }
 
 /*!
-Sets up the common buttons in the tool cluster (settings and application buttons).
+\deprecated HbInputVkbWidget::setupToolCluster()
+    is deprecated.
 */
 void HbInputVkbWidget::setupToolCluster()
 {
@@ -993,18 +969,18 @@
             d->mApplicationButton->setText(QString());
             d->mApplicationButton->setIcon(HbIcon());
             d->mApplicationButton->setToolTip(QString());
-			d->mApplicationButtonAction = 0;
+            d->mApplicationButtonAction = 0;
         } else {
             d->mApplicationButton = new HbTouchKeypadButton(this, QString());
             d->mApplicationButton->setButtonType(HbTouchKeypadButton::HbTouchButtonFunction);
             d->mApplicationButton->setBackgroundAttributes(HbTouchKeypadButton::HbTouchButtonReleased);
         }
-        d->mApplicationButtonAction = NULL;
+        d->mApplicationButtonAction = 0;
     }
 }
 
 /*!
-shape function actually refines the bounding rect. This function is used for collision detection
+Refines the bounding rect. This function is used for collision detection
 and hit test.
 */
 QPainterPath HbInputVkbWidget::shape() const
@@ -1015,24 +991,30 @@
     return path;
 }
 
+/*!
+\reimp
+*/
 QSizeF HbInputVkbWidget::minimizedKeyboardSize()
 {
     Q_D(HbInputVkbWidget);
     return QSizeF(0.0, d->mCloseHandleHeight);
 }
 
+/*!
+Shows smiley picker widget.
+*/
 void HbInputVkbWidget::showSmileyPicker(int rows, int columns)
 {
     Q_D(HbInputVkbWidget);
     if (!d->mOwner || !d->mOwner->focusObject()) {
         return;
     }
-    // check whether the smiley recognition is enabled 	in the currently focused editor.
+    // check whether the smiley recognition is enabled  in the currently focused editor.
     if (!d->isSmileysEnabled()) {
         return;
     }
     HbInputFocusObject *focusObject = d->mOwner->focusObject();
-	
+
     if (!d->mSmileyPicker || d->mFocusedObject != focusObject) {
         d->mFocusedObject = focusObject;
         if (d->mSmileyPicker) {
@@ -1040,27 +1022,25 @@
         }
         // get the smiley list from editor interface smiley theme.
         QStringList smileys = focusObject->editorInterface().smileyTheme().smileys();
-        // if the smiley list is empty and the editor is not a Hb editor, 
-        // then get the default smiley list from smiley engine.
-        if (smileys.isEmpty() && !focusObject->editorInterface().editor()->inherits("HbAbstractEdit")) {
-            HbSmileyEngine smileyEngine;
-            smileys = smileyEngine.defaultTheme().smileys();
-        }
 
         if (!smileys.isEmpty()) {
             d->mSmileyPicker = new HbInputSmileyPicker(rows, columns, 0, smileys);
             d->mSmileyPicker->setObjectName("vkbwidget_smiley_picker");
             connect(d->mSmileyPicker, SIGNAL(selected(QString)), this, SIGNAL(smileySelected(QString)));
-        }			
+        }
     }
 
     if (d->mSmileyPicker) {
         d->mSmileyPicker->setGeometry(QRectF(0, pos().y(), geometry().width(),
             geometry().height()));
         d->mSmileyPicker->show();
-    }		
+    }
 }
 
+/*!
+\deprecated HbInputVkbWidget::flickDirection()
+    is deprecated.
+*/
 HbInputVkbWidget::HbFlickDirection HbInputVkbWidget::flickDirection()
 {
     Q_D(HbInputVkbWidget);
@@ -1068,7 +1048,8 @@
 }
 
 /*!
-    Intended for internal use only
+\deprecated HbInputVkbWidget::refreshApplicationButton()
+    is deprecated.
 */
 void HbInputVkbWidget::refreshApplicationButton()
 {
@@ -1091,7 +1072,7 @@
     }
 }
 
-void HbInputVkbWidget::keypadLanguageChangeAnimationUpdate(qreal aValue)
+void HbInputVkbWidget::keypadLanguageChangeAnimationUpdate(qreal value)
 {
     Q_D(HbInputVkbWidget);
 
@@ -1102,7 +1083,7 @@
 
     QRectF rect = boundingRect();
     QPointF position = pos();
-    position.setX(direction * (-rect.width() + rect.width() * aValue));
+    position.setX(direction * (-rect.width() + rect.width() * value));
     if (d->mScreenshotWidget) {
        d->mScreenshotWidget->setPos(position.x() + direction * rect.width(), position.y());
        setPos(position);
@@ -1113,7 +1094,8 @@
 {
     Q_D(HbInputVkbWidget);
     delete d->mScreenshotWidget;
-    d->mScreenshotWidget = NULL;
+    d->mScreenshotWidget = 0;
+    d->mFlickDirection = HbFlickDirectionNone;
 }
 
 void HbInputVkbWidget::animKeyboardChange()
@@ -1133,6 +1115,9 @@
     }
 }
 
+/*!
+\reimp
+*/
 QSizeF HbInputVkbWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
 {
     Q_UNUSED(constraint);
@@ -1159,7 +1144,7 @@
 }
 
 /*!
-    \reimp
+\reimp
  */
 void HbInputVkbWidget::changeEvent(QEvent *event)
 {
@@ -1171,4 +1156,42 @@
     HbWidget::changeEvent(event);
 }
 
+/*!
+\reimp
+*/
+void HbInputVkbWidget::gestureEvent(QGestureEvent *event)
+{
+    Q_D(HbInputVkbWidget);
+
+    if(HbSwipeGesture *gesture = qobject_cast<HbSwipeGesture *>(event->gesture(Qt::SwipeGesture))) {
+        if (gesture->state() == Qt::GestureFinished) {
+            HbWidgetFeedback::triggered(this, Hb::InstantFlicked);
+            // vertical swipes
+            if (gesture->sceneSwipeAngle() > 250 && gesture->sceneSwipeAngle() < 290 &&
+                    gesture->sceneVerticalDirection() == QSwipeGesture::Down) {
+                d->mFlickDirection = HbFlickDirectionDown;
+                emit keypadCloseEventDetected(HbVkbCloseMethodCloseGesture);
+            } else if (gesture->sceneSwipeAngle() > 70 && gesture->sceneSwipeAngle() < 110 &&
+                           gesture->sceneVerticalDirection() == QSwipeGesture::Up) {
+                d->mFlickDirection = HbFlickDirectionUp;
+                d->mCurrentHost->openKeypad(d->mCurrentHost->activeKeypad(), d->mOwner);
+            } else {
+                d->mFlickDirection = (HbInputVkbWidget::HbFlickDirection)gesture->sceneHorizontalDirection();
+                // horizontal swipes
+                if (d->mFlickAnimation){
+                    animKeyboardChange();
+                }
+                emit flickEvent(d->mFlickDirection);
+            }
+        }
+    } else if(HbTapGesture *gesture = qobject_cast<HbTapGesture *>(event->gesture(Qt::TapGesture))) {
+        if (gesture->state() == Qt::GestureFinished) {        
+            // if keypad is minimized, open it 
+            if ( d->mCurrentHost->keypadStatus() == HbVkbHost::HbVkbStatusMinimized ) {
+                d->mCurrentHost->openKeypad(this, d->mOwner);
+            }
+        }
+    }
+}
+
 // End of file