File indexing completed on 2025-03-09 04:06:00

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 Arjen Hiemstra <ahiemstra@heimr.nl>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "MouseTracker.h"
0008 
0009 #include <QQuickItem>
0010 #include <QEvent>
0011 #include <QCoreApplication>
0012 #include <QTouchEvent>
0013 
0014 struct TrackedItem {
0015     TrackedItem(QQuickItem* i, const QPointF& o) : item(i), offset(o) { }
0016 
0017     QQuickItem* item;
0018     QPointF offset;
0019 };
0020 
0021 class MouseTracker::Private
0022 {
0023 public:
0024     Private()
0025     { }
0026 
0027     QList<TrackedItem> trackedItems;
0028 };
0029 
0030 MouseTracker::MouseTracker(QObject* parent)
0031     : QObject(parent), d(new Private)
0032 {
0033     QCoreApplication::instance()->installEventFilter(this);
0034 }
0035 
0036 MouseTracker::~MouseTracker()
0037 {
0038     delete d;
0039 }
0040 
0041 void MouseTracker::addItem(QQuickItem* item, const QPointF& offset)
0042 {
0043     d->trackedItems.append(TrackedItem(item, offset));
0044 }
0045 
0046 void MouseTracker::removeItem(QQuickItem* item)
0047 {
0048     for(int i = 0; i < d->trackedItems.length(); ++i) {
0049         if(d->trackedItems.at(i).item == item) {
0050             d->trackedItems.removeAt(i);
0051             break;
0052         }
0053     }
0054 }
0055 
0056 bool MouseTracker::eventFilter(QObject* target, QEvent* event)
0057 {
0058     Q_UNUSED(target);
0059     if (d->trackedItems.count() > 0) {
0060         switch(event->type()) {
0061     // QT5TODO
0062 //             case QEvent::GraphicsSceneMouseMove: {
0063 //                 QGraphicsSceneMouseEvent* mevent = static_cast<QGraphicsSceneMouseEvent*>(event);
0064 //                 Q_FOREACH(const TrackedItem& item, d->trackedItems) {
0065 //                     item.item->setPos(mevent->scenePos() + item.offset);
0066 //                 }
0067 //                 return false;
0068 //             }
0069 //             case QEvent::TouchUpdate: {
0070 //                 QTouchEvent* tevent = static_cast<QTouchEvent*>(event);
0071 //                 QTouchEvent::TouchPoint primary = tevent->touchPoints().at(0);
0072 //                 Q_FOREACH(const TrackedItem& item, d->trackedItems) {
0073 //                     item.item->setPos(primary.scenePos() + item.offset);
0074 //                 }
0075 //                 return false;
0076 //             }
0077 //             case QEvent::DragMove: {
0078 //                 QDragMoveEvent* mevent = static_cast<QDragMoveEvent*>(event);
0079 //                 Q_FOREACH(const TrackedItem& item, d->trackedItems) {
0080 //                     item.item->setPos(mevent->pos() + item.offset);
0081 //                 }
0082 //                 return false;
0083 //             }
0084             default: ;
0085         }
0086     }
0087     return false;
0088 }