12#include <QTabletEvent>
16#include <boost/variant2/variant.hpp>
18#include <ksharedconfig.h>
19#include <kconfiggroup.h>
39 KConfigGroup group = KSharedConfig::openConfig()->group(
"");
46#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
52template <
class Event>
void copyEventHack(
const Event *src, QScopedPointer<QEvent> &dst);
54template<>
void copyEventHack(
const QMouseEvent *src, QScopedPointer<QEvent> &dst) {
55 QMouseEvent *
tmp =
new QMouseEvent(
src->type(),
56 src->localPos(),
src->windowPos(),
src->screenPos(),
57 src->button(),
src->buttons(),
src->modifiers(),
59 tmp->setTimestamp(
src->timestamp());
63template<>
void copyEventHack(
const QTabletEvent *src, QScopedPointer<QEvent> &dst) {
64 QTabletEvent *
tmp =
new QTabletEvent(
src->type(),
65 src->posF(),
src->globalPosF(),
66 src->deviceType(),
src->pointerType(),
68 src->xTilt(),
src->yTilt(),
69 src->tangentialPressure(),
74 src->button(),
src->buttons());
75 tmp->setTimestamp(
src->timestamp());
79template<>
void copyEventHack(
const QTouchEvent *src, QScopedPointer<QEvent> &dst) {
80 QTouchEvent *
tmp =
new QTouchEvent(
src->type(),
83 src->touchPointStates(),
85 tmp->setTimestamp(
src->timestamp());
95 template <
typename Event>
101 boost::variant2::variant<QMouseEvent*, QTabletEvent*, QTouchEvent*>
eventPtr;
105bool KoPointerEvent::Private::s_tabletInputReceived;
117 if (!Private::s_tabletInputReceived) {
118 Private::s_tabletInputReceived =
true;
155template <
typename Event>
157 : event(_event, point),
163#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
164struct DeepCopyVisitor
168 template <
typename T>
170 QScopedPointer<QEvent> baseEvent;
171 detail::copyEventHack(event, baseEvent);
172 return {
static_cast<T*
>(baseEvent.take()), point};
179#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
180 return visit(DeepCopyVisitor{
point},
d->eventPtr);
196 return visit(Visitor{
point},
d->eventPtr);
205 Qt::MouseButton operator() (
const QMouseEvent *event) {
206 return event->button();
208 Qt::MouseButton operator() (
const QTabletEvent *event) {
209 return event->button();
211 Qt::MouseButton operator() (
const QTouchEvent *) {
212 return Qt::LeftButton;
216 return visit(Visitor(),
d->eventPtr);
222 Qt::MouseButtons operator() (
const QMouseEvent *event) {
223 return event->buttons();
225 Qt::MouseButtons operator() (
const QTabletEvent *event) {
226 return event->buttons();
228 Qt::MouseButtons operator() (
const QTouchEvent *) {
229 return Qt::LeftButton;
233 return visit(Visitor(),
d->eventPtr);
238#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
240 QPoint operator() (
const QMouseEvent *event) {
241 return event->globalPos();
243 QPoint operator() (
const QTabletEvent *event) {
244 return event->globalPos();
246 QPoint operator() (
const QTouchEvent *event) {
247 return event->touchPoints().constFirst().screenPos().toPoint();
251 QPoint operator() (
const QMouseEvent *event) {
252 return event->globalPosition().toPoint();
254 QPoint operator() (
const QTabletEvent *event) {
255 return event->globalPosition().toPoint();
257 QPoint operator() (
const QTouchEvent *event) {
258 return event->points().constFirst().globalPosition().toPoint();
264 return visit(Visitor(), d->eventPtr);
269#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
271 QPoint operator() (
const QMouseEvent *event) {
274 QPoint operator() (
const QTabletEvent *event) {
277 QPoint operator() (
const QTouchEvent *event) {
278 return event->touchPoints().at(0).pos().toPoint();
283 QPoint operator() (
const QMouseEvent *event) {
284 return event->position().toPoint();
286 QPoint operator() (
const QTabletEvent *event) {
287 return event->position().toPoint();
289 QPoint operator() (
const QTouchEvent *event) {
290 return event->points().at(0).position().toPoint();
294 return visit(Visitor(),
d->eventPtr);
310 qreal operator() (
const QTabletEvent *event) {
311 return event->pressure();
313 qreal operator() (
const QTouchEvent *event) {
314#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
315 return s_optionContainer->useTouchPressure ?
event->touchPoints().at(0).pressure() : 1.0;
317 return s_optionContainer->useTouchPressure ?
event->points().at(0).pressure() : 1.0;
320 qreal operator() (...) {
325 return visit(Visitor(),
d->eventPtr);
331 qreal operator() (
const QTabletEvent *event) {
332 return event->rotation();
334 qreal operator() (
const QTouchEvent *event) {
335#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
336 return event->touchPoints().at(0).rotation();
338 return event->points().at(0).rotation();
341 qreal operator() (...) {
346 return visit(Visitor(),
d->eventPtr);
352 qreal operator() (
const QTabletEvent *event) {
353 return std::fmod((event->tangentialPressure() - (-1.0)) / (1.0 - (-1.0)), 2.0);
355 qreal operator() (...) {
360 return visit(Visitor(),
d->eventPtr);
366 int operator() (
const QTabletEvent *event) {
367 return event->xTilt();
369 int operator() (...) {
374 return visit(Visitor(),
d->eventPtr);
381 int operator() (
const QTabletEvent *event) {
382 return event->yTilt();
384 int operator() (...) {
389 return visit(Visitor(),
d->eventPtr);
395 int operator() (
const QTabletEvent *event) {
398 int operator() (...) {
403 return visit(Visitor(),
d->eventPtr);
409 ulong operator() (
const QInputEvent *event) {
410 return event->timestamp();
414 return visit(Visitor(),
d->eventPtr);
419 return d->eventPtr.index() == 1;
424 return d->eventPtr.index() == 2;
429 return Private::s_tabletInputReceived;
435 Qt::KeyboardModifiers operator() (
const QInputEvent *event) {
436 return event->modifiers();
440 return visit(Visitor(),
d->eventPtr);
446 void operator() (QInputEvent *event) {
451 return visit(Visitor(),
d->eventPtr);
457 void operator() (QInputEvent *event) {
462 return visit(Visitor(),
d->eventPtr);
468 bool operator() (
const QInputEvent *event) {
469 return event->isAccepted();
473 return visit(Visitor(),
d->eventPtr);
479 bool operator() (
const QInputEvent *event) {
480 return event->spontaneous();
484 return visit(Visitor(),
d->eventPtr);
487#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
488void KoPointerEvent::copyQtPointerEvent(
const QMouseEvent *event, QScopedPointer<QEvent> &dst)
490 detail::copyEventHack(event, dst);
493void KoPointerEvent::copyQtPointerEvent(
const QTabletEvent *event, QScopedPointer<QEvent> &dst)
495 detail::copyEventHack(event, dst);
498void KoPointerEvent::copyQtPointerEvent(
const QTouchEvent *event, QScopedPointer<QEvent> &dst)
500 detail::copyEventHack(event, dst);
508 if (event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate || event->type() == QEvent::TouchEnd) {
509 const QTouchEvent *touchEvent =
static_cast<const QTouchEvent *
>(event);
510#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
515 if (touchPoints.isEmpty()) {
521#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
522 return touchPoints.constFirst().globalPosition();
524 return touchPoints.constFirst().screenPos();
527 }
else if (event->type() == QEvent::TabletPress ||
event->type() == QEvent::TabletRelease) {
528 const QTabletEvent *tabletEvent =
static_cast<const QTabletEvent *
>(event);
529#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
530 return tabletEvent->globalPosition();
532 return tabletEvent->globalPos();
534 }
else if (event->type() == QEvent::MouseButtonPress ||
535 event->type() == QEvent::MouseButtonRelease ||
536 event->type() == QEvent::MouseMove) {
537 const QMouseEvent *mouseEvent =
static_cast<const QMouseEvent *
>(event);
538#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
539 return mouseEvent->globalPosition();
541 return mouseEvent->globalPos();
548#include <KoPointerEvent.moc>
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
static KisConfigNotifier * instance()
void notifyTouchPaintingChanged()
KisTouchPressureSensitivityOptionContainer()
void slotSettingsChanged()
const QScopedPointer< Private > d
static std::optional< QPointF > fetchGlobalPositionFromPointerEvent(QEvent *event)
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
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
KoPointerEventWrapper(Event *_event, const QPointF &point)