summaryrefslogtreecommitdiffstats
path: root/src/gui/graphicsview
diff options
context:
space:
mode:
authorDenis Dzyubenko <denis.dzyubenko@nokia.com>2009-03-05 17:41:10 (GMT)
committerDenis Dzyubenko <denis.dzyubenko@nokia.com>2009-05-11 13:41:38 (GMT)
commitfc84e3a05d01cce25949c605fc56dba4b4d3d183 (patch)
tree7ea7af86751c5828b61f025edcd830d1efc3491c /src/gui/graphicsview
parentb349831a5ae7bca80f22240b1ed204dd3d87c71f (diff)
downloadQt-fc84e3a05d01cce25949c605fc56dba4b4d3d183.zip
Qt-fc84e3a05d01cce25949c605fc56dba4b4d3d183.tar.gz
Qt-fc84e3a05d01cce25949c605fc56dba4b4d3d183.tar.bz2
Fixes: improved gesture manager event filtering.
Details: Several fixes - parsing only spontaneous mouse events and send gesture events to QGraphicsSceneItems according to their z-order
Diffstat (limited to 'src/gui/graphicsview')
-rw-r--r--src/gui/graphicsview/qgraphicsitem.cpp5
-rw-r--r--src/gui/graphicsview/qgraphicsitem.h1
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp19
3 files changed, 19 insertions, 6 deletions
diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp
index 58f04f0..a9ad1e1 100644
--- a/src/gui/graphicsview/qgraphicsitem.cpp
+++ b/src/gui/graphicsview/qgraphicsitem.cpp
@@ -5802,6 +5802,11 @@ void QGraphicsItem::releaseGesture(const Qt::GestureType &type)
d_ptr->scene->d_func()->releaseGesture(this, type);
}
+QSet<Qt::GestureType> QGraphicsItem::gestures() const
+{
+ return d_ptr->gestures;
+}
+
/*!
This virtual function is called by QGraphicsItem to notify custom items
that some part of the item's state changes. By reimplementing this
diff --git a/src/gui/graphicsview/qgraphicsitem.h b/src/gui/graphicsview/qgraphicsitem.h
index 42a5110..2b4cdf5 100644
--- a/src/gui/graphicsview/qgraphicsitem.h
+++ b/src/gui/graphicsview/qgraphicsitem.h
@@ -340,6 +340,7 @@ public:
void grabGesture(const Qt::GestureType &type);
void releaseGesture(const Qt::GestureType &type);
+ QSet<Qt::GestureType> gestures() const;
enum {
Type = 1,
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 873e28c..21c7c81 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -5614,18 +5614,25 @@ 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)))) {
+ QPolygonF poly;
+ QMap<Qt::GestureType, QPointF> hotSpots;
+ foreach(const Qt::GestureType &type, gestureTypes) {
+ QPointF pt = view->mapToScene(event->gesture(type)->hotSpot());
+ hotSpots.insert(type, pt);
+ poly << pt;
+ }
+
+ foreach(QGraphicsItem *item, items(poly, Qt::IntersectsItemBoundingRect)) {
+ QMap<Qt::GestureType, QPointF>::const_iterator it = hotSpots.begin(),
+ e = hotSpots.end();
+ for(; it != e; ++it) {
+ if (item->contains(item->mapFromScene(it.value())) && item->gestures().contains(it.key())) {
d->sendGestureEvent(item, event);
if (event->isAccepted())
break;