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 }