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"