File indexing completed on 2024-05-19 15:09:23

0001 /*
0002     SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
0003     SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "fallbacktaphandler.h"
0009 
0010 #include <QGuiApplication>
0011 #include <QStyleHints>
0012 
0013 FallbackTapHandlerMouseEvent::FallbackTapHandlerMouseEvent(Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, qreal x, qreal y)
0014     : QObject(nullptr)
0015     , m_button(button)
0016     , m_buttons(buttons)
0017     , m_modifiers(modifiers)
0018     , m_x(x)
0019     , m_y(y)
0020 {
0021 }
0022 
0023 FallbackTapHandler::FallbackTapHandler(QQuickItem *parent)
0024     : QQuickItem(parent)
0025 {
0026     setFiltersChildMouseEvents(true);
0027     setAcceptedMouseButtons(Qt::LeftButton);
0028 }
0029 
0030 FallbackTapHandler::~FallbackTapHandler()
0031 {
0032 }
0033 
0034 void FallbackTapHandler::setAcceptedButtons(Qt::MouseButtons buttons)
0035 {
0036     setAcceptedMouseButtons(buttons);
0037     Q_EMIT acceptedButtonsChanged();
0038 }
0039 
0040 bool FallbackTapHandler::childMouseEventFilter(QQuickItem *item, QEvent *event)
0041 {
0042     if (event->type() == QEvent::MouseButtonPress && item->inherits("QQuickFlickable")) {
0043         QMouseEvent *me = static_cast<QMouseEvent *>(event);
0044         if (!(me->button() & acceptedMouseButtons()) && !(me->buttons() & acceptedMouseButtons())) {
0045             return QQuickItem::childMouseEventFilter(item, event);
0046         }
0047         m_mouseDownItem = item;
0048         m_mouseDownPos = me->windowPos();
0049 
0050         QPointF mappedPoint = mapFromItem(item, me->pos());
0051         FallbackTapHandlerMouseEvent eventProxy(me->button(), me->buttons(), me->modifiers(), mappedPoint.x(), mappedPoint.y());
0052         Q_EMIT pressed(&eventProxy);
0053 
0054     } else if (event->type() == QEvent::MouseButtonRelease && item->inherits("QQuickFlickable")) {
0055         QMouseEvent *me = static_cast<QMouseEvent *>(event);
0056 
0057         if ((!(me->button() & acceptedMouseButtons()) && !(me->buttons() & acceptedMouseButtons())) || m_mouseDownItem != item) {
0058             return QQuickItem::childMouseEventFilter(item, event);
0059         }
0060 
0061         QPointF mappedPoint = mapFromItem(item, me->pos());
0062         FallbackTapHandlerMouseEvent eventProxy(me->button(), me->buttons(), me->modifiers(), mappedPoint.x(), mappedPoint.y());
0063         Q_EMIT released(&eventProxy);
0064 
0065         if (QPointF(m_mouseDownPos - me->windowPos()).manhattanLength() < QGuiApplication::styleHints()->startDragDistance()) {
0066             Q_EMIT tapped(&eventProxy);
0067         }
0068 
0069         m_mouseDownItem.clear();
0070         m_mouseDownPos = QPointF();
0071     }
0072 
0073     return QQuickItem::childMouseEventFilter(item, event);
0074 }
0075 
0076 void FallbackTapHandler::mousePressEvent(QMouseEvent *event)
0077 {
0078     if (!(event->button() & acceptedMouseButtons()) && !(event->buttons() & acceptedMouseButtons())) {
0079         event->ignore();
0080         return;
0081     }
0082 
0083     event->accept();
0084     m_mouseDownItem = this;
0085     m_mouseDownPos = event->windowPos();
0086 
0087     FallbackTapHandlerMouseEvent eventProxy(event->button(), event->buttons(), event->modifiers(), event->x(), event->y());
0088     Q_EMIT pressed(&eventProxy);
0089 }
0090 
0091 void FallbackTapHandler::mouseReleaseEvent(QMouseEvent *event)
0092 {
0093     if (!(event->button() & acceptedMouseButtons()) && !(event->buttons() & acceptedMouseButtons())) {
0094         event->ignore();
0095         return;
0096     }
0097 
0098     FallbackTapHandlerMouseEvent eventProxy(event->button(), event->buttons(), event->modifiers(), event->x(), event->y());
0099 
0100     if (QPointF(m_mouseDownPos - event->windowPos()).manhattanLength() < QGuiApplication::styleHints()->startDragDistance()) {
0101         Q_EMIT tapped(&eventProxy);
0102     }
0103 
0104     m_mouseDownItem.clear();
0105     m_mouseDownPos = QPointF();
0106 
0107     Q_EMIT released(&eventProxy);
0108 }
0109 
0110 #include "moc_fallbacktaphandler.cpp"