21 ** If you have questions regarding the use of this file, please contact |
21 ** If you have questions regarding the use of this file, please contact |
22 ** Nokia at developer.feedback@nokia.com. |
22 ** Nokia at developer.feedback@nokia.com. |
23 ** |
23 ** |
24 ****************************************************************************/ |
24 ****************************************************************************/ |
25 |
25 |
|
26 #include "hbpangesture.h" |
|
27 #include "hbpangesturelogic_p.h" |
|
28 #include "hbgestures_p.h" |
|
29 |
|
30 #include "hbnamespace_p.h" |
|
31 #include <hbdeviceprofile.h> |
|
32 |
26 #include <QEvent> |
33 #include <QEvent> |
27 #include <QGestureRecognizer> |
34 #include <QGestureRecognizer> |
28 #include <QGraphicsView> |
35 #include <QGraphicsView> |
29 #include <QMouseEvent> |
36 #include <QMouseEvent> |
30 #include <QGraphicsScene> |
37 #include <QGraphicsScene> |
31 |
38 |
32 #include <hbdeviceprofile.h> |
|
33 |
|
34 #include "hbpangesture.h" |
|
35 #include "hbpangesture_p.h" |
|
36 #include "hbpangesturelogic_p.h" |
|
37 #include "hbnamespace_p.h" |
|
38 |
39 |
39 #define followedTouchPoint(te, gesture) te->touchPoints().at(followedTouchPointIndex(te, gesture)) |
40 #define followedTouchPoint(te, gesture) te->touchPoints().at(followedTouchPointIndex(te, gesture)) |
40 |
41 |
41 /*! |
42 /*! |
42 @hbcore |
43 @hbcore |
100 gesture->d_ptr->mDeltaSinceLastTimeStamp = QPointF(0,0); |
100 gesture->d_ptr->mDeltaSinceLastTimeStamp = QPointF(0,0); |
101 gesture->d_ptr->mSceneStartPos = QPointF(0,0); |
101 gesture->d_ptr->mSceneStartPos = QPointF(0,0); |
102 gesture->d_ptr->mSceneLastOffset = QPointF(0,0); |
102 gesture->d_ptr->mSceneLastOffset = QPointF(0,0); |
103 gesture->d_ptr->mSceneOffset = QPointF(0,0); |
103 gesture->d_ptr->mSceneOffset = QPointF(0,0); |
104 gesture->d_ptr->mSceneDeltaSinceLastTimeStamp = QPointF(0,0); |
104 gesture->d_ptr->mSceneDeltaSinceLastTimeStamp = QPointF(0,0); |
105 gesture->d_ptr->mAxisX.clear(); |
105 gesture->d_ptr->mAxisX.resetRecorder(); |
106 gesture->d_ptr->mAxisY.clear(); |
106 gesture->d_ptr->mAxisY.resetRecorder(); |
107 gesture->d_ptr->mSceneAxisX.clear(); |
107 gesture->d_ptr->mSceneAxisX.resetRecorder(); |
108 gesture->d_ptr->mSceneAxisY.clear(); |
108 gesture->d_ptr->mSceneAxisY.resetRecorder(); |
109 |
109 |
110 gesture->setLastOffset(QPointF()); |
110 gesture->setLastOffset(QPointF()); |
111 gesture->setOffset(QPointF(0,0)); |
111 gesture->setOffset(QPointF(0,0)); |
112 gesture->setAcceleration(0); |
112 gesture->setAcceleration(0); |
113 gesture->setStartPos(QPointF()); |
113 gesture->setStartPos(QPointF()); |
140 gesture->setLastOffset( QPointF( 0,0 ) ); |
141 gesture->setLastOffset( QPointF( 0,0 ) ); |
141 QPointF scenePos = HbGestureUtils::mapToScene(watched, me->globalPos()); |
142 QPointF scenePos = HbGestureUtils::mapToScene(watched, me->globalPos()); |
142 gesture->d_ptr->mSceneStartPos = scenePos; |
143 gesture->d_ptr->mSceneStartPos = scenePos; |
143 gesture->d_ptr->mSceneOffset = HbGestureUtils::mapToScene(watched, QPointF(0,0)); |
144 gesture->d_ptr->mSceneOffset = HbGestureUtils::mapToScene(watched, QPointF(0,0)); |
144 gesture->d_ptr->mSceneLastOffset = HbGestureUtils::mapToScene(watched, QPointF(0,0)); |
145 gesture->d_ptr->mSceneLastOffset = HbGestureUtils::mapToScene(watched, QPointF(0,0)); |
145 gesture->d_ptr->mLastTimeStamp = mCurrentTime; |
146 gesture->d_ptr->mLastTimeStamp = currentTime; |
146 |
147 |
147 |
148 |
148 gesture->d_ptr->mThresholdSquare = HbDefaultPanThreshold * HbDeviceProfile::current().ppmValue(); |
149 gesture->d_ptr->mThresholdSquare = HbDefaultPanThreshold * HbDeviceProfile::current().ppmValue(); |
149 gesture->d_ptr->mThresholdSquare = gesture->d_ptr->mThresholdSquare * gesture->d_ptr->mThresholdSquare; |
150 gesture->d_ptr->mThresholdSquare = gesture->d_ptr->mThresholdSquare * gesture->d_ptr->mThresholdSquare; |
150 |
151 |
152 |
153 |
153 gesture->d_ptr->mAxisX.resetRecorder(velocityThreshold); |
154 gesture->d_ptr->mAxisX.resetRecorder(velocityThreshold); |
154 gesture->d_ptr->mAxisY.resetRecorder(velocityThreshold); |
155 gesture->d_ptr->mAxisY.resetRecorder(velocityThreshold); |
155 gesture->d_ptr->mSceneAxisX.resetRecorder(velocityThreshold); |
156 gesture->d_ptr->mSceneAxisX.resetRecorder(velocityThreshold); |
156 gesture->d_ptr->mSceneAxisY.resetRecorder(velocityThreshold); |
157 gesture->d_ptr->mSceneAxisY.resetRecorder(velocityThreshold); |
157 gesture->d_ptr->mAxisX.record( me->globalPos().x(), mCurrentTime ); |
158 gesture->d_ptr->mAxisX.record( me->globalPos().x(), currentTime ); |
158 gesture->d_ptr->mAxisY.record( me->globalPos().y(), mCurrentTime ); |
159 gesture->d_ptr->mAxisY.record( me->globalPos().y(), currentTime ); |
159 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), mCurrentTime ); |
160 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), currentTime ); |
160 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), mCurrentTime ); |
161 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), currentTime ); |
161 |
162 |
162 return QGestureRecognizer::MayBeGesture; |
163 return QGestureRecognizer::MayBeGesture; |
163 } |
164 } |
164 |
165 |
165 /*! |
166 /*! |
183 gesture->setLastOffset( gesture->offset().toPoint() ); |
185 gesture->setLastOffset( gesture->offset().toPoint() ); |
184 gesture->setOffset( offset ); |
186 gesture->setOffset( offset ); |
185 gesture->d_ptr->mSceneLastOffset = gesture->d_ptr->mSceneOffset; |
187 gesture->d_ptr->mSceneLastOffset = gesture->d_ptr->mSceneOffset; |
186 gesture->d_ptr->mSceneOffset = |
188 gesture->d_ptr->mSceneOffset = |
187 HbGestureUtils::mapToScene(watched, me->globalPos()) - gesture->d_ptr->mSceneStartPos; |
189 HbGestureUtils::mapToScene(watched, me->globalPos()) - gesture->d_ptr->mSceneStartPos; |
188 gesture->d_ptr->mLastTimeStamp = mCurrentTime; |
190 gesture->d_ptr->mLastTimeStamp = currentTime; |
189 |
191 |
190 QPointF scenePos = HbGestureUtils::mapToScene(watched, me->globalPos()); |
192 QPointF scenePos = HbGestureUtils::mapToScene(watched, me->globalPos()); |
191 gesture->d_ptr->mAxisX.record( me->globalPos().x(), mCurrentTime ); |
193 gesture->d_ptr->mAxisX.record( me->globalPos().x(), currentTime ); |
192 gesture->d_ptr->mAxisY.record( me->globalPos().y(), mCurrentTime ); |
194 gesture->d_ptr->mAxisY.record( me->globalPos().y(), currentTime ); |
193 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), mCurrentTime ); |
195 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), currentTime ); |
194 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), mCurrentTime ); |
196 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), currentTime ); |
195 |
197 |
196 |
198 |
197 QGraphicsView* view = qobject_cast<QGraphicsView*>(watched->parent()); |
199 QGraphicsView* view = qobject_cast<QGraphicsView*>(watched->parent()); |
198 if (view) { |
200 if (view) { |
199 QGraphicsScene* scene = view->scene(); |
201 QGraphicsScene* scene = view->scene(); |
286 gesture->setLastOffset( QPointF( 0,0 ) ); |
290 gesture->setLastOffset( QPointF( 0,0 ) ); |
287 |
291 |
288 gesture->d_ptr->mSceneStartPos = scenePos; |
292 gesture->d_ptr->mSceneStartPos = scenePos; |
289 gesture->d_ptr->mSceneOffset = QPointF(0,0); |
293 gesture->d_ptr->mSceneOffset = QPointF(0,0); |
290 gesture->d_ptr->mSceneLastOffset = QPointF(0,0); |
294 gesture->d_ptr->mSceneLastOffset = QPointF(0,0); |
291 gesture->d_ptr->mLastTimeStamp = mCurrentTime; |
295 gesture->d_ptr->mLastTimeStamp = currentTime; |
292 |
296 |
293 qreal defaultThreshold = HbDefaultPanThreshold * HbDeviceProfile::current().ppmValue(); |
297 qreal defaultThreshold = HbDefaultPanThreshold * HbDeviceProfile::current().ppmValue(); |
294 gesture->d_ptr->mThresholdSquare = defaultThreshold * defaultThreshold; |
298 gesture->d_ptr->mThresholdSquare = defaultThreshold * defaultThreshold; |
295 |
299 |
296 gesture->d_ptr->mAxisX.resetRecorder(defaultThreshold); |
300 gesture->d_ptr->mAxisX.resetRecorder(defaultThreshold); |
297 gesture->d_ptr->mAxisY.resetRecorder(defaultThreshold); |
301 gesture->d_ptr->mAxisY.resetRecorder(defaultThreshold); |
298 gesture->d_ptr->mSceneAxisX.resetRecorder(defaultThreshold); |
302 gesture->d_ptr->mSceneAxisX.resetRecorder(defaultThreshold); |
299 gesture->d_ptr->mSceneAxisY.resetRecorder(defaultThreshold); |
303 gesture->d_ptr->mSceneAxisY.resetRecorder(defaultThreshold); |
300 gesture->d_ptr->mAxisY.record( tp.screenPos().y(), mCurrentTime ); |
304 gesture->d_ptr->mAxisY.record( tp.screenPos().y(), currentTime ); |
301 gesture->d_ptr->mAxisX.record( tp.screenPos().x(), mCurrentTime ); |
305 gesture->d_ptr->mAxisX.record( tp.screenPos().x(), currentTime ); |
302 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), mCurrentTime ); |
306 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), currentTime ); |
303 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), mCurrentTime ); |
307 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), currentTime ); |
304 |
308 |
305 if (gestureState != Qt::NoGesture) { |
309 if (gestureState != Qt::NoGesture) { |
306 return QGestureRecognizer::Ignore; |
310 return QGestureRecognizer::Ignore; |
307 } else { |
311 } else { |
308 return QGestureRecognizer::MayBeGesture; |
312 return QGestureRecognizer::MayBeGesture; |
343 gesture->setLastOffset( gesture->offset().toPoint() ); |
348 gesture->setLastOffset( gesture->offset().toPoint() ); |
344 gesture->setOffset( offset ); |
349 gesture->setOffset( offset ); |
345 gesture->d_ptr->mSceneLastOffset = gesture->d_ptr->mSceneOffset; |
350 gesture->d_ptr->mSceneLastOffset = gesture->d_ptr->mSceneOffset; |
346 gesture->d_ptr->mSceneOffset = |
351 gesture->d_ptr->mSceneOffset = |
347 HbGestureUtils::mapToScene(watched, tp.screenPos()) - gesture->d_ptr->mSceneStartPos; |
352 HbGestureUtils::mapToScene(watched, tp.screenPos()) - gesture->d_ptr->mSceneStartPos; |
348 gesture->d_ptr->mLastTimeStamp = mCurrentTime; |
353 gesture->d_ptr->mLastTimeStamp = currentTime; |
349 |
354 |
350 gesture->d_ptr->mAxisX.record( tp.screenPos().x(), mCurrentTime ); |
355 gesture->d_ptr->mAxisX.record( tp.screenPos().x(), currentTime ); |
351 gesture->d_ptr->mAxisY.record( tp.screenPos().y(), mCurrentTime ); |
356 gesture->d_ptr->mAxisY.record( tp.screenPos().y(), currentTime ); |
352 QPointF scenePos = HbGestureUtils::mapToScene(watched, tp.screenPos()); |
357 QPointF scenePos = HbGestureUtils::mapToScene(watched, tp.screenPos()); |
353 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), mCurrentTime ); |
358 gesture->d_ptr->mSceneAxisX.record( scenePos.x(), currentTime ); |
354 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), mCurrentTime ); |
359 gesture->d_ptr->mSceneAxisY.record( scenePos.y(), currentTime ); |
355 |
360 |
356 QGraphicsView* view = qobject_cast<QGraphicsView*>(watched->parent()); |
361 QGraphicsView* view = qobject_cast<QGraphicsView*>(watched->parent()); |
357 if (view) { |
362 if (view) { |
358 QGraphicsScene* scene = view->scene(); |
363 QGraphicsScene* scene = view->scene(); |
359 if (scene && scene->property(HbPrivate::OverridingGesture.latin1()).isValid() && |
364 if (scene && scene->property(HbPrivate::OverridingGesture.latin1()).isValid() && |
403 QGestureRecognizer::Result HbPanGestureLogic::recognize( |
409 QGestureRecognizer::Result HbPanGestureLogic::recognize( |
404 Qt::GestureState gestureState, |
410 Qt::GestureState gestureState, |
405 HbPanGesture *gesture, |
411 HbPanGesture *gesture, |
406 QObject *watched, |
412 QObject *watched, |
407 QEvent *event, |
413 QEvent *event, |
408 QTime currentTime) |
414 qint64 currentTime) |
409 { |
415 { |
410 // Record the time right away. |
|
411 mCurrentTime = currentTime; |
|
412 |
|
413 if ( isMouseEvent(event->type()) ) |
416 if ( isMouseEvent(event->type()) ) |
414 { |
417 { |
415 if (gesture->d_ptr->mIgnoreMouseEvents) { |
418 if (gesture->d_ptr->mIgnoreMouseEvents) { |
416 return QGestureRecognizer::Ignore; |
419 return QGestureRecognizer::Ignore; |
417 } |
420 } |
418 QMouseEvent* me = static_cast<QMouseEvent*>(event); |
421 QMouseEvent* me = static_cast<QMouseEvent*>(event); |
419 switch(event->type()) |
422 switch(event->type()) |
420 { |
423 { |
421 case QEvent::MouseButtonDblClick: |
424 case QEvent::MouseButtonDblClick: |
422 case QEvent::MouseButtonPress: |
425 case QEvent::MouseButtonPress: |
423 return handleMousePress(gestureState, gesture, watched, me); |
426 return handleMousePress(gestureState, gesture, watched, me, currentTime); |
424 case QEvent::MouseMove: |
427 case QEvent::MouseMove: |
425 return handleMouseMove(gestureState, gesture, watched, me); |
428 return handleMouseMove(gestureState, gesture, watched, me, currentTime); |
426 case QEvent::MouseButtonRelease: |
429 case QEvent::MouseButtonRelease: |
427 return handleMouseRelease(gestureState, gesture, watched, me); |
430 return handleMouseRelease(gestureState, gesture, watched, me, currentTime); |
428 default: break; |
431 default: break; |
429 } |
432 } |
430 } |
433 } |
431 if (isTouchEvent(event->type()) && watched->isWidgetType() ) { |
434 if (isTouchEvent(event->type()) && watched->isWidgetType() ) { |
432 |
435 |
433 QTouchEvent *te = static_cast<QTouchEvent *>(event); |
436 QTouchEvent *te = static_cast<QTouchEvent *>(event); |
434 |
437 |
435 switch(event->type()) |
438 switch(event->type()) |
436 { |
439 { |
437 case QEvent::TouchBegin: |
440 case QEvent::TouchBegin: |
438 return handleTouchBegin(gestureState, gesture, watched, te); |
441 return handleTouchBegin(gestureState, gesture, watched, te, currentTime); |
439 break; |
|
440 case QEvent::TouchUpdate: { |
442 case QEvent::TouchUpdate: { |
441 gesture->d_ptr->mIgnoreMouseEvents = true; |
443 gesture->d_ptr->mIgnoreMouseEvents = true; |
442 |
444 |
443 if (followedTouchPoint(te, gesture).state() == Qt::TouchPointReleased) { |
445 if (followedTouchPoint(te, gesture).state() == Qt::TouchPointReleased) { |
444 //qDebug() << "---- Finger changed ----"; |
446 //qDebug() << "---- Finger changed ----"; |
445 return handleTouchBegin(gestureState, gesture, watched, te); |
447 return handleTouchBegin(gestureState, gesture, watched, te, currentTime); |
446 } |
448 } |
447 if (followedTouchPoint(te, gesture).state() == Qt::TouchPointMoved) { |
449 if (followedTouchPoint(te, gesture).state() == Qt::TouchPointMoved) { |
448 return handleTouchMove(gestureState, gesture, watched, te); |
450 return handleTouchMove(gestureState, gesture, watched, te, currentTime); |
449 } |
451 } |
450 break; |
452 break; |
451 } |
453 } |
452 case QEvent::TouchEnd: |
454 case QEvent::TouchEnd: |
453 //qDebug() << "===== TOUCHEND ======" ; |
455 //qDebug() << "===== TOUCHEND ======" ; |
454 gesture->d_ptr->mIgnoreMouseEvents = false; |
456 gesture->d_ptr->mIgnoreMouseEvents = false; |
455 return handleTouchEnd(gestureState, gesture, watched, te); |
457 return handleTouchEnd(gestureState, gesture, watched, te, currentTime); |
456 default: |
458 default: |
457 break; |
459 break; |
458 } |
460 } |
459 } |
461 } |
460 return QGestureRecognizer::Ignore; |
462 return QGestureRecognizer::Ignore; |