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 }