qstmgesturelib/recognisers/qstmpinchgesturerecogniser.cpp
changeset 16 3c88a81ff781
parent 3 0954f5dd2cd0
--- a/qstmgesturelib/recognisers/qstmpinchgesturerecogniser.cpp	Thu Sep 23 15:32:11 2010 -0400
+++ b/qstmgesturelib/recognisers/qstmpinchgesturerecogniser.cpp	Fri Oct 15 17:30:59 2010 -0400
@@ -131,7 +131,7 @@
                         // the method also updates the m_ddistance
                         difference = adjustPinchMove(m_ddistance, newd) ;
                         // Now we have a pinch gesture with size as details
-                        qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
+                        qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie->timestamp());
                         pgest.setLogging(m_loggingenabled);
                         pgest.setDetails(&difference) ;
                         pgest.setTarget(puie->target());
@@ -181,7 +181,7 @@
                         m_ddistance = calculateDistance();
                         state = ELockToThisGesture ;    // NOTE: once pinch is started, it will stay until release
                         // create the first pich gesture which does not yet resize anything
-                        qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
+                        qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, tstamp);
                         pgest.setTarget(puie->target());
                         pgest.setLogging(m_loggingenabled);
                         pgest.setDetails(0) ;
@@ -226,7 +226,7 @@
             QPoint p2 = puie2->currentXY() ;
             LOGARG("QStm_PinchGestureRecogniser: two streams: %s at [%d,%d], %s at [%d,%d]",
                     qstmUiEventEngine::event_name(eventCode1), p1.x(), p1.y(),
-                    qstmUiEventEngine::event_name(eventCode1), p2.x(), p2.y()
+                    qstmUiEventEngine::event_name(eventCode2), p2.x(), p2.y()
                     ) ;
 
         }
@@ -243,6 +243,8 @@
             	
                 // This is valid pinching start
                 m_pinching = true ;
+                m_isReleased[0] = false;
+                m_isReleased[1] = false;
                 // get the start and end position for the picnhing vector
                 m_pinchstart = puie1->currentXY() ;
                 m_pinchend = puie2->currentXY() ;
@@ -255,10 +257,10 @@
 
                 }
                 // create the first pich gesture which does not yet resize anything
-                qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
+                qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie2->timestamp());
                 pgest.setLogging(m_loggingenabled);
                 pgest.setDetails(0) ;
-                pgest.setTarget(puie->target());
+                pgest.setTarget(puie1->target());
                 // inform the listener
                 m_listener->gestureEnter(pgest);
             }
@@ -267,8 +269,21 @@
             }
         }
         else  {
-            // We have entered pinching state, lets move one of the points unless it is a release
-            if (eventCode1 == qstmUiEventEngine::ERelease || eventCode2 == qstmUiEventEngine::ERelease) {
+
+            // Keep track of the state of both fingers
+            if (eventCode1 == qstmUiEventEngine::ERelease)
+                m_isReleased[0] = true;
+            else if (eventCode1 == qstmUiEventEngine::ETouch)
+                m_isReleased[0] = false;
+            if (eventCode2 == qstmUiEventEngine::ERelease)
+                m_isReleased[1] = true;
+            else if (eventCode2 == qstmUiEventEngine::ETouch)
+                m_isReleased[1] = false;
+
+            LOGARG("QStm_PinchGestureRecogniser: Checking for released[] %d %d", m_isReleased[0], m_isReleased[1]);
+            // Only if both fingers are "released" are we done pinching
+            if (m_isReleased[0] && m_isReleased[1]) {
+                release(pge);
                 m_pinching = false ;
             }
             else  {
@@ -288,16 +303,23 @@
 
                 }
 
-                qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
+                qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie2->timestamp());
                 pgest.setLogging(m_loggingenabled);
-                pgest.setDetails(difference) ;
-                pgest.setTarget(puie->target());
+                pgest.setDetails(&difference) ;
+                pgest.setTarget(puie1->target());
                 // inform the listener
                 m_listener->gestureEnter(pgest);
             }
         }
 
     }
+    else if (numOfActiveStreams == 1) {
+        const qstmUiEventEngine::QStm_UiEventIf* puie1 = pge->getUiEvents(0);
+        qstmUiEventEngine::QStm_UiEventCode eventCode1 = puie1->code() ;
+        if (m_pinching && eventCode1 == qstmUiEventEngine::ERelease) {
+            release(pge);
+        }
+    }
 #endif
 
     if (state == ENotMyGesture) {
@@ -306,6 +328,8 @@
         }
         // if it was not our gesture, then the state can not be pinching...
         m_pinching = false ;
+        m_isReleased[0] = true;
+        m_isReleased[1] = true;
     }
     m_state = state;
     
@@ -314,13 +338,18 @@
 
 void QStm_PinchGestureRecogniser::release(QStm_GestureEngineIf* pge)
 {
+    if (m_loggingenabled) {
+            LOGARG("QStm_PinchGestureRecogniser: release. m_pinchstart[%d, %d], m_pinchend[%d, %d]",  
+                m_pinchstart.x(), m_pinchstart.y(), m_pinchend.x(), m_pinchend.y());
+    }
     m_pinching = false ;
     const qstmUiEventEngine::QStm_UiEventIf* puie = pge->getUiEvents(0);
-    qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend);
+    qstmGesture::QStm_TwoPointGesture pgest(KUid, m_pinchstart, m_pinchend, puie->timestamp());
     pgest.setDetails(0) ;
     pgest.setTarget(puie->target());
     m_listener->gestureExit(pgest) ;
     m_state = ENotMyGesture;
+    
 }
 
 
@@ -385,8 +414,8 @@
         float newdiff = previousDistance*0.1f ;
         if (previousDistance > newDistance) newdiff = -newdiff ;
         if (m_loggingenabled) {
-            LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was, now %f %f",
-                double(logdiff), double(newdiff), double(previousDistance), double(newDistance));
+            LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was %f, now %f, changePercentage %f",
+                double(logdiff), double(newdiff), double(previousDistance), double(newDistance), double(changePercentage));
         }
 
         previousDistance = previousDistance + newdiff ;
@@ -394,8 +423,8 @@
     }
     else {
         if (m_loggingenabled) {
-            LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was, now %f %f",
-                double(logdiff), double(diff), double(previousDistance), double(newDistance));
+            LOGARG("QStm_PinchGestureRecogniser: adjustPinchMove from %f to %f : was %f, now %f, changePercentage %f",
+                double(logdiff), double(diff), double(previousDistance), double(newDistance), double(changePercentage));
         }
         previousDistance = newDistance ;  // accept the new value and update the new length
         diff = logdiff ;    // put the original back (this is why the logdiff can not be ABS(diff)!