From d7b33b76a18b14e9f286e4d8326b00910b9ea02a Mon Sep 17 00:00:00 2001 From: Steffen Hartleib Date: Sun, 13 Sep 2020 18:53:32 +0000 Subject: 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'. --- src/kitemviews/private/ktwofingertap.cpp | 119 +++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/kitemviews/private/ktwofingertap.cpp (limited to 'src/kitemviews/private/ktwofingertap.cpp') 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 + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +// Self +#include "ktwofingertap.h" + +// Qt +#include +#include + +KTwoFingerTapRecognizer::KTwoFingerTapRecognizer() : + QGestureRecognizer(), + m_gestureTriggered(false) +{ +} + +KTwoFingerTapRecognizer::~KTwoFingerTapRecognizer() +{ +} + +QGesture* KTwoFingerTapRecognizer::create(QObject*) +{ + return static_cast(new KTwoFingerTap()); +} + +QGestureRecognizer::Result KTwoFingerTapRecognizer::recognize(QGesture* gesture, QObject* watched, QEvent* event) +{ + Q_UNUSED(watched) + + KTwoFingerTap* const kTwoFingerTap = static_cast(gesture); + const QTouchEvent* touchEvent = static_cast(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; +} -- cgit v1.3