summaryrefslogtreecommitdiffstats
path: root/src/gui/graphicsview
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/graphicsview')
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp28
-rw-r--r--src/gui/graphicsview/qgraphicsitem.h3
-rw-r--r--src/gui/graphicsview/qgraphicsitem_p.h2
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp62
-rw-r--r--src/gui/graphicsview/qgraphicsscene.h2
-rw-r--r--src/gui/graphicsview/qgraphicsscene_p.h9
-rw-r--r--src/gui/graphicsview/qgraphicsview.cpp9
7 files changed, 113 insertions, 2 deletions
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 3eef396..58f04f0 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -5788,6 +5788,20 @@ QVariant QGraphicsItem::inputMethodQuery(Qt::InputMethodQuery query) const
return QVariant();
}
+void QGraphicsItem::grabGesture(const Qt::GestureType &type)
+{
+ d_ptr->gestures.insert(type);
+ if (d_ptr->scene)
+ d_ptr->scene->d_func()->grabGesture(this, type);
+}
+
+void QGraphicsItem::releaseGesture(const Qt::GestureType &type)
+{
+ d_ptr->gestures.remove(type);
+ if (d_ptr->scene)
+ d_ptr->scene->d_func()->releaseGesture(this, type);
+}
+
/*!
This virtual function is called by QGraphicsItem to notify custom items
that some part of the item's state changes. By reimplementing this
@@ -5812,6 +5826,20 @@ QVariant QGraphicsItem::inputMethodQuery(Qt::InputMethodQuery query) const
QVariant QGraphicsItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
Q_UNUSED(change);
+ if (change == QGraphicsItem::ItemSceneChange) {
+ if (!qVariantValue<QGraphicsScene*>(value)) {
+ // the item has been removed from a scene, unsubscribe gestures.
+ Q_ASSERT(d_ptr->scene);
+ foreach(const Qt::GestureType &gesture, d_ptr->gestures)
+ d_ptr->scene->d_func()->releaseGesture(this, gesture);
+ }
+ } else if (change == QGraphicsItem::ItemSceneHasChanged) {
+ if (QGraphicsScene *scene = qVariantValue<QGraphicsScene*>(value)) {
+ // item has been added to the scene
+ foreach(const Qt::GestureType &gesture, d_ptr->gestures)
+ scene->d_func()->grabGesture(this, gesture);
+ }
+ }
return value;
}
diff --git a/src/gui/graphicsview/qgraphicsitem.h b/src/gui/graphicsview/qgraphicsitem.h
index ec3373a..42a5110 100644
--- a/src/gui/graphicsview/qgraphicsitem.h
+++ b/src/gui/graphicsview/qgraphicsitem.h
@@ -338,6 +338,9 @@ public:
QVariant data(int key) const;
void setData(int key, const QVariant &value);
+ void grabGesture(const Qt::GestureType &type);
+ void releaseGesture(const Qt::GestureType &type);
+
enum {
Type = 1,
UserType = 65536
diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h
index 5e77dfd..a67a49a 100644
--- a/src/gui/graphicsview/qgraphicsitem_p.h
+++ b/src/gui/graphicsview/qgraphicsitem_p.h
@@ -54,6 +54,7 @@
//
#include "qgraphicsitem.h"
+#include "qset.h"
#if !defined(QT_NO_GRAPHICSVIEW) || (QT_EDITION & QT_MODULE_GRAPHICSVIEW) != QT_MODULE_GRAPHICSVIEW
@@ -297,6 +298,7 @@ public:
int siblingIndex;
int index;
int depth;
+ QSet<Qt::GestureType> gestures;
// Packed 32 bytes
quint32 acceptedMouseButtons : 5;
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index f322305..fe6dde1 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -3950,6 +3950,9 @@ bool QGraphicsScene::event(QEvent *event)
// geometries that do not have an explicit style set.
update();
break;
+ case QEvent::Gesture:
+ gestureEvent(static_cast<QGestureEvent*>(event));
+ break;
case QEvent::GraphicsSceneTouchBegin:
d->touchBeginEvent(static_cast<QGraphicsSceneTouchEvent *>(event));
break;
@@ -5586,6 +5589,65 @@ void QGraphicsScene::setActiveWindow(QGraphicsWidget *widget)
}
}
+void QGraphicsScenePrivate::addView(QGraphicsView *view)
+{
+ views << view;
+ foreach(const Qt::GestureType &gesture, grabbedGestures)
+ view->grabGesture(gesture);
+}
+
+void QGraphicsScenePrivate::removeView(QGraphicsView *view)
+{
+ views.removeAll(view);
+ foreach(const Qt::GestureType &gesture, grabbedGestures)
+ view->releaseGesture(gesture);
+}
+
+void QGraphicsScenePrivate::sendGestureEvent(QGraphicsItem *item, QGestureEvent *event)
+{
+ //### TODO: position translation
+ sendEvent(item, event);
+}
+
+void QGraphicsScene::gestureEvent(QGestureEvent *event)
+{
+ Q_D(QGraphicsScene);
+ QList<Qt::GestureType> gestureTypes = event->gestureTypes();
+ QList<QPointF> pts;
+ QGraphicsView *view = qobject_cast<QGraphicsView*>(event->targetWidget());
+ if (!view) {
+ // something is wrong.
+ Q_ASSERT(view);
+ return;
+ }
+ foreach(const Qt::GestureType &type, gestureTypes)
+ pts << view->mapToScene(event->gesture(type)->hotSpot());
+ foreach(QGraphicsItem *item, d->itemsWithGestures) {
+ for (int i = 0; i < pts.size(); ++i) {
+ if (item->contains(item->mapFromScene(pts.at(i)))) {
+ d->sendGestureEvent(item, event);
+ if (event->isAccepted())
+ break;
+ }
+ }
+ }
+}
+
+void QGraphicsScenePrivate::grabGesture(QGraphicsItem *item, const Qt::GestureType &type)
+{
+ if (!grabbedGestures.contains(type)) {
+ foreach(QGraphicsView *view, views)
+ view->grabGesture(type);
+ }
+ itemsWithGestures << item;
+ grabbedGestures << type;
+}
+
+void QGraphicsScenePrivate::releaseGesture(QGraphicsItem *item, const Qt::GestureType &type)
+{
+ //###
+}
+
// ### FIXME: the code for touch event support is mosly copied from
// ### QGraphicsScenePrivate::mousePressEventHandler() and friends, need to
// ### refactor to reduce code duplication
diff --git a/src/gui/graphicsview/qgraphicsscene.h b/src/gui/graphicsview/qgraphicsscene.h
index 9802f87..4680455 100644
--- a/src/gui/graphicsview/qgraphicsscene.h
+++ b/src/gui/graphicsview/qgraphicsscene.h
@@ -50,6 +50,7 @@
#include <QtGui/qtransform.h>
#include <QtGui/qmatrix.h>
#include <QtGui/qpen.h>
+#include <QtGui/qevent.h>
QT_BEGIN_HEADER
@@ -254,6 +255,7 @@ protected:
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
virtual void wheelEvent(QGraphicsSceneWheelEvent *event);
virtual void inputMethodEvent(QInputMethodEvent *event);
+ virtual void gestureEvent(QGestureEvent *event);
virtual void drawBackground(QPainter *painter, const QRectF &rect);
virtual void drawForeground(QPainter *painter, const QRectF &rect);
diff --git a/src/gui/graphicsview/qgraphicsscene_p.h b/src/gui/graphicsview/qgraphicsscene_p.h
index de39205..cea0553 100644
--- a/src/gui/graphicsview/qgraphicsscene_p.h
+++ b/src/gui/graphicsview/qgraphicsscene_p.h
@@ -182,6 +182,9 @@ public:
void storeMouseButtonsForMouseGrabber(QGraphicsSceneMouseEvent *event);
QList<QGraphicsView *> views;
+ void addView(QGraphicsView *view);
+ void removeView(QGraphicsView *view);
+
bool painterStateProtection;
QMultiMap<QGraphicsItem *, QGraphicsItem *> sceneEventFilters;
@@ -264,6 +267,12 @@ public:
void resolvePalette();
void updatePalette(const QPalette &palette);
+ QSet<QGraphicsItem*> itemsWithGestures;
+ QSet<Qt::GestureType> grabbedGestures;
+ void grabGesture(QGraphicsItem *item, const Qt::GestureType &type);
+ void releaseGesture(QGraphicsItem *item, const Qt::GestureType &type);
+ void sendGestureEvent(QGraphicsItem *item, QGestureEvent *event);
+
mutable QVector<QTransform> sceneTransformCache;
mutable QBitArray validTransforms;
mutable QVector<int> freeSceneTransformSlots;
diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp
index 1aaaab9..acce717 100644
--- a/src/gui/graphicsview/qgraphicsview.cpp
+++ b/src/gui/graphicsview/qgraphicsview.cpp
@@ -1690,7 +1690,7 @@ void QGraphicsView::setScene(QGraphicsScene *scene)
this, SLOT(updateScene(QList<QRectF>)));
disconnect(d->scene, SIGNAL(sceneRectChanged(QRectF)),
this, SLOT(updateSceneRect(QRectF)));
- d->scene->d_func()->views.removeAll(this);
+ d->scene->d_func()->removeView(this);
}
// Assign the new scene and update the contents (scrollbars, etc.)).
@@ -1698,7 +1698,7 @@ void QGraphicsView::setScene(QGraphicsScene *scene)
connect(d->scene, SIGNAL(sceneRectChanged(QRectF)),
this, SLOT(updateSceneRect(QRectF)));
d->updateSceneSlotReimplementedChecked = false;
- d->scene->d_func()->views << this;
+ d->scene->d_func()->addView(this);
d->recalculateContentSize();
d->lastCenterPoint = sceneRect().center();
d->keepLastCenterPoint = true;
@@ -2860,6 +2860,11 @@ bool QGraphicsView::event(QEvent *event)
}
}
break;
+ case QEvent::Gesture:
+ QApplication::sendEvent(d->scene, event);
+ if (event->isAccepted())
+ return true;
+ break;
default:
break;
}