return false;
}
+bool QQuickCanvasPrivate::dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event)
+{
+ QStyleHints *styleHints = qApp->styleHints();
+ QQuickMouseEventEx *extended = QQuickMouseEventEx::extended(event);
+ bool dragVelocityLimitAvailable = extended
+ && extended->capabilities().testFlag(QTouchDevice::Velocity)
+ && styleHints->startDragVelocity();
+ bool overThreshold = qAbs(d) > styleHints->startDragDistance();
+ if (dragVelocityLimitAvailable) {
+ qreal velocity = axis == Qt::XAxis ? extended->velocity().x()
+ : extended->velocity().y();
+ overThreshold |= qAbs(velocity) > styleHints->startDragVelocity();
+ }
+ return overThreshold;
+}
+
/*!
Propagates an event to a QQuickItem on the canvas
*/
mutable QQuickCanvasIncubationController *incubationController;
+ static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event);
+
private:
static void cleanupNodesOnShutdown(QQuickItem *);
};
bool stealX = stealMouse;
qint64 elapsedSincePress = computeCurrentTime(event) - lastPressTime;
-
if (q->yflick()) {
qreal dy = event->localPos().y() - pressPos.y();
- if (qAbs(dy) > qApp->styleHints()->startDragDistance() || elapsedSincePress > 200) {
+ bool overThreshold = QQuickCanvasPrivate::dragOverThreshold(dy, Qt::YAxis, event);
+ if (overThreshold || elapsedSincePress > 200) {
if (!vMoved)
vData.dragStartOffset = dy;
qreal newY = dy + vData.pressPos - vData.dragStartOffset;
vData.move.setValue(newY);
vMoved = true;
}
- if (qAbs(dy) > qApp->styleHints()->startDragDistance())
+ if (overThreshold)
stealY = true;
}
}
if (q->xflick()) {
qreal dx = event->localPos().x() - pressPos.x();
- if (qAbs(dx) > qApp->styleHints()->startDragDistance() || elapsedSincePress > 200) {
+ bool overThreshold = QQuickCanvasPrivate::dragOverThreshold(dx, Qt::XAxis, event);
+ if (overThreshold || elapsedSincePress > 200) {
if (!hMoved)
hData.dragStartOffset = dx;
qreal newX = dx + hData.pressPos - hData.dragStartOffset;
hMoved = true;
}
- if (qAbs(dx) > qApp->styleHints()->startDragDistance())
+ if (overThreshold)
stealX = true;
}
}
curLocalPos = event->windowPos();
}
- const int dragThreshold = qApp->styleHints()->startDragDistance();
qreal dx = qAbs(curLocalPos.x() - startLocalPos.x());
qreal dy = qAbs(curLocalPos.y() - startLocalPos.y());
d->drag->target()->setPos(dragPos);
if (!keepMouseGrab()) {
- if ((!d->dragY && dy < dragThreshold && d->dragX && dx > dragThreshold)
- || (!d->dragX && dx < dragThreshold && d->dragY && dy > dragThreshold)
- || (d->dragX && d->dragY && (dx > dragThreshold || dy > dragThreshold))) {
+ bool xDragged = QQuickCanvasPrivate::dragOverThreshold(dx, Qt::XAxis, event);
+ bool yDragged = QQuickCanvasPrivate::dragOverThreshold(dy, Qt::YAxis, event);
+ if ((!d->dragY && !yDragged && d->dragX && xDragged)
+ || (!d->dragX && !xDragged && d->dragY && yDragged)
+ || (d->dragX && d->dragY && (xDragged || yDragged))) {
setKeepMouseGrab(true);
d->stealMouse = true;
}