12#include <QTabletEvent>
16#include <boost/variant2/variant.hpp>
18#include <ksharedconfig.h>
19#include <kconfiggroup.h>
38 KConfigGroup group = KSharedConfig::openConfig()->group(
"");
45#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
51template <
class Event>
void copyEventHack(
const Event *src, QScopedPointer<QEvent> &dst);
53template<>
void copyEventHack(
const QMouseEvent *src, QScopedPointer<QEvent> &dst) {
54 QMouseEvent *
tmp =
new QMouseEvent(
src->type(),
55 src->localPos(),
src->windowPos(),
src->screenPos(),
56 src->button(),
src->buttons(),
src->modifiers(),
58 tmp->setTimestamp(
src->timestamp());
62template<>
void copyEventHack(
const QTabletEvent *src, QScopedPointer<QEvent> &dst) {
63 QTabletEvent *
tmp =
new QTabletEvent(
src->type(),
64 src->posF(),
src->globalPosF(),
65 src->deviceType(),
src->pointerType(),
67 src->xTilt(),
src->yTilt(),
68 src->tangentialPressure(),
73 src->button(),
src->buttons());
74 tmp->setTimestamp(
src->timestamp());
78template<>
void copyEventHack(
const QTouchEvent *src, QScopedPointer<QEvent> &dst) {
79 QTouchEvent *
tmp =
new QTouchEvent(
src->type(),
82 src->touchPointStates(),
84 tmp->setTimestamp(
src->timestamp());
94 template <
typename Event>
100 boost::variant2::variant<QMouseEvent*, QTabletEvent*, QTouchEvent*>
eventPtr;
104bool KoPointerEvent::Private::s_tabletInputReceived;
116 if (!Private::s_tabletInputReceived) {
117 Private::s_tabletInputReceived =
true;
154template <
typename Event>
156 : event(_event, point),
162#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
163struct DeepCopyVisitor
167 template <
typename T>
169 QScopedPointer<QEvent> baseEvent;
170 detail::copyEventHack(event, baseEvent);
171 return {
static_cast<T*
>(baseEvent.take()), point};
178#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
179 return visit(DeepCopyVisitor{
point},
d->eventPtr);
195 return visit(Visitor{
point},
d->eventPtr);
204 Qt::MouseButton operator() (
const QMouseEvent *event) {
205 return event->button();
207 Qt::MouseButton operator() (
const QTabletEvent *event) {
208 return event->button();
210 Qt::MouseButton operator() (
const QTouchEvent *) {
211 return Qt::LeftButton;
215 return visit(Visitor(),
d->eventPtr);
221 Qt::MouseButtons operator() (
const QMouseEvent *event) {
222 return event->buttons();
224 Qt::MouseButtons operator() (
const QTabletEvent *event) {
225 return event->buttons();
227 Qt::MouseButtons operator() (
const QTouchEvent *) {
228 return Qt::LeftButton;
232 return visit(Visitor(),
d->eventPtr);
237#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
239 QPoint operator() (
const QMouseEvent *event) {
240 return event->globalPos();
242 QPoint operator() (
const QTabletEvent *event) {
243 return event->globalPos();
245 QPoint operator() (
const QTouchEvent *) {
250 QPoint operator() (
const QMouseEvent *event) {
251 return event->globalPosition().toPoint();
253 QPoint operator() (
const QTabletEvent *event) {
254 return event->globalPosition().toPoint();
256 QPoint operator() (
const QTouchEvent *) {
263 return visit(Visitor(), d->eventPtr);
268#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
270 QPoint operator() (
const QMouseEvent *event) {
273 QPoint operator() (
const QTabletEvent *event) {
276 QPoint operator() (
const QTouchEvent *event) {
277 return event->touchPoints().at(0).pos().toPoint();
282 QPoint operator() (
const QMouseEvent *event) {
283 return event->position().toPoint();
285 QPoint operator() (
const QTabletEvent *event) {
286 return event->position().toPoint();
288 QPoint operator() (
const QTouchEvent *event) {
289 return event->points().at(0).position().toPoint();
293 return visit(Visitor(),
d->eventPtr);
309 qreal operator() (
const QTabletEvent *event) {
310 return event->pressure();
312 qreal operator() (
const QTouchEvent *event) {
313#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
314 return s_optionContainer->useTouchPressure ?
event->touchPoints().at(0).pressure() : 1.0;
316 return s_optionContainer->useTouchPressure ?
event->points().at(0).pressure() : 1.0;
319 qreal operator() (...) {
324 return visit(Visitor(),
d->eventPtr);
330 qreal operator() (
const QTabletEvent *event) {
331 return event->rotation();
333 qreal operator() (
const QTouchEvent *event) {
334#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
335 return event->touchPoints().at(0).rotation();
337 return event->points().at(0).rotation();
340 qreal operator() (...) {
345 return visit(Visitor(),
d->eventPtr);
351 qreal operator() (
const QTabletEvent *event) {
352 return std::fmod((event->tangentialPressure() - (-1.0)) / (1.0 - (-1.0)), 2.0);
354 qreal operator() (...) {
359 return visit(Visitor(),
d->eventPtr);
365 int operator() (
const QTabletEvent *event) {
366 return event->xTilt();
368 int operator() (...) {
373 return visit(Visitor(),
d->eventPtr);
380 int operator() (
const QTabletEvent *event) {
381 return event->yTilt();
383 int operator() (...) {
388 return visit(Visitor(),
d->eventPtr);
394 int operator() (
const QTabletEvent *event) {
397 int operator() (...) {
402 return visit(Visitor(),
d->eventPtr);
408 ulong operator() (
const QInputEvent *event) {
409 return event->timestamp();
413 return visit(Visitor(),
d->eventPtr);
418 return d->eventPtr.index() == 1;
423 return d->eventPtr.index() == 2;
428 return Private::s_tabletInputReceived;
434 Qt::KeyboardModifiers operator() (
const QInputEvent *event) {
435 return event->modifiers();
439 return visit(Visitor(),
d->eventPtr);
445 void operator() (QInputEvent *event) {
450 return visit(Visitor(),
d->eventPtr);
456 void operator() (QInputEvent *event) {
461 return visit(Visitor(),
d->eventPtr);
467 bool operator() (
const QInputEvent *event) {
468 return event->isAccepted();
472 return visit(Visitor(),
d->eventPtr);
478 bool operator() (
const QInputEvent *event) {
479 return event->spontaneous();
483 return visit(Visitor(),
d->eventPtr);
486#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
487void KoPointerEvent::copyQtPointerEvent(
const QMouseEvent *event, QScopedPointer<QEvent> &dst)
489 detail::copyEventHack(event, dst);
492void KoPointerEvent::copyQtPointerEvent(
const QTabletEvent *event, QScopedPointer<QEvent> &dst)
494 detail::copyEventHack(event, dst);
497void KoPointerEvent::copyQtPointerEvent(
const QTouchEvent *event, QScopedPointer<QEvent> &dst)
499 detail::copyEventHack(event, dst);
503#include <KoPointerEvent.moc>
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static KisConfigNotifier * instance()
void notifyTouchPaintingChanged()
KisTouchPressureSensitivityOptionContainer()
void slotSettingsChanged()
const QScopedPointer< Private > d
bool spontaneous() const
return if this event was spontaneous (see QMouseEvent::spontaneous())
QPoint globalPos() const
Return the position screen coordinates.
KoPointerEvent & operator=(const KoPointerEvent &rhs)
qreal rotation() const
return the rotation (or a default value)
KoPointerEvent(QMouseEvent *event, const QPointF &point)
Qt::MouseButton button() const
return button pressed (see QMouseEvent::button());
Qt::MouseButtons buttons() const
return buttons pressed (see QMouseEvent::buttons());
qreal tangentialPressure() const
bool isTabletEvent() const
bool isTouchEvent() const
boost::variant2::variant< QMouseEvent *, QTabletEvent *, QTouchEvent * > eventPtr
Qt::KeyboardModifiers modifiers() const
static bool s_tabletInputReceived
bool isAccepted() const
return if the event has been accepted.
QPointF point
The point in document coordinates.
KoPointerEventWrapper deepCopyEvent() const
static bool tabletInputReceived()
QPoint pos() const
return the position in widget coordinates
KoPointerEventWrapper(Event *_event, const QPointF &point)