diff --git a/libs/flake/KoPointerEvent.cpp b/libs/flake/KoPointerEvent.cpp index 149ac65b73..f59cefc543 100644 --- a/libs/flake/KoPointerEvent.cpp +++ b/libs/flake/KoPointerEvent.cpp @@ -1,298 +1,256 @@ /* This file is part of the KDE project Copyright (C) 2006 Thorsten Zachmann Copyright (C) 2006 C. Boemann Rasmussen Copyright (C) 2006-2007 Thomas Zander This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "KoPointerEvent.h" #include "KoInputDeviceHandlerEvent.h" #include #include #include -#include #include class Q_DECL_HIDDEN KoPointerEvent::Private { public: Private() - : tabletEvent(0), mouseEvent(0), wheelEvent(0), touchEvent(0) - , deviceEvent(0), tabletButton(Qt::NoButton) - , globalPos(0, 0), pos(0, 0), posZ(0), rotationX(0), rotationY(0) - , rotationZ(0) {} + : tabletEvent(0) + , mouseEvent(0) + , deviceEvent(0) + , tabletButton(Qt::NoButton) + , globalPos(0, 0) + , pos(0, 0) + , posZ(0) + , rotationX(0) + , rotationY(0) + , rotationZ(0) + {} + QTabletEvent *tabletEvent; QMouseEvent *mouseEvent; - QWheelEvent *wheelEvent; - QTouchEvent *touchEvent; KoInputDeviceHandlerEvent *deviceEvent; Qt::MouseButton tabletButton; QPoint globalPos, pos; int posZ; int rotationX, rotationY, rotationZ; }; KoPointerEvent::KoPointerEvent(QMouseEvent *ev, const QPointF &pnt) : point(pnt), m_event(ev), d(new Private()) { Q_ASSERT(m_event); d->mouseEvent = ev; } KoPointerEvent::KoPointerEvent(QTabletEvent *ev, const QPointF &pnt) : point(pnt), m_event(ev), d(new Private()) { Q_ASSERT(m_event); d->tabletEvent = ev; } -KoPointerEvent::KoPointerEvent(QTouchEvent *ev, const QPointF &pnt, QList _touchPoints) - : point (pnt) - , touchPoints(_touchPoints) - , m_event(ev) - , d(new Private()) -{ - Q_ASSERT(m_event); - d->touchEvent = ev; -} - -KoPointerEvent::KoPointerEvent(QWheelEvent *ev, const QPointF &pnt) - : point(pnt), - m_event(ev), - d(new Private()) -{ - Q_ASSERT(m_event); - d->wheelEvent = ev; -} - KoPointerEvent::KoPointerEvent(KoInputDeviceHandlerEvent * ev, int x, int y, int z, int rx, int ry, int rz) : m_event(ev) , d(new Private()) { Q_ASSERT(m_event); d->deviceEvent = ev; d->pos = QPoint(x, y); d->posZ = z; d->rotationX = rx; d->rotationY = ry; d->rotationZ = rz; } KoPointerEvent::KoPointerEvent(KoPointerEvent *event, const QPointF &point) : point(point) , touchPoints(event->touchPoints) , m_event(event->m_event) , d(new Private(*(event->d))) { Q_ASSERT(m_event); } KoPointerEvent::KoPointerEvent(const KoPointerEvent &rhs) : point(rhs.point) , touchPoints(rhs.touchPoints) , m_event(rhs.m_event) , d(new Private(*rhs.d)) { } KoPointerEvent::~KoPointerEvent() { delete d; } Qt::MouseButton KoPointerEvent::button() const { if (d->mouseEvent) return d->mouseEvent->button(); - else if (d->tabletEvent || d->touchEvent) + else if (d->tabletEvent) return d->tabletButton; else if (d->deviceEvent) return d->deviceEvent->button(); else return Qt::NoButton; } Qt::MouseButtons KoPointerEvent::buttons() const { if (d->mouseEvent) return d->mouseEvent->buttons(); - else if (d->wheelEvent) - return d->wheelEvent->buttons(); - else if (d->tabletEvent || d->touchEvent) + else if (d->tabletEvent) return d->tabletButton; else if (d->deviceEvent) return d->deviceEvent->buttons(); return Qt::NoButton; } QPoint KoPointerEvent::globalPos() const { if (d->mouseEvent) return d->mouseEvent->globalPos(); - else if (d->wheelEvent) - return d->wheelEvent->globalPos(); else if (d->tabletEvent) return d->tabletEvent->globalPos(); else return d->globalPos; } QPoint KoPointerEvent::pos() const { if (d->mouseEvent) return d->mouseEvent->pos(); - else if (d->wheelEvent) - return d->wheelEvent->pos(); else if (d->tabletEvent) return d->tabletEvent->pos(); else return d->pos; } qreal KoPointerEvent::pressure() const { if (d->tabletEvent) return d->tabletEvent->pressure(); else return 1.0; } qreal KoPointerEvent::rotation() const { if (d->tabletEvent) return d->tabletEvent->rotation(); else return 0.0; } qreal KoPointerEvent::tangentialPressure() const { if (d->tabletEvent) return std::fmod((d->tabletEvent->tangentialPressure() - (-1.0)) / (1.0 - (-1.0)), 2.0); else return 0.0; } int KoPointerEvent::x() const { if (d->tabletEvent) return d->tabletEvent->x(); - if (d->wheelEvent) - return d->wheelEvent->x(); else if (d->mouseEvent) return d->mouseEvent->x(); else return pos().x(); } int KoPointerEvent::xTilt() const { if (d->tabletEvent) return d->tabletEvent->xTilt(); else return 0; } int KoPointerEvent::y() const { if (d->tabletEvent) return d->tabletEvent->y(); - if (d->wheelEvent) - return d->wheelEvent->y(); else if (d->mouseEvent) return d->mouseEvent->y(); else return pos().y(); } int KoPointerEvent::yTilt() const { if (d->tabletEvent) return d->tabletEvent->yTilt(); else return 0; } int KoPointerEvent::z() const { if (d->tabletEvent) return d->tabletEvent->z(); else if (d->deviceEvent) return d->posZ; else return 0; } -int KoPointerEvent::delta() const -{ - if (d->wheelEvent) - return d->wheelEvent->delta(); - else - return 0; -} - int KoPointerEvent::rotationX() const { return d->rotationX; } int KoPointerEvent::rotationY() const { return d->rotationY; } int KoPointerEvent::rotationZ() const { return d->rotationZ; } -Qt::Orientation KoPointerEvent::orientation() const -{ - if (d->wheelEvent) - return d->wheelEvent->orientation(); - else - return Qt::Horizontal; -} - bool KoPointerEvent::isTabletEvent() { return dynamic_cast(m_event) != 0; } void KoPointerEvent::setTabletButton(Qt::MouseButton button) { d->tabletButton = button; } Qt::KeyboardModifiers KoPointerEvent::modifiers() const { if (d->tabletEvent) return d->tabletEvent->modifiers(); else if (d->mouseEvent) return d->mouseEvent->modifiers(); - else if (d->wheelEvent) - return d->wheelEvent->modifiers(); else if (d->deviceEvent) return d->deviceEvent->modifiers(); else return Qt::NoModifier; } diff --git a/libs/flake/KoPointerEvent.h b/libs/flake/KoPointerEvent.h index 5cdf9faec9..62dcfe1fa7 100644 --- a/libs/flake/KoPointerEvent.h +++ b/libs/flake/KoPointerEvent.h @@ -1,253 +1,223 @@ /* This file is part of the KDE project Copyright (C) 2006 Thorsten Zachmann Copyright (C) 2006 C. Boemann Rasmussen Copyright (C) 2006-2007 Thomas Zander Copyright (C) 2012 Boudewijn Rempt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef KOPOINTEREVENT_H #define KOPOINTEREVENT_H #include class QTabletEvent; class QMouseEvent; class QWheelEvent; class KoInputDeviceHandlerEvent; #include "kritaflake_export.h" struct KoTouchPoint { QTouchEvent::TouchPoint touchPoint; // the point in document coordinates QPointF lastPoint; QPointF point; }; /** * KoPointerEvent is a synthetic event that can be built from a mouse, * touch or tablet event. In addition to always providing tools with tablet * pressure characteristics, KoPointerEvent has both the original * (canvas based) position as well as the normalized position, that is, * the position of the event _in_ the document coordinates. */ class KRITAFLAKE_EXPORT KoPointerEvent { public: /** * Constructor. * * @param event the mouse event that is the base of this event. * @param point the zoomed point in the normal coordinate system. */ KoPointerEvent(QMouseEvent *event, const QPointF &point); /** * Constructor. * * @param event the tablet event that is the base of this event. * @param point the zoomed point in the normal coordinate system. */ KoPointerEvent(QTabletEvent *event, const QPointF &point); - /** - * Constructor. - * - * @param event the touch event that is the base of this event. - * @param point the zoomed point of the primary touch event in the normal coordinate system. - * @param touchpoints the zoomed points of the touch event in the normal coordinate system. - */ - KoPointerEvent(QTouchEvent *event, const QPointF &point, QList _touchPoints); - - /** - * Constructor. - * - * @param event the tablet event that is the base of this event. - * @param point the zoomed point in the normal coordinate system. - */ - KoPointerEvent(QWheelEvent *event, const QPointF &point); - KoPointerEvent(KoInputDeviceHandlerEvent *event, int x, int y, int z = 0, int rx = 0, int ry = 0, int rz = 0); KoPointerEvent(KoPointerEvent *event, const QPointF& point); KoPointerEvent(const KoPointerEvent &rhs); - ~KoPointerEvent(); /** * For classes that are handed this event, you can choose to accept (default) this event. * Acceptance signifies that you have handled this event and found it useful, the effect * of that will be that the event will not be handled to other event handlers. */ inline void accept() { m_event->accept(); } /** * For classes that are handed this event, you can choose to ignore this event. * Ignoring this event means you have not handled it and want to allow other event * handlers to try to handle it. */ inline void ignore() { m_event->ignore(); } /** * Returns the keyboard modifier flags that existed immediately before the event occurred. * See also QApplication::keyboardModifiers(). */ Qt::KeyboardModifiers modifiers() const; /// return if the event has been accepted. inline bool isAccepted() const { return m_event->isAccepted(); } /// return if this event was spontaneous (see QMouseEvent::spontaneous()) inline bool spontaneous() const { return m_event->spontaneous(); } /// return button pressed (see QMouseEvent::button()); Qt::MouseButton button() const; /// return buttons pressed (see QMouseEvent::buttons()); Qt::MouseButtons buttons() const; /// Return the position screen coordinates QPoint globalPos() const; /// return the position in widget coordinates QPoint pos() const; /** * return the pressure (or a default value). The range is 0.0 - 1.0 * and the default pressure (this is the pressure that will be given * when you use something like the mouse) is 1.0 */ qreal pressure() const; /// return the rotation (or a default value) qreal rotation() const; /** * return the tangential pressure (or a default value) * This is typically given by a finger wheel on an airbrush tool. The range * is from -1.0 to 1.0. 0.0 indicates a neutral position. Current airbrushes can * only move in the positive direction from the neutral position. If the device * does not support tangential pressure, this value is always 0.0. */ qreal tangentialPressure() const; /** * Return the x position in widget coordinates. * @see point */ int x() const; /** * Returns the angle between the device (a pen, for example) and the * perpendicular in the direction of the x axis. Positive values are * towards the tablet's physical right. The angle is in the range -60 * to +60 degrees. The default value is 0. */ int xTilt() const; /** * Return the y position in widget coordinates. * @see point */ int y() const; /** * Returns the angle between the device (a pen, for example) and the * perpendicular in the direction of the x axis. Positive values are * towards the tablet's physical right. The angle is in the range -60 * to +60 degrees. The default value is 0. */ int yTilt() const; /** * Returns the z position of the device. Typically this is represented * by a wheel on a 4D Mouse. If the device does not support a Z-axis, * this value is always zero. This is not the same as pressure. */ int z() const; - - /** - * Returns the distance that the wheel is rotated, in eights of a degree, or 0 otherwise. - * @return the distance of rotation. - * @see orientation() - */ - int delta() const; - /** * Returns the rotation around the X-axis. If the device does not support * this, the value is always zero. */ int rotationX() const; /** * Returns the rotation around the X-axis. If the device does not support * this, the value is always zero. */ int rotationY() const; /** * Returns the rotation around the Z-axis. If the device does not support * this, the value is always zero. */ int rotationZ() const; - /** - * Returns the orientation of the delta. - */ - Qt::Orientation orientation() const; /// The point in document coordinates. const QPointF point; const QList touchPoints; /** * Returns if the event comes from a tablet */ bool isTabletEvent(); protected: friend class KoToolProxy; friend class KisToolProxy; friend class KisScratchPadEventFilter; /// called by KoToolProxy to set which button was pressed. void setTabletButton(Qt::MouseButton button); private: KoPointerEvent& operator=(const KoPointerEvent &rhs); // for the d-pointer police; we want to make accessors to the event inline, so this one stays here. QEvent *m_event; class Private; Private * const d; }; #endif