diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/graphicsview/qgraphicsitem.cpp | 33 | ||||
-rw-r--r-- | src/gui/graphicsview/qgraphicsitem_p.h | 30 |
2 files changed, 48 insertions, 15 deletions
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index ae33674..fb95875 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -1055,6 +1055,7 @@ QGraphicsItem::~QGraphicsItem() clearFocus(); d_ptr->removeExtraItemCache(); + d_ptr->removeExtraGestures(); QList<QGraphicsItem *> oldChildren = d_ptr->children; qDeleteAll(oldChildren); Q_ASSERT(d_ptr->children.isEmpty()); @@ -5880,7 +5881,7 @@ int QGraphicsItem::grabGesture(const QString &gesture) void QGraphicsItemPrivate::grabGesture(int id) { Q_Q(QGraphicsItem); - gestures << id; + extraGestures()->gestures << id; if (scene) scene->d_func()->grabGesture(q, id); } @@ -5888,10 +5889,11 @@ void QGraphicsItemPrivate::grabGesture(int id) bool QGraphicsItemPrivate::releaseGesture(int id) { Q_Q(QGraphicsItem); - if (gestures.contains(id)) { + QGestureExtraData *extra = maybeExtraGestures(); + if (extra && extra->gestures.contains(id)) { if (scene) scene->d_func()->releaseGesture(q, id); - gestures.remove(id); + extra->gestures.remove(id); return true; } return false; @@ -5929,12 +5931,14 @@ void QGraphicsItem::setGestureEnabled(int gestureId, bool enable) bool QGraphicsItemPrivate::hasGesture(const QString &name) const { - QGestureManager *gm = QGestureManager::instance(); - QSet<int>::const_iterator it = gestures.begin(), - e = gestures.end(); - for (; it != e; ++it) { - if (gm->gestureNameFromId(*it) == name) - return true; + if (QGestureExtraData *extra = maybeExtraGestures()) { + QGestureManager *gm = QGestureManager::instance(); + QSet<int>::const_iterator it = extra->gestures.begin(), + e = extra->gestures.end(); + for (; it != e; ++it) { + if (gm->gestureNameFromId(*it) == name) + return true; + } } return false; } @@ -5964,16 +5968,19 @@ QVariant QGraphicsItem::itemChange(GraphicsItemChange change, const QVariant &va { Q_UNUSED(change); if (change == QGraphicsItem::ItemSceneChange) { - if (!qVariantValue<QGraphicsScene*>(value)) { + QGestureExtraData *extra = d_ptr->maybeExtraGestures(); + if (!qVariantValue<QGraphicsScene*>(value) && extra) { // the item has been removed from a scene, unsubscribe gestures. Q_ASSERT(d_ptr->scene); - foreach(int id, d_ptr->gestures) + foreach(int id, extra->gestures) d_ptr->scene->d_func()->releaseGesture(this, id); } } else if (change == QGraphicsItem::ItemSceneHasChanged) { - if (QGraphicsScene *scene = qVariantValue<QGraphicsScene*>(value)) { + QGraphicsScene *scene = qVariantValue<QGraphicsScene*>(value); + QGestureExtraData *extra = d_ptr->maybeExtraGestures(); + if (scene && extra) { // item has been added to the scene - foreach(int id, d_ptr->gestures) + foreach(int id, extra->gestures) scene->d_func()->grabGesture(this, id); } } diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h index 091a461..7642b98 100644 --- a/src/gui/graphicsview/qgraphicsitem_p.h +++ b/src/gui/graphicsview/qgraphicsitem_p.h @@ -90,6 +90,12 @@ public: void purge(); }; +class QGestureExtraData +{ +public: + QSet<int> gestures; +}; + class Q_AUTOTEST_EXPORT QGraphicsItemPrivate { Q_DECLARE_PUBLIC(QGraphicsItem) @@ -102,7 +108,8 @@ public: ExtraMaxDeviceCoordCacheSize, ExtraBoundingRegionGranularity, ExtraOpacity, - ExtraEffectiveOpacity + ExtraEffectiveOpacity, + ExtraGestures }; enum AncestorFlag { @@ -303,8 +310,27 @@ public: int siblingIndex; int index; int depth; - QSet<int> gestures; + inline QGestureExtraData* extraGestures() const + { + QGestureExtraData *c = (QGestureExtraData *)qVariantValue<void *>(extra(ExtraGestures)); + if (!c) { + QGraphicsItemPrivate *that = const_cast<QGraphicsItemPrivate *>(this); + c = new QGestureExtraData; + that->setExtra(ExtraGestures, qVariantFromValue<void *>(c)); + } + return c; + } + QGestureExtraData* maybeExtraGestures() const + { + return (QGestureExtraData *)qVariantValue<void *>(extra(ExtraGestures)); + } + inline void removeExtraGestures() + { + QGestureExtraData *c = (QGestureExtraData *)qVariantValue<void *>(extra(ExtraGestures)); + delete c; + unsetExtra(ExtraGestures); + } bool hasGesture(const QString &gesture) const; void grabGesture(int id); bool releaseGesture(int id); |