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 }