From 2836a2be1be91cd17fd1e525d47e0ec60d153657 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Mon, 18 May 2009 17:10:43 +0200 Subject: Moved gestures info to an extra in QGraphicsItemPrivate not to increase the size of the latter when gestures are not used --- src/gui/graphicsview/qgraphicsitem.cpp | 33 ++++++++++++++++++++------------- 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 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::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::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(value)) { + QGestureExtraData *extra = d_ptr->maybeExtraGestures(); + if (!qVariantValue(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(value)) { + QGraphicsScene *scene = qVariantValue(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 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 gestures; + inline QGestureExtraData* extraGestures() const + { + QGestureExtraData *c = (QGestureExtraData *)qVariantValue(extra(ExtraGestures)); + if (!c) { + QGraphicsItemPrivate *that = const_cast(this); + c = new QGestureExtraData; + that->setExtra(ExtraGestures, qVariantFromValue(c)); + } + return c; + } + QGestureExtraData* maybeExtraGestures() const + { + return (QGestureExtraData *)qVariantValue(extra(ExtraGestures)); + } + inline void removeExtraGestures() + { + QGestureExtraData *c = (QGestureExtraData *)qVariantValue(extra(ExtraGestures)); + delete c; + unsetExtra(ExtraGestures); + } bool hasGesture(const QString &gesture) const; void grabGesture(int id); bool releaseGesture(int id); -- cgit v0.12