aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2011-10-03 10:59:16 +1000
committerQt by Nokia <qt-info@nokia.com>2011-10-03 04:44:51 +0200
commit69e925444ecebd352462f742d894b326d4cc9a72 (patch)
treea84c82b846c8f3b55c825cb74eac2a0e6e9f1b70
parent54da515e5e5f65e7ae253280038aad912780de12 (diff)
Fix order of QSGItem mouse filtering.
QGraphicsView filtered child items beginning with the item's parent, grandparent, greatgrandparent... QSGCanvas did the opposite, which breaks the QML mouse handling element filtering logic. Task-number: QTBUG-21446 Change-Id: I18e125305eef536237195895a7f41f88b532d4aa Reviewed-on: http://codereview.qt-project.org/5819 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Bea Lam <bea.lam@nokia.com>
-rw-r--r--src/declarative/items/qsgcanvas.cpp6
-rw-r--r--tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp53
2 files changed, 55 insertions, 4 deletions
diff --git a/src/declarative/items/qsgcanvas.cpp b/src/declarative/items/qsgcanvas.cpp
index 2ced204804..d4a74cdda8 100644
--- a/src/declarative/items/qsgcanvas.cpp
+++ b/src/declarative/items/qsgcanvas.cpp
@@ -1439,14 +1439,14 @@ bool QSGCanvasPrivate::sendFilteredMouseEvent(QSGItem *target, QSGItem *item, QM
if (!target)
return false;
- if (sendFilteredMouseEvent(target->parentItem(), item, event))
- return true;
-
QSGItemPrivate *targetPrivate = QSGItemPrivate::get(target);
if (targetPrivate->filtersChildMouseEvents)
if (target->childMouseEventFilter(item, event))
return true;
+ if (sendFilteredMouseEvent(target->parentItem(), item, event))
+ return true;
+
return false;
}
diff --git a/tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp b/tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp
index 32271b091f..a504de87a5 100644
--- a/tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp
+++ b/tests/auto/declarative/qsgcanvas/tst_qsgcanvas.cpp
@@ -121,9 +121,11 @@ class TestTouchItem : public QSGRectangle
Q_OBJECT
public:
TestTouchItem(QSGItem *parent = 0)
- : QSGRectangle(parent), acceptEvents(true)
+ : QSGRectangle(parent), acceptEvents(true), mousePressId(0)
{
border()->setWidth(1);
+ setAcceptedMouseButtons(Qt::LeftButton);
+ setFiltersChildMouseEvents(true);
}
void reset() {
@@ -136,6 +138,7 @@ public:
bool acceptEvents;
TouchEventData lastEvent;
+ int mousePressId;
protected:
virtual void touchEvent(QTouchEvent *event) {
@@ -146,8 +149,20 @@ protected:
lastEvent = makeTouchData(event->type(), event->widget(), event->touchPointStates(), event->touchPoints());
event->accept();
}
+
+ virtual void mousePressEvent(QMouseEvent *event) {
+ mousePressId = ++mousePressNum;
+ }
+
+ bool childMouseEventFilter(QSGItem *, QEvent *) {
+ mousePressId = ++mousePressNum;
+ return false;
+ }
+
+ static int mousePressNum;
};
+int TestTouchItem::mousePressNum = 0;
class ConstantUpdateItem : public QSGItem
{
@@ -181,6 +196,7 @@ private slots:
void touchEvent_propagation_data();
void clearCanvas();
+ void mouseFiltering();
};
tst_qsgcanvas::tst_qsgcanvas()
@@ -464,6 +480,41 @@ void tst_qsgcanvas::clearCanvas()
delete item;
}
+void tst_qsgcanvas::mouseFiltering()
+{
+ QSGCanvas *canvas = new QSGCanvas;
+ canvas->resize(250, 250);
+ canvas->move(100, 100);
+ canvas->show();
+
+ TestTouchItem *bottomItem = new TestTouchItem(canvas->rootItem());
+ bottomItem->setObjectName("Bottom Item");
+ bottomItem->setSize(QSizeF(150, 150));
+
+ TestTouchItem *middleItem = new TestTouchItem(bottomItem);
+ middleItem->setObjectName("Middle Item");
+ middleItem->setPos(QPointF(50, 50));
+ middleItem->setSize(QSizeF(150, 150));
+
+ TestTouchItem *topItem = new TestTouchItem(middleItem);
+ topItem->setObjectName("Top Item");
+ topItem->setPos(QPointF(50, 50));
+ topItem->setSize(QSizeF(150, 150));
+
+ QPoint pos(100, 100);
+
+ QTest::mousePress(canvas, Qt::LeftButton, 0, pos);
+ QTest::qWait(50);
+
+ // Mouse filtering propagates down the stack, so the
+ // correct order is
+ // 1. middleItem filters event
+ // 2. bottomItem filters event
+ // 3. topItem receives event
+ QCOMPARE(middleItem->mousePressId, 1);
+ QCOMPARE(bottomItem->mousePressId, 2);
+ QCOMPARE(topItem->mousePressId, 3);
+}
QTEST_MAIN(tst_qsgcanvas)