File indexing completed on 2024-05-19 04:29:16

0001 /*
0002  *  SPDX-FileCopyrightText: 2019 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisMouseClickEater.h"
0008 
0009 #include <QMouseEvent>
0010 #include "kis_debug.h"
0011 
0012 KisMouseClickEater::KisMouseClickEater(Qt::MouseButtons buttons,
0013                                        int clicksToEat,
0014                                        QObject *parent)
0015     : QObject(parent),
0016       m_buttons(buttons),
0017       m_clicksToEat(clicksToEat)
0018 {
0019     reset();
0020 }
0021 
0022 KisMouseClickEater::~KisMouseClickEater()
0023 {
0024 }
0025 
0026 void KisMouseClickEater::reset()
0027 {
0028     m_clicksHappened = 0;
0029     m_timeSinceReset.start();
0030 }
0031 
0032 bool KisMouseClickEater::eventFilter(QObject *watched, QEvent *event)
0033 {
0034 #ifdef Q_OS_WIN
0035     const int tabletMouseEventsFlowDelay = 500;
0036 #else
0037     const int tabletMouseEventsFlowDelay = 256;
0038 #endif
0039 
0040     bool blockTimedRelease = false;
0041 
0042     if (event->type() == QEvent::TabletMove) {
0043         blockTimedRelease = true;
0044     }
0045 
0046     if (!blockTimedRelease &&
0047         m_timeSinceReset.elapsed() > tabletMouseEventsFlowDelay) {
0048         return QObject::eventFilter(watched, event);
0049     }
0050 
0051     if (event->type() == QEvent::MouseButtonPress ||
0052         event->type() == QEvent::MouseButtonRelease) {
0053 
0054         QMouseEvent *mevent = static_cast<QMouseEvent*>(event);
0055         if (mevent->button() & m_buttons) {
0056             if (m_clicksHappened >= m_clicksToEat) {
0057                 return false;
0058             }
0059 
0060             if (event->type() == QEvent::MouseButtonRelease) {
0061                 m_clicksHappened++;
0062             }
0063 
0064             return true;
0065         }
0066     }
0067 
0068     if (event->type() == QEvent::MouseMove) {
0069         QMouseEvent *mevent = static_cast<QMouseEvent*>(event);
0070         if (mevent->buttons() & m_buttons) {
0071             return m_clicksHappened < m_clicksToEat;
0072         }
0073     }
0074 
0075     return QObject::eventFilter(watched, event);
0076 }