diff -r 16d8024aca5e -r f7ac710697a9 src/hbinput/inputwidgets/hbinputvkbwidget.cpp --- 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 #include #include +#include #include #include #include #include #include -#include +#include #include #include #include #include -#include #include - +#include +#include #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(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(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