summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp15
-rw-r--r--src/gui/graphicsview/qgraphicsscenebsptreeindex_p.cpp11
-rw-r--r--src/gui/graphicsview/qgraphicssceneindex.cpp2
-rw-r--r--tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp3
-rw-r--r--tests/auto/qgraphicssceneindex/tst_qgraphicssceneindex.cpp4
5 files changed, 21 insertions, 14 deletions
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 479a548..0172a23 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -453,7 +453,9 @@ void QGraphicsScenePrivate::_q_removeItemLater(QGraphicsItem *item)
// chain.
item->clearFocus();
- //We ask for a removing in the index
+ // Note: This will access item's sceneBoundingRect(), which (as this is
+ // C++) is why we cannot call removeItem() from QGraphicsItem's
+ // destructor.
this->index->deleteItem(item);
// Reset the mouse grabber and focus item data.
@@ -1198,7 +1200,10 @@ void QGraphicsScenePrivate::climbTree(QGraphicsItem *item, int *stackingOrder)
void QGraphicsScenePrivate::_q_updateSortCache()
{
//### FIXME
- //index->updateIndex();
+ QGraphicsSceneBspTreeIndex *tree = qobject_cast<QGraphicsSceneBspTreeIndex*>(index);
+ if (tree) {
+ tree->_q_updateIndex();
+ }
if (!sortCacheEnabled || !updatingSortCache)
return;
@@ -2578,10 +2583,8 @@ void QGraphicsScene::removeItem(QGraphicsItem *item)
// Clear its background
item->update();
- // Note: This will access item's sceneBoundingRect(), which (as this is
- // C++) is why we cannot call removeItem() from QGraphicsItem's
- // destructor.
- d->index->deleteItem(item);
+ // Remove it from the index properly
+ d->index->removeItem(item);
if (item == d->tabFocusFirst) {
QGraphicsWidget *widget = static_cast<QGraphicsWidget *>(item);
diff --git a/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.cpp b/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.cpp
index 8a26447..f8f1f56 100644
--- a/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.cpp
+++ b/src/gui/graphicsview/qgraphicsscenebsptreeindex_p.cpp
@@ -61,11 +61,10 @@ QGraphicsSceneBspTreeIndex::QGraphicsSceneBspTreeIndex(QGraphicsScene *scene)
}
-
QRectF QGraphicsSceneBspTreeIndex::indexedRect()
{
_q_updateIndex();
- return scene()->d_func()->hasSceneRect ? scene()->d_func()->sceneRect : scene()->d_func()->growingItemsBoundingRect;
+ return scene()->d_func()->hasSceneRect ? scene()->d_func()->sceneRect : scene()->d_func()->growingItemsBoundingRect;
}
void QGraphicsSceneBspTreeIndex::clear()
@@ -162,7 +161,7 @@ void QGraphicsSceneBspTreeIndex::removeFromIndex(QGraphicsItem *item)
item->d_func()->index = -1;
unindexedItems << item;
- //prepareGeometryChange will call updateItem
+ //prepareGeometryChange will call prepareBoundingRectChange
foreach (QGraphicsItem *child, item->children())
child->prepareGeometryChange();
}
@@ -180,13 +179,15 @@ void QGraphicsSceneBspTreeIndex::prepareBoundingRectChange(const QGraphicsItem *
QList<QGraphicsItem *> QGraphicsSceneBspTreeIndex::estimateItems(const QRectF &rect, Qt::SortOrder order, const QTransform &deviceTransform) const
{
const_cast<QGraphicsSceneBspTreeIndex*>(this)->purgeRemovedItems();
+ scene()->d_func()->_q_updateSortCache();
+
QList<QGraphicsItem *> rectItems = bsp.items(rect);
// Fill in with any unindexed items
for (int i = 0; i < unindexedItems.size(); ++i) {
if (QGraphicsItem *item = unindexedItems.at(i)) {
if (!item->d_ptr->itemDiscovered && item->d_ptr->visible && !(item->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren)) {
QRectF boundingRect = item->sceneBoundingRect();
- if (boundingRect.intersects(rect)) {
+ if (QRectF_intersects(boundingRect, rect)) {
item->d_ptr->itemDiscovered = 1;
rectItems << item;
}
@@ -328,7 +329,7 @@ void QGraphicsSceneBspTreeIndex::_q_updateIndex()
if (item->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren)
continue;
- bsp.insertItem(item,rect);
+ bsp.insertItem(item, rect);
// If the item ignores view transformations, update our
// largest-item-counter to ensure that the view can accurately
diff --git a/src/gui/graphicsview/qgraphicssceneindex.cpp b/src/gui/graphicsview/qgraphicssceneindex.cpp
index fe3a68a..d0d6081 100644
--- a/src/gui/graphicsview/qgraphicssceneindex.cpp
+++ b/src/gui/graphicsview/qgraphicssceneindex.cpp
@@ -352,7 +352,7 @@ QList<QGraphicsItem *> QGraphicsSceneIndex::items(const QPointF &pos, Qt::ItemSe
}
}
- d->scene->d_func()->sortItems(&items, Qt::AscendingOrder, d->scene->d_func()->sortCacheEnabled);
+ d->scene->d_func()->sortItems(&items, order, d->scene->d_func()->sortCacheEnabled);
return items;
}
diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
index 0c5ebf6..eb117ab 100644
--- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -395,6 +395,9 @@ void tst_QGraphicsScene::items()
QGraphicsLineItem *l2 = scene.addLine(0, -5, 0, 5);
QVERIFY(!l1->sceneBoundingRect().intersects(l2->sceneBoundingRect()));
QVERIFY(!l2->sceneBoundingRect().intersects(l1->sceneBoundingRect()));
+ QList<QGraphicsItem *> items;
+ items<<l1<<l2;
+ QCOMPARE(scene.items(), items);
QVERIFY(scene.items(-1, -1, 2, 2).contains(l1));
QVERIFY(scene.items(-1, -1, 2, 2).contains(l2));
}
diff --git a/tests/auto/qgraphicssceneindex/tst_qgraphicssceneindex.cpp b/tests/auto/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
index 3dca152..6b352ab 100644
--- a/tests/auto/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
+++ b/tests/auto/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
@@ -107,8 +107,8 @@ void tst_QGraphicsSceneIndex::sceneRect()
{
QGraphicsScene *scene = new QGraphicsScene();
QGraphicsSceneIndex *index = new QGraphicsSceneBspTreeIndex(scene);
- index->setRect(QRectF(0, 0, 2000, 2000));
- QCOMPARE(index->rect(), QRectF(0, 0, 2000, 2000));
+ scene->setSceneRect(QRectF(0, 0, 2000, 2000));
+ QCOMPARE(index->indexedRect(), QRectF(0, 0, 2000, 2000));
}
void tst_QGraphicsSceneIndex::customIndex_data()