summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp33
-rw-r--r--src/gui/graphicsview/qgraphicsitem_p.h30
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);