From 7368e6bfedbbebbd642cee2be86c0b1c115d9efd Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 10 Apr 2017 07:40:04 +0200 Subject: QQuickScrollBar: handle touch events Change-Id: I0521eb36ee01abc72edc869d92910e823f00a2f2 Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickscrollbar.cpp | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src/quicktemplates2/qquickscrollbar.cpp') diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index cb5c0001..844bba3a 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -165,6 +165,7 @@ QQuickScrollBarPrivate::QQuickScrollBarPrivate() moving(false), interactive(true), explicitInteractive(false), + touchId(-1), orientation(Qt::Vertical), snapMode(QQuickScrollBar::NoSnap), policy(QQuickScrollBar::AsNeeded) @@ -268,6 +269,7 @@ void QQuickScrollBarPrivate::handleRelease(const QPointF &point) pos = snapPosition(pos); q->setPosition(pos); offset = 0.0; + touchId = -1; q->setPressed(false); } @@ -275,6 +277,7 @@ void QQuickScrollBarPrivate::handleUngrab() { Q_Q(QQuickScrollBar); offset = 0.0; + touchId = -1; q->setPressed(false); } @@ -616,6 +619,55 @@ void QQuickScrollBar::mouseUngrabEvent() d->handleUngrab(); } +void QQuickScrollBar::touchEvent(QTouchEvent *event) +{ + Q_D(QQuickScrollBar); + switch (event->type()) { + case QEvent::TouchBegin: + if (d->touchId == -1) { + const QTouchEvent::TouchPoint point = event->touchPoints().first(); + d->touchId = point.id(); + d->handlePress(point.pos()); + } else { + event->ignore(); + } + break; + + case QEvent::TouchUpdate: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (point.id() != d->touchId) + continue; + + d->handleMove(point.pos()); + } + break; + + case QEvent::TouchEnd: + for (const QTouchEvent::TouchPoint &point : event->touchPoints()) { + if (point.id() != d->touchId) + continue; + + d->handleRelease(point.pos()); + } + break; + + case QEvent::TouchCancel: + d->handleUngrab(); + break; + + default: + QQuickControl::touchEvent(event); + break; + } +} + +void QQuickScrollBar::touchUngrabEvent() +{ + Q_D(QQuickScrollBar); + QQuickControl::touchUngrabEvent(); + d->handleUngrab(); +} + #if QT_CONFIG(quicktemplates2_hover) void QQuickScrollBar::hoverChange() { -- cgit v1.2.3 From f0eed56490080a6769645f184bb6f13dfe7d23e3 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 10 Apr 2017 07:31:55 +0200 Subject: ScrollBar: react immediately when using a mouse The initial drag threshold is a necessary evil on touch to avoid conflicting with flickables, but leads to bad experience (QTBUG-47081) when using a mouse. Now that we have separate mouse and touch handling, we can apply immediate moves when using a mouse, but keep the old behavior on touch. [ChangeLog][Important Behavior Changes] ScrollBar now reacts immediately when using a mouse. Task-number: QTBUG-58667 Change-Id: I51759fc01dc8b8536834a8a3cca635ff512f7dc9 Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickscrollbar.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/quicktemplates2/qquickscrollbar.cpp') diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index 844bba3a..b0d55dfb 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -596,6 +596,7 @@ void QQuickScrollBar::mousePressEvent(QMouseEvent *event) Q_D(QQuickScrollBar); QQuickControl::mousePressEvent(event); d->handlePress(event->localPos()); + d->handleMove(event->localPos()); } void QQuickScrollBar::mouseMoveEvent(QMouseEvent *event) -- cgit v1.2.3