503 QTapAndHoldGesturePrivate *d = q->d_func(); |
508 QTapAndHoldGesturePrivate *d = q->d_func(); |
504 |
509 |
505 if (object == state && event->type() == QEvent::Timer) { |
510 if (object == state && event->type() == QEvent::Timer) { |
506 q->killTimer(d->timerId); |
511 q->killTimer(d->timerId); |
507 d->timerId = 0; |
512 d->timerId = 0; |
508 return QGestureRecognizer::Ignore | QGestureRecognizer::ConsumeEventHint; |
513 return QGestureRecognizer::FinishGesture | QGestureRecognizer::ConsumeEventHint; |
509 } |
514 } |
510 |
515 |
511 const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); |
516 const QTouchEvent *ev = static_cast<const QTouchEvent *>(event); |
512 |
517 const QMouseEvent *me = static_cast<const QMouseEvent *>(event); |
513 QGestureRecognizer::Result result = QGestureRecognizer::CancelGesture; |
518 #ifndef QT_NO_GRAPHICSVIEW |
514 |
519 const QGraphicsSceneMouseEvent *gsme = static_cast<const QGraphicsSceneMouseEvent *>(event); |
515 enum { TimerInterval = 2000 }; |
520 #endif |
|
521 |
516 enum { TapRadius = 40 }; |
522 enum { TapRadius = 40 }; |
517 |
523 |
518 switch (event->type()) { |
524 switch (event->type()) { |
519 case QEvent::TouchBegin: |
525 #ifndef QT_NO_GRAPHICSVIEW |
520 d->position = ev->touchPoints().at(0).pos(); |
526 case QEvent::GraphicsSceneMousePress: |
|
527 d->position = gsme->screenPos(); |
|
528 q->setHotSpot(d->position); |
521 if (d->timerId) |
529 if (d->timerId) |
522 q->killTimer(d->timerId); |
530 q->killTimer(d->timerId); |
523 d->timerId = q->startTimer(TimerInterval); |
531 d->timerId = q->startTimer(QTapAndHoldGesturePrivate::Timeout); |
524 result = QGestureRecognizer::TriggerGesture; |
532 return QGestureRecognizer::MayBeGesture; // we don't show a sign of life until the timeout |
525 break; |
533 #endif |
|
534 case QEvent::MouseButtonPress: |
|
535 d->position = me->globalPos(); |
|
536 q->setHotSpot(d->position); |
|
537 if (d->timerId) |
|
538 q->killTimer(d->timerId); |
|
539 d->timerId = q->startTimer(QTapAndHoldGesturePrivate::Timeout); |
|
540 return QGestureRecognizer::MayBeGesture; // we don't show a sign of life until the timeout |
|
541 case QEvent::TouchBegin: |
|
542 d->position = ev->touchPoints().at(0).startScreenPos(); |
|
543 q->setHotSpot(d->position); |
|
544 if (d->timerId) |
|
545 q->killTimer(d->timerId); |
|
546 d->timerId = q->startTimer(QTapAndHoldGesturePrivate::Timeout); |
|
547 return QGestureRecognizer::MayBeGesture; // we don't show a sign of life until the timeout |
|
548 #ifndef QT_NO_GRAPHICSVIEW |
|
549 case QEvent::GraphicsSceneMouseRelease: |
|
550 #endif |
|
551 case QEvent::MouseButtonRelease: |
526 case QEvent::TouchEnd: |
552 case QEvent::TouchEnd: |
527 if (d->timerId) |
553 return QGestureRecognizer::CancelGesture; // get out of the MayBeGesture state |
528 result = QGestureRecognizer::CancelGesture; |
|
529 else |
|
530 result = QGestureRecognizer::FinishGesture; |
|
531 break; |
|
532 case QEvent::TouchUpdate: |
554 case QEvent::TouchUpdate: |
533 if (q->state() != Qt::NoGesture && ev->touchPoints().size() == 1) { |
555 if (d->timerId && ev->touchPoints().size() == 1) { |
534 QTouchEvent::TouchPoint p = ev->touchPoints().at(0); |
556 QTouchEvent::TouchPoint p = ev->touchPoints().at(0); |
535 QPoint delta = p.pos().toPoint() - p.startPos().toPoint(); |
557 QPoint delta = p.pos().toPoint() - p.startPos().toPoint(); |
536 if (delta.manhattanLength() <= TapRadius) |
558 if (delta.manhattanLength() <= TapRadius) |
537 result = QGestureRecognizer::TriggerGesture; |
559 return QGestureRecognizer::MayBeGesture; |
538 } |
560 } |
539 break; |
561 return QGestureRecognizer::CancelGesture; |
540 case QEvent::MouseButtonPress: |
562 case QEvent::MouseMove: { |
541 case QEvent::MouseMove: |
563 QPoint delta = me->globalPos() - d->position.toPoint(); |
542 case QEvent::MouseButtonRelease: |
564 if (d->timerId && delta.manhattanLength() <= TapRadius) |
543 result = QGestureRecognizer::Ignore; |
565 return QGestureRecognizer::MayBeGesture; |
544 break; |
566 return QGestureRecognizer::CancelGesture; |
|
567 } |
|
568 #ifndef QT_NO_GRAPHICSVIEW |
|
569 case QEvent::GraphicsSceneMouseMove: { |
|
570 QPoint delta = gsme->screenPos() - d->position.toPoint(); |
|
571 if (d->timerId && delta.manhattanLength() <= TapRadius) |
|
572 return QGestureRecognizer::MayBeGesture; |
|
573 return QGestureRecognizer::CancelGesture; |
|
574 } |
|
575 #endif |
545 default: |
576 default: |
546 result = QGestureRecognizer::Ignore; |
577 return QGestureRecognizer::Ignore; |
547 break; |
578 } |
548 } |
|
549 return result; |
|
550 } |
579 } |
551 |
580 |
552 void QTapAndHoldGestureRecognizer::reset(QGesture *state) |
581 void QTapAndHoldGestureRecognizer::reset(QGesture *state) |
553 { |
582 { |
554 QTapAndHoldGesture *q = static_cast<QTapAndHoldGesture *>(state); |
583 QTapAndHoldGesture *q = static_cast<QTapAndHoldGesture *>(state); |