File indexing completed on 2024-05-26 04:30:51
0001 /* 0002 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kis_scratch_pad_event_filter.h" 0008 #include "kis_scratch_pad.h" 0009 #include <QWidget> 0010 #include <QDebug> 0011 0012 0013 KisScratchPadEventFilter::KisScratchPadEventFilter(QWidget *parent) 0014 : QObject(parent), 0015 m_tabletPressed(false), 0016 m_pressedButton(Qt::NoButton) 0017 { 0018 parent->installEventFilter(this); 0019 m_scratchPad = qobject_cast<KisScratchPad *>(parent); 0020 } 0021 0022 void KisScratchPadEventFilter::setWidgetToDocumentTransform(const QTransform &transform) 0023 { 0024 m_widgetToDocument = transform; 0025 } 0026 0027 QWidget* KisScratchPadEventFilter::parentWidget() 0028 { 0029 return static_cast<QWidget*>(parent()); 0030 } 0031 0032 KoPointerEvent* KisScratchPadEventFilter::createMouseEvent(QEvent *event) 0033 { 0034 QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); 0035 return new KoPointerEvent(mouseEvent, m_widgetToDocument.map(mouseEvent->pos())); 0036 } 0037 0038 KoPointerEvent* KisScratchPadEventFilter::createTabletEvent(QEvent *event) 0039 { 0040 QTabletEvent *tabletEvent = static_cast<QTabletEvent*>(event); 0041 const QPointF pos = tabletEvent->posF(); 0042 return new KoPointerEvent(tabletEvent, m_widgetToDocument.map(pos)); 0043 } 0044 0045 bool KisScratchPadEventFilter::eventFilter(QObject *obj, QEvent *event) 0046 { 0047 Q_UNUSED(obj); 0048 bool result = false; 0049 0050 QScopedPointer<KoPointerEvent> ev; 0051 0052 0053 switch(event->type()) { 0054 case QEvent::MouseButtonPress: 0055 if (m_pressedButton != Qt::NoButton) break; 0056 0057 ev.reset(createMouseEvent(event)); 0058 m_pressedButton = ev->button(); 0059 m_scratchPad->pointerPress(ev.data()); 0060 result = true; 0061 break; 0062 case QEvent::MouseButtonRelease: 0063 ev.reset(createMouseEvent(event)); 0064 if (ev->button() != m_pressedButton) break; 0065 0066 m_pressedButton = Qt::NoButton; 0067 m_scratchPad->pointerRelease(ev.data()); 0068 result = true; 0069 break; 0070 case QEvent::MouseMove: 0071 if(m_tabletPressed) break; 0072 ev.reset(createMouseEvent(event)); 0073 m_scratchPad->pointerMove(ev.data()); 0074 result = true; 0075 break; 0076 case QEvent::TabletPress: 0077 if (m_pressedButton != Qt::NoButton) break; 0078 0079 m_tabletPressed = true; 0080 ev.reset(createTabletEvent(event)); 0081 m_pressedButton = ev->button(); 0082 m_scratchPad->pointerPress(ev.data()); 0083 result = true; 0084 break; 0085 case QEvent::TabletRelease: 0086 ev.reset(createTabletEvent(event)); 0087 if (ev->button() != m_pressedButton) break; 0088 0089 m_pressedButton = Qt::NoButton; 0090 m_scratchPad->pointerRelease(ev.data()); 0091 m_tabletPressed = false; 0092 result = true; 0093 break; 0094 case QEvent::TabletMove: 0095 ev.reset(createTabletEvent(event)); 0096 m_scratchPad->pointerMove(ev.data()); 0097 result = true; 0098 break; 0099 case QEvent::FocusIn: 0100 case QEvent::FocusOut: 0101 case QEvent::Show: 0102 case QEvent::Hide: 0103 m_scratchPad->resetState(); 0104 m_tabletPressed = false; 0105 m_pressedButton = Qt::NoButton; 0106 break; 0107 default: 0108 result = false; 0109 } 0110 0111 if (ev) { 0112 result = ev->isAccepted(); 0113 event->setAccepted(result); 0114 } 0115 0116 return result; 0117 }