diff options
| author | Steffen Hartleib <[email protected]> | 2020-09-13 18:53:32 +0000 |
|---|---|---|
| committer | Elvis Angelaccio <[email protected]> | 2020-09-13 18:53:32 +0000 |
| commit | d7b33b76a18b14e9f286e4d8326b00910b9ea02a (patch) | |
| tree | ade5042c74a0d172172a9327244858825076c333 /src/kitemviews/private | |
| parent | d899c2b401869d29558f62fba3479bf744b0577c (diff) | |
Improve Touch support
With this patch dolphin now supports the following touch gestures:
* Tap gesture to interact/open with directories, files and so on
* TapAndHold and release gesture for access to the context menu (main window, panel folder, places and information)
* TapAndHold and moving gesture for drag and drop action (main windows, panel folder and places)
* pinch gesture for zoom in main window
* kinetic scrolling (QScroller) for main window, panel folder, panel places, panel information, setting preview and service
* two fingers swipe gesture to left, right and up as shortcut to navigate back, forward and up
* two finger tap gesture to toggle item selection, similar to Ctrl and left mouse click
FEATURE: 385066
FIXED-IN: 20.11.80
You are currently rebasing branch 'touch' on '85241a924'.
Diffstat (limited to 'src/kitemviews/private')
| -rw-r--r-- | src/kitemviews/private/kitemlistrubberband.h | 1 | ||||
| -rw-r--r-- | src/kitemviews/private/ktwofingerswipe.cpp | 139 | ||||
| -rw-r--r-- | src/kitemviews/private/ktwofingerswipe.h | 54 | ||||
| -rw-r--r-- | src/kitemviews/private/ktwofingertap.cpp | 119 | ||||
| -rw-r--r-- | src/kitemviews/private/ktwofingertap.h | 48 |
5 files changed, 361 insertions, 0 deletions
diff --git a/src/kitemviews/private/kitemlistrubberband.h b/src/kitemviews/private/kitemlistrubberband.h index 2e57135a3..7886b1e84 100644 --- a/src/kitemviews/private/kitemlistrubberband.h +++ b/src/kitemviews/private/kitemlistrubberband.h @@ -18,6 +18,7 @@ class DOLPHIN_EXPORT KItemListRubberBand : public QObject { Q_OBJECT + Q_PROPERTY(QPointF endPosition MEMBER m_endPos READ endPosition WRITE setEndPosition) public: explicit KItemListRubberBand(QObject* parent = nullptr); diff --git a/src/kitemviews/private/ktwofingerswipe.cpp b/src/kitemviews/private/ktwofingerswipe.cpp new file mode 100644 index 000000000..6d0e18e65 --- /dev/null +++ b/src/kitemviews/private/ktwofingerswipe.cpp @@ -0,0 +1,139 @@ +/* + * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +// Self +#include "ktwofingerswipe.h" + +// Qt +#include <QTouchEvent> +#include <QLineF> + +KTwoFingerSwipeRecognizer::KTwoFingerSwipeRecognizer() : + QGestureRecognizer(), + m_touchBeginnTimestamp(0), + m_gestureAlreadyTriggered(false) +{ +} + +KTwoFingerSwipeRecognizer::~KTwoFingerSwipeRecognizer() +{ +} + +QGesture* KTwoFingerSwipeRecognizer::create(QObject*) +{ + return static_cast<QGesture*>(new KTwoFingerSwipe()); +} + +QGestureRecognizer::Result KTwoFingerSwipeRecognizer::recognize(QGesture* gesture, QObject* watched, QEvent* event) +{ + Q_UNUSED(watched) + + KTwoFingerSwipe* const kTwoFingerSwipe = static_cast<KTwoFingerSwipe*>(gesture); + const QTouchEvent* touchEvent = static_cast<const QTouchEvent*>(event); + + const int maxTimeFrameForSwipe = 90; + const int minDistanceForSwipe = 30; + + switch (event->type()) { + case QEvent::TouchBegin: { + m_touchBeginnTimestamp = touchEvent->timestamp(); + m_gestureAlreadyTriggered = false; + kTwoFingerSwipe->setHotSpot(touchEvent->touchPoints().first().startScreenPos()); + kTwoFingerSwipe->setPos(touchEvent->touchPoints().first().startPos()); + kTwoFingerSwipe->setScreenPos(touchEvent->touchPoints().first().startScreenPos()); + kTwoFingerSwipe->setScenePos(touchEvent->touchPoints().first().startScenePos()); + return MayBeGesture; + } + + case QEvent::TouchUpdate: { + const qint64 now = touchEvent->timestamp(); + const qint64 elapsedTime = now - m_touchBeginnTimestamp; + const QPointF distance = touchEvent->touchPoints().first().startPos() - touchEvent->touchPoints().first().pos(); + kTwoFingerSwipe->setHotSpot(touchEvent->touchPoints().first().startScreenPos()); + kTwoFingerSwipe->setPos(touchEvent->touchPoints().first().startPos()); + kTwoFingerSwipe->setScreenPos(touchEvent->touchPoints().first().startScreenPos()); + kTwoFingerSwipe->setScenePos(touchEvent->touchPoints().first().startScenePos()); + const QLineF ql = QLineF(touchEvent->touchPoints().first().startPos(), touchEvent->touchPoints().first().pos()); + kTwoFingerSwipe->setSwipeAngle(ql.angle()); + + if (touchEvent->touchPoints().size() > 2) { + return CancelGesture; + } + + if (touchEvent->touchPoints().size() == 2) { + if ((elapsedTime) > maxTimeFrameForSwipe) { + return CancelGesture; + } + + if (distance.manhattanLength() >= minDistanceForSwipe && + (elapsedTime) <= maxTimeFrameForSwipe && !m_gestureAlreadyTriggered) { + m_gestureAlreadyTriggered = true; + return FinishGesture; + } else if ((elapsedTime) <= maxTimeFrameForSwipe && !m_gestureAlreadyTriggered) { + return TriggerGesture; + } + } + break; + } + + default: + return Ignore; + } + return Ignore; +} + +KTwoFingerSwipe::KTwoFingerSwipe(QObject* parent) : + QGesture(parent), + m_pos(QPointF(-1, -1)), + m_screenPos(QPointF(-1, -1)), + m_scenePos(QPointF(-1, -1)), + m_swipeAngle(0.0) +{ +} + +KTwoFingerSwipe::~KTwoFingerSwipe() +{ +} + +QPointF KTwoFingerSwipe::pos() const +{ + return m_pos; +} + +void KTwoFingerSwipe::setPos(QPointF _pos) +{ + m_pos = _pos; +} + +QPointF KTwoFingerSwipe::screenPos() const +{ + return m_screenPos; +} + +void KTwoFingerSwipe::setScreenPos(QPointF _screenPos) +{ + m_screenPos = _screenPos; +} + +QPointF KTwoFingerSwipe::scenePos() const +{ + return m_scenePos; +} + +void KTwoFingerSwipe::setScenePos(QPointF _scenePos) +{ + m_scenePos = _scenePos; +} + +qreal KTwoFingerSwipe::swipeAngle() const +{ + return m_swipeAngle; +} + void KTwoFingerSwipe::setSwipeAngle(qreal _swipeAngle) +{ + m_swipeAngle = _swipeAngle; +} + diff --git a/src/kitemviews/private/ktwofingerswipe.h b/src/kitemviews/private/ktwofingerswipe.h new file mode 100644 index 000000000..27d9d75d9 --- /dev/null +++ b/src/kitemviews/private/ktwofingerswipe.h @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef KTWOFINGERSWIPE_H +#define KTWOFINGERSWIPE_H + +#include "dolphin_export.h" +// Qt +#include <QGesture> +#include <QGestureRecognizer> + +class DOLPHIN_EXPORT KTwoFingerSwipe : public QGesture +{ + Q_OBJECT + Q_PROPERTY(QPointF pos READ pos WRITE setPos) + Q_PROPERTY(QPointF screenPos READ screenPos WRITE setScreenPos) + Q_PROPERTY(QPointF scenePos READ scenePos WRITE setScenePos) + Q_PROPERTY(qreal swipeAngle READ swipeAngle WRITE setSwipeAngle) +public: + explicit KTwoFingerSwipe(QObject* parent = nullptr); + ~KTwoFingerSwipe(); + QPointF pos() const; + void setPos(QPointF pos); + QPointF screenPos() const; + void setScreenPos(QPointF screenPos); + QPointF scenePos() const; + void setScenePos(QPointF scenePos); + qreal swipeAngle() const; + void setSwipeAngle(qreal swipeAngle); +private: + QPointF m_pos; + QPointF m_screenPos; + QPointF m_scenePos; + qreal m_swipeAngle; +}; + +class DOLPHIN_EXPORT KTwoFingerSwipeRecognizer : public QGestureRecognizer +{ +public: + explicit KTwoFingerSwipeRecognizer(); + ~KTwoFingerSwipeRecognizer(); + QGesture* create(QObject*) override; + Result recognize(QGesture*, QObject*, QEvent*) override; +private: + Q_DISABLE_COPY( KTwoFingerSwipeRecognizer ) + qint64 m_touchBeginnTimestamp; + bool m_gestureAlreadyTriggered; +}; + +#endif /* KTWOFINGERSWIPE_H */ + diff --git a/src/kitemviews/private/ktwofingertap.cpp b/src/kitemviews/private/ktwofingertap.cpp new file mode 100644 index 000000000..9f4521d26 --- /dev/null +++ b/src/kitemviews/private/ktwofingertap.cpp @@ -0,0 +1,119 @@ +/* + * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +// Self +#include "ktwofingertap.h" + +// Qt +#include <QTouchEvent> +#include <QApplication> + +KTwoFingerTapRecognizer::KTwoFingerTapRecognizer() : + QGestureRecognizer(), + m_gestureTriggered(false) +{ +} + +KTwoFingerTapRecognizer::~KTwoFingerTapRecognizer() +{ +} + +QGesture* KTwoFingerTapRecognizer::create(QObject*) +{ + return static_cast<QGesture*>(new KTwoFingerTap()); +} + +QGestureRecognizer::Result KTwoFingerTapRecognizer::recognize(QGesture* gesture, QObject* watched, QEvent* event) +{ + Q_UNUSED(watched) + + KTwoFingerTap* const kTwoFingerTap = static_cast<KTwoFingerTap*>(gesture); + const QTouchEvent* touchEvent = static_cast<const QTouchEvent*>(event); + + switch (event->type()) { + case QEvent::TouchBegin: { + kTwoFingerTap->setHotSpot(touchEvent->touchPoints().first().startScreenPos()); + kTwoFingerTap->setPos(touchEvent->touchPoints().first().startPos()); + kTwoFingerTap->setScreenPos(touchEvent->touchPoints().first().startScreenPos()); + kTwoFingerTap->setScenePos(touchEvent->touchPoints().first().startScenePos()); + m_gestureTriggered = false; + return MayBeGesture; + } + + case QEvent::TouchUpdate: { + + if (touchEvent->touchPoints().size() > 2) { + m_gestureTriggered = false; + return CancelGesture; + } + + if (touchEvent->touchPoints().size() == 2) { + if ((touchEvent->touchPoints().first().startPos() - touchEvent->touchPoints().first().pos()).manhattanLength() >= QApplication::startDragDistance()) { + m_gestureTriggered = false; + return CancelGesture; + } + if ((touchEvent->touchPoints().at(1).startPos() - touchEvent->touchPoints().at(1).pos()).manhattanLength() >= QApplication::startDragDistance()) { + m_gestureTriggered = false; + return CancelGesture; + } + if (touchEvent->touchPointStates() & Qt::TouchPointPressed) { + m_gestureTriggered = true; + } + if (touchEvent->touchPointStates() & Qt::TouchPointReleased && m_gestureTriggered) { + m_gestureTriggered = false; + return FinishGesture; + } + } + break; + } + + default: + return Ignore; + } + return Ignore; +} + +KTwoFingerTap::KTwoFingerTap(QObject* parent) : + QGesture(parent), + m_pos(QPointF(-1, -1)), + m_screenPos(QPointF(-1, -1)), + m_scenePos(QPointF(-1, -1)) +{ +} + +KTwoFingerTap::~KTwoFingerTap() +{ +} + +QPointF KTwoFingerTap::pos() const +{ + return m_pos; +} + +void KTwoFingerTap::setPos(QPointF _pos) +{ + m_pos = _pos; +} + +QPointF KTwoFingerTap::screenPos() const +{ + return m_screenPos; +} + +void KTwoFingerTap::setScreenPos(QPointF _screenPos) +{ + m_screenPos = _screenPos; +} + +QPointF KTwoFingerTap::scenePos() const +{ + return m_scenePos; +} + +void KTwoFingerTap::setScenePos(QPointF _scenePos) +{ + m_scenePos = _scenePos; +} diff --git a/src/kitemviews/private/ktwofingertap.h b/src/kitemviews/private/ktwofingertap.h new file mode 100644 index 000000000..614df2424 --- /dev/null +++ b/src/kitemviews/private/ktwofingertap.h @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef KTWOFINGERTAP_H +#define KTWOFINGERTAP_H + +#include <dolphin_export.h> +// Qt +#include <QGesture> +#include <QGestureRecognizer> + +class DOLPHIN_EXPORT KTwoFingerTap : public QGesture +{ + Q_OBJECT + Q_PROPERTY(QPointF pos READ pos WRITE setPos) + Q_PROPERTY(QPointF screenPos READ screenPos WRITE setScreenPos) + Q_PROPERTY(QPointF scenePos READ scenePos WRITE setScenePos) +public: + explicit KTwoFingerTap(QObject* parent = nullptr); + ~KTwoFingerTap(); + QPointF pos() const; + void setPos(QPointF pos); + QPointF screenPos() const; + void setScreenPos(QPointF screenPos); + QPointF scenePos() const; + void setScenePos(QPointF scenePos); +private: + QPointF m_pos; + QPointF m_screenPos; + QPointF m_scenePos; +}; + +class DOLPHIN_EXPORT KTwoFingerTapRecognizer : public QGestureRecognizer +{ +public: + explicit KTwoFingerTapRecognizer(); + ~KTwoFingerTapRecognizer(); + QGesture* create(QObject*) override; + Result recognize(QGesture*, QObject*, QEvent*) override; +private: + Q_DISABLE_COPY(KTwoFingerTapRecognizer) + bool m_gestureTriggered; +}; + +#endif /* KTWOFINGERTAP_H */ |
