summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulian de Bhal <julian.debhal@nokia.com>2011-07-08 15:49:20 +1000
committerQt by Nokia <qt-info@nokia.com>2011-07-18 07:12:52 +0200
commit8d0c50753dbe327bc6ace6330d843f03fd8eee74 (patch)
tree82a5434036f1a5b3dbce74339a2ecbe2ecfbf4b2
parent5d5f1e9b3ec59aa7857c2499bfce293a564840ae (diff)
QTBUG-19687 - Fix picking for dynamically created Item3Ds
Change-Id: I3f46cf64ede0cf0647ca1cfc2fc95e837500a07c Reviewed-on: http://codereview.qt.nokia.com/1340 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Patrick Burke <patrick.burke@nokia.com>
-rw-r--r--src/imports/threed/viewport.cpp13
-rw-r--r--src/imports/threed/viewport.h1
-rw-r--r--src/quick3d/qdeclarativeitem3d.cpp12
-rw-r--r--tests/auto/qml3d/picking/tst_picking.qml34
4 files changed, 60 insertions, 0 deletions
diff --git a/src/imports/threed/viewport.cpp b/src/imports/threed/viewport.cpp
index f88d19fd..631d2aad 100644
--- a/src/imports/threed/viewport.cpp
+++ b/src/imports/threed/viewport.cpp
@@ -1203,4 +1203,17 @@ QPointF Viewport::viewDelta(qreal deltax, qreal deltay)
return QPointF(deltax * scaleX / w, deltay * scaleY / h);
}
+QVariant Viewport::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+{
+ if (change == QGraphicsItem::ItemChildAddedChange)
+ {
+ QGraphicsItem *newItem = value.value<QGraphicsItem*>();
+ if (QDeclarativeItem3D* item3d =
+ qobject_cast<QDeclarativeItem3D*>(newItem))
+ {
+ setItemViewport(item3d);
+ }
+ };
+ return QGraphicsItem::itemChange(change, value);
+}
QT_END_NAMESPACE
diff --git a/src/imports/threed/viewport.h b/src/imports/threed/viewport.h
index 9e802412..77cb6fe7 100644
--- a/src/imports/threed/viewport.h
+++ b/src/imports/threed/viewport.h
@@ -121,6 +121,7 @@ protected:
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void wheelEvent(QGraphicsSceneWheelEvent *event);
void keyPressEvent(QKeyEvent *event);
+ virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value);
private:
ViewportPrivate *d;
diff --git a/src/quick3d/qdeclarativeitem3d.cpp b/src/quick3d/qdeclarativeitem3d.cpp
index 7141b550..86171dc3 100644
--- a/src/quick3d/qdeclarativeitem3d.cpp
+++ b/src/quick3d/qdeclarativeitem3d.cpp
@@ -1040,6 +1040,8 @@ void QDeclarativeItem3D::draw(QGLPainter *painter)
// Bail out if this item and its children have been disabled.
if (!d->isEnabled)
return;
+ if (!d->isInitialized)
+ initialize(painter);
int prevId = painter->objectPickId();
painter->setObjectPickId(d->objectPickId);
@@ -1163,6 +1165,16 @@ void QDeclarativeItem3D::initialize(QGLPainter *painter)
{
if (d->isInitialized) return;
+ if (!d->viewport)
+ {
+ if (QDeclarativeItem3D* parentItem =
+ qobject_cast<QDeclarativeItem3D*>(parent()))
+ {
+ d->viewport = parentItem->d->viewport;
+ Q_ASSERT(d->viewport);
+ }
+ }
+
d->objectPickId = d->viewport->registerPickableObject(this);
for (int index = 0; index < children().size(); ++index) {
diff --git a/tests/auto/qml3d/picking/tst_picking.qml b/tests/auto/qml3d/picking/tst_picking.qml
index 4e89373b..911a3124 100644
--- a/tests/auto/qml3d/picking/tst_picking.qml
+++ b/tests/auto/qml3d/picking/tst_picking.qml
@@ -106,6 +106,34 @@ Rectangle
}
}
+ Component {
+ id: pickTestDelegate
+ Quad {
+ objectName: "foo"
+ transform: [
+ Rotation3D {
+ axis: Qt.vector3d(1,0,0);
+ angle: 90
+ },
+ // Bring quad forwards a little bit to ensure it's drawn
+ Translation3D { translate: Qt.vector3d(0,0,0.1)}
+ ]
+
+ // Ensure items are above smallerQuad
+ position: Qt.vector3d(0, 0, (index + 1) * 0.1)
+ property color color: model.color
+ }
+ }
+
+ ListModel{
+ id: pickTestModel
+ }
+
+ Repeater {
+ delegate: pickTestDelegate
+ model: pickTestModel
+ }
+
// picking fails until the first paint occurs. There's no
// straight-forward way to wait for the first paint, so we'll use a
// timer to allow the paint to happen.
@@ -153,6 +181,12 @@ Rectangle
"Didn't find smaller quad at midpoint");
verify(viewport.objectForPoint(-midX,-midY) == null,
"Incorrectly found object off viewport");
+ pickTestModel.append({"color":"#00ff00"});
+ verify(viewport.objectForPoint(midX,midY).color == "#00ff00",
+ "Didn't find modelview quad at midpoint");
+ pickTestModel.append({"color":"#ff00ff"});
+ verify(viewport.objectForPoint(midX,midY).color == "#ff00ff",
+ "Didn't find second modelview quad at midpoint");
}
}
}