qstmgesturelib/recognisers/qstmpinchgesturerecogniser.cpp
changeset 16 3c88a81ff781
parent 3 0954f5dd2cd0
equal deleted inserted replaced
14:6aeb7a756187 16:3c88a81ff781
   129                         float newd = calculateDistance() ;
   129                         float newd = calculateDistance() ;
   130                         // check if the difference is too big and adjust accordingly
   130                         // check if the difference is too big and adjust accordingly
   131                         // the method also updates the m_ddistance
   131                         // the method also updates the m_ddistance
   132                         difference = adjustPinchMove(m_ddistance, newd) ;
   132                         difference = adjustPinchMove(m_ddistance, newd) ;
   133                         // Now we have a pinch gesture with size as details
   133                         // Now we have a pinch gesture with size as details
   134                         qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
   134                         qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie->timestamp());
   135                         pgest.setLogging(m_loggingenabled);
   135                         pgest.setLogging(m_loggingenabled);
   136                         pgest.setDetails(&difference) ;
   136                         pgest.setDetails(&difference) ;
   137                         pgest.setTarget(puie->target());
   137                         pgest.setTarget(puie->target());
   138                         // inform the listener
   138                         // inform the listener
   139                         m_listener->gestureEnter(pgest);
   139                         m_listener->gestureEnter(pgest);
   179                         m_pinchend = tp1;
   179                         m_pinchend = tp1;
   180                         calculateZoomingLine();
   180                         calculateZoomingLine();
   181                         m_ddistance = calculateDistance();
   181                         m_ddistance = calculateDistance();
   182                         state = ELockToThisGesture ;    // NOTE: once pinch is started, it will stay until release
   182                         state = ELockToThisGesture ;    // NOTE: once pinch is started, it will stay until release
   183                         // create the first pich gesture which does not yet resize anything
   183                         // create the first pich gesture which does not yet resize anything
   184                         qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
   184                         qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, tstamp);
   185                         pgest.setTarget(puie->target());
   185                         pgest.setTarget(puie->target());
   186                         pgest.setLogging(m_loggingenabled);
   186                         pgest.setLogging(m_loggingenabled);
   187                         pgest.setDetails(0) ;
   187                         pgest.setDetails(0) ;
   188                         // inform the listener
   188                         // inform the listener
   189                         m_listener->gestureEnter(pgest);
   189                         m_listener->gestureEnter(pgest);
   224         if (m_loggingenabled) {
   224         if (m_loggingenabled) {
   225             QPoint p1 = puie1->currentXY() ;
   225             QPoint p1 = puie1->currentXY() ;
   226             QPoint p2 = puie2->currentXY() ;
   226             QPoint p2 = puie2->currentXY() ;
   227             LOGARG("QStm_PinchGestureRecogniser: two streams: %s at [%d,%d], %s at [%d,%d]",
   227             LOGARG("QStm_PinchGestureRecogniser: two streams: %s at [%d,%d], %s at [%d,%d]",
   228                     qstmUiEventEngine::event_name(eventCode1), p1.x(), p1.y(),
   228                     qstmUiEventEngine::event_name(eventCode1), p1.x(), p1.y(),
   229                     qstmUiEventEngine::event_name(eventCode1), p2.x(), p2.y()
   229                     qstmUiEventEngine::event_name(eventCode2), p2.x(), p2.y()
   230                     ) ;
   230                     ) ;
   231 
   231 
   232         }
   232         }
   233 
   233 
   234 
   234 
   241                  eventCode2 == qstmUiEventEngine::EMove  || 
   241                  eventCode2 == qstmUiEventEngine::EMove  || 
   242                  eventCode2 == qstmUiEventEngine::EHold))   {
   242                  eventCode2 == qstmUiEventEngine::EHold))   {
   243             	
   243             	
   244                 // This is valid pinching start
   244                 // This is valid pinching start
   245                 m_pinching = true ;
   245                 m_pinching = true ;
       
   246                 m_isReleased[0] = false;
       
   247                 m_isReleased[1] = false;
   246                 // get the start and end position for the picnhing vector
   248                 // get the start and end position for the picnhing vector
   247                 m_pinchstart = puie1->currentXY() ;
   249                 m_pinchstart = puie1->currentXY() ;
   248                 m_pinchend = puie2->currentXY() ;
   250                 m_pinchend = puie2->currentXY() ;
   249                 calculateZoomingLine();
   251                 calculateZoomingLine();
   250                 m_ddistance = calculateDistance();
   252                 m_ddistance = calculateDistance();
   253                     LOGARG("QStm_PinchGestureRecogniser: pinch start: [%d,%d][%d,%d]",
   255                     LOGARG("QStm_PinchGestureRecogniser: pinch start: [%d,%d][%d,%d]",
   254                             m_pinchstart.x(), m_pinchstart.y(), m_pinchend.x(), m_pinchend.y()) ;
   256                             m_pinchstart.x(), m_pinchstart.y(), m_pinchend.x(), m_pinchend.y()) ;
   255 
   257 
   256                 }
   258                 }
   257                 // create the first pich gesture which does not yet resize anything
   259                 // create the first pich gesture which does not yet resize anything
   258                 qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
   260                 qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie2->timestamp());
   259                 pgest.setLogging(m_loggingenabled);
   261                 pgest.setLogging(m_loggingenabled);
   260                 pgest.setDetails(0) ;
   262                 pgest.setDetails(0) ;
   261                 pgest.setTarget(puie->target());
   263                 pgest.setTarget(puie1->target());
   262                 // inform the listener
   264                 // inform the listener
   263                 m_listener->gestureEnter(pgest);
   265                 m_listener->gestureEnter(pgest);
   264             }
   266             }
   265             else  {
   267             else  {
   266             	// Not a valid pinching start, do nothing (maybe it were easier to just check if one of the events is ERelease)
   268             	// Not a valid pinching start, do nothing (maybe it were easier to just check if one of the events is ERelease)
   267             }
   269             }
   268         }
   270         }
   269         else  {
   271         else  {
   270             // We have entered pinching state, lets move one of the points unless it is a release
   272 
   271             if (eventCode1 == qstmUiEventEngine::ERelease || eventCode2 == qstmUiEventEngine::ERelease) {
   273             // Keep track of the state of both fingers
       
   274             if (eventCode1 == qstmUiEventEngine::ERelease)
       
   275                 m_isReleased[0] = true;
       
   276             else if (eventCode1 == qstmUiEventEngine::ETouch)
       
   277                 m_isReleased[0] = false;
       
   278             if (eventCode2 == qstmUiEventEngine::ERelease)
       
   279                 m_isReleased[1] = true;
       
   280             else if (eventCode2 == qstmUiEventEngine::ETouch)
       
   281                 m_isReleased[1] = false;
       
   282 
       
   283             LOGARG("QStm_PinchGestureRecogniser: Checking for released[] %d %d", m_isReleased[0], m_isReleased[1]);
       
   284             // Only if both fingers are "released" are we done pinching
       
   285             if (m_isReleased[0] && m_isReleased[1]) {
       
   286                 release(pge);
   272                 m_pinching = false ;
   287                 m_pinching = false ;
   273             }
   288             }
   274             else  {
   289             else  {
   275                 state = ELockToThisGesture ;
   290                 state = ELockToThisGesture ;
   276 
   291 
   286                     LOGARG("QStm_PinchGestureRecogniser: pinch: [%d,%d][%d,%d], diff %d",
   301                     LOGARG("QStm_PinchGestureRecogniser: pinch: [%d,%d][%d,%d], diff %d",
   287                             m_pinchstart.x(), m_pinchstart.y(), m_pinchend.x(), m_pinchend.y(), difference) ;
   302                             m_pinchstart.x(), m_pinchstart.y(), m_pinchend.x(), m_pinchend.y(), difference) ;
   288 
   303 
   289                 }
   304                 }
   290 
   305 
   291                 qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
   306                 qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie2->timestamp());
   292                 pgest.setLogging(m_loggingenabled);
   307                 pgest.setLogging(m_loggingenabled);
   293                 pgest.setDetails(difference) ;
   308                 pgest.setDetails(&difference) ;
   294                 pgest.setTarget(puie->target());
   309                 pgest.setTarget(puie1->target());
   295                 // inform the listener
   310                 // inform the listener
   296                 m_listener->gestureEnter(pgest);
   311                 m_listener->gestureEnter(pgest);
   297             }
   312             }
   298         }
   313         }
   299 
   314 
       
   315     }
       
   316     else if (numOfActiveStreams == 1) {
       
   317         const qstmUiEventEngine::QStm_UiEventIf* puie1 = pge->getUiEvents(0);
       
   318         qstmUiEventEngine::QStm_UiEventCode eventCode1 = puie1->code() ;
       
   319         if (m_pinching && eventCode1 == qstmUiEventEngine::ERelease) {
       
   320             release(pge);
       
   321         }
   300     }
   322     }
   301 #endif
   323 #endif
   302 
   324 
   303     if (state == ENotMyGesture) {
   325     if (state == ENotMyGesture) {
   304         if (m_loggingenabled) {
   326         if (m_loggingenabled) {
   305             LOGARG("QStm_PinchGestureRecogniser: NotMyGesture %d %d %d ", m_pinching, m_holdseen, numOfActiveStreams) ;
   327             LOGARG("QStm_PinchGestureRecogniser: NotMyGesture %d %d %d ", m_pinching, m_holdseen, numOfActiveStreams) ;
   306         }
   328         }
   307         // if it was not our gesture, then the state can not be pinching...
   329         // if it was not our gesture, then the state can not be pinching...
   308         m_pinching = false ;
   330         m_pinching = false ;
       
   331         m_isReleased[0] = true;
       
   332         m_isReleased[1] = true;
   309     }
   333     }
   310     m_state = state;
   334     m_state = state;
   311     
   335     
   312     return state;
   336     return state;
   313 }
   337 }
   314 
   338 
   315 void QStm_PinchGestureRecogniser::release(QStm_GestureEngineIf* pge)
   339 void QStm_PinchGestureRecogniser::release(QStm_GestureEngineIf* pge)
   316 {
   340 {
       
   341     if (m_loggingenabled) {
       
   342             LOGARG("QStm_PinchGestureRecogniser: release. m_pinchstart[%d, %d], m_pinchend[%d, %d]",  
       
   343                 m_pinchstart.x(), m_pinchstart.y(), m_pinchend.x(), m_pinchend.y());
       
   344     }
   317     m_pinching = false ;
   345     m_pinching = false ;
   318     const qstmUiEventEngine::QStm_UiEventIf* puie = pge->getUiEvents(0);
   346     const qstmUiEventEngine::QStm_UiEventIf* puie = pge->getUiEvents(0);
   319     qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
   347     qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie->timestamp());
   320     pgest.setDetails(0) ;
   348     pgest.setDetails(0) ;
   321     pgest.setTarget(puie->target());
   349     pgest.setTarget(puie->target());
   322     m_listener->gestureExit(pgest) ;
   350     m_listener->gestureExit(pgest) ;
   323     m_state = ENotMyGesture;
   351     m_state = ENotMyGesture;
       
   352     
   324 }
   353 }
   325 
   354 
   326 
   355 
   327 /*!
   356 /*!
   328  * Now that we know the two points where the zooming started, we move those points only along
   357  * Now that we know the two points where the zooming started, we move those points only along
   383     if (changePercentage > 10.f) {
   412     if (changePercentage > 10.f) {
   384         // change more than 10%, make at most 10%
   413         // change more than 10%, make at most 10%
   385         float newdiff = previousDistance*0.1f ;
   414         float newdiff = previousDistance*0.1f ;
   386         if (previousDistance > newDistance) newdiff = -newdiff ;
   415         if (previousDistance > newDistance) newdiff = -newdiff ;
   387         if (m_loggingenabled) {
   416         if (m_loggingenabled) {
   388             LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was, now %f %f",
   417             LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was %f, now %f, changePercentage %f",
   389                 double(logdiff), double(newdiff), double(previousDistance), double(newDistance));
   418                 double(logdiff), double(newdiff), double(previousDistance), double(newDistance), double(changePercentage));
   390         }
   419         }
   391 
   420 
   392         previousDistance = previousDistance + newdiff ;
   421         previousDistance = previousDistance + newdiff ;
   393         diff = newdiff ;
   422         diff = newdiff ;
   394     }
   423     }
   395     else {
   424     else {
   396         if (m_loggingenabled) {
   425         if (m_loggingenabled) {
   397             LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was, now %f %f",
   426             LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was %f, now %f, changePercentage %f",
   398                 double(logdiff), double(diff), double(previousDistance), double(newDistance));
   427                 double(logdiff), double(diff), double(previousDistance), double(newDistance), double(changePercentage));
   399         }
   428         }
   400         previousDistance = newDistance ;  // accept the new value and update the new length
   429         previousDistance = newDistance ;  // accept the new value and update the new length
   401         diff = logdiff ;    // put the original back (this is why the logdiff can not be ABS(diff)!
   430         diff = logdiff ;    // put the original back (this is why the logdiff can not be ABS(diff)!
   402     }
   431     }
   403     return (int)diff ;
   432     return (int)diff ;