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 ; |