summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Nilsen <bjorn.nilsen@nokia.com>2009-06-29 13:33:30 (GMT)
committerBjørn Erik Nilsen <bjorn.nilsen@nokia.com>2009-06-29 13:55:09 (GMT)
commit7fe4f8ff71cf09bbabbd3438ef637fe408a11c33 (patch)
treefd266d7ea6d4354340d8f016e790582046cfecca
parenteff4c4b4172d1a95b1b5806622b4e7fe43c2b006 (diff)
downloadQt-7fe4f8ff71cf09bbabbd3438ef637fe408a11c33.zip
Qt-7fe4f8ff71cf09bbabbd3438ef637fe408a11c33.tar.gz
Qt-7fe4f8ff71cf09bbabbd3438ef637fe408a11c33.tar.bz2
Graphics View: BSP tree cleanup.
Ensure the BSP resets the QGraphicsItemPrivate::itemDiscovered bit before returning the list of discovered items.
-rw-r--r--src/gui/graphicsview/qgraphicsitem.h1
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp7
-rw-r--r--src/gui/graphicsview/qgraphicsscene_bsp.cpp11
-rw-r--r--src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp21
4 files changed, 22 insertions, 18 deletions
diff --git a/src/gui/graphicsview/qgraphicsitem.h b/src/gui/graphicsview/qgraphicsitem.h
index 12dcad2..48fb5c3 100644
--- a/src/gui/graphicsview/qgraphicsitem.h
+++ b/src/gui/graphicsview/qgraphicsitem.h
@@ -434,6 +434,7 @@ private:
friend class QGraphicsScene;
friend class QGraphicsScenePrivate;
friend class QGraphicsSceneFindItemBspTreeVisitor;
+ friend class QGraphicsSceneBspTree;
friend class QGraphicsView;
friend class QGraphicsViewPrivate;
friend class QGraphicsWidget;
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 7c46598..f1e56c1 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -1097,8 +1097,11 @@ QList<QGraphicsItem *> QGraphicsScenePrivate::topLevelItemsInStackingOrder(const
QList<QGraphicsItem *> tmp = index->estimateItems(sceneRect, Qt::SortOrder(-1),
viewTransform ? *viewTransform : QTransform());
- for (int i = 0; i < tmp.size(); ++i)
- tmp.at(i)->topLevelItem()->d_ptr->itemDiscovered = 1;
+ for (int i = 0; i < tmp.size(); ++i) {
+ QGraphicsItem *item = tmp.at(i);
+ if (!item->d_ptr->parent)
+ item->d_ptr->itemDiscovered = 1;
+ }
// Sort if the toplevel list is unsorted.
if (needSortTopLevelItems) {
diff --git a/src/gui/graphicsview/qgraphicsscene_bsp.cpp b/src/gui/graphicsview/qgraphicsscene_bsp.cpp
index eaeec54..5858eab 100644
--- a/src/gui/graphicsview/qgraphicsscene_bsp.cpp
+++ b/src/gui/graphicsview/qgraphicsscene_bsp.cpp
@@ -148,6 +148,9 @@ QList<QGraphicsItem *> QGraphicsSceneBspTree::items(const QRectF &rect) const
QList<QGraphicsItem *> tmp;
findVisitor->foundItems = &tmp;
climbTree(findVisitor, rect);
+ // Reset discovery bits.
+ for (int i = 0; i < tmp.size(); ++i)
+ tmp.at(i)->d_ptr->itemDiscovered = 0;
return tmp;
}
@@ -156,6 +159,9 @@ QList<QGraphicsItem *> QGraphicsSceneBspTree::items(const QPointF &pos) const
QList<QGraphicsItem *> tmp;
findVisitor->foundItems = &tmp;
climbTree(findVisitor, pos);
+ // Reset discovery bits.
+ for (int i = 0; i < tmp.size(); ++i)
+ tmp.at(i)->d_ptr->itemDiscovered = 0;
return tmp;
}
@@ -241,7 +247,7 @@ void QGraphicsSceneBspTree::climbTree(QGraphicsSceneBspTreeVisitor *visitor, con
return;
const Node &node = nodes.at(index);
- int childIndex = firstChildIndex(index);
+ const int childIndex = firstChildIndex(index);
switch (node.type) {
case Node::Leaf: {
@@ -271,7 +277,7 @@ void QGraphicsSceneBspTree::climbTree(QGraphicsSceneBspTreeVisitor *visitor, con
return;
const Node &node = nodes.at(index);
- int childIndex = firstChildIndex(index);
+ const int childIndex = firstChildIndex(index);
switch (node.type) {
case Node::Leaf: {
@@ -288,7 +294,6 @@ void QGraphicsSceneBspTree::climbTree(QGraphicsSceneBspTreeVisitor *visitor, con
}
break;
case Node::Horizontal:
- int childIndex = firstChildIndex(index);
if (rect.top() < node.offset) {
climbTree(visitor, rect, childIndex);
if (rect.bottom() >= node.offset)
diff --git a/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp b/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp
index 3efc742..44a0082 100644
--- a/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp
+++ b/src/gui/graphicsview/qgraphicsscenebsptreeindex.cpp
@@ -130,7 +130,7 @@ void QGraphicsSceneBspTreeIndexPrivate::_q_updateIndex()
// Add unindexedItems to indexedItems
for (int i = 0; i < unindexedItems.size(); ++i) {
if (QGraphicsItem *item = unindexedItems.at(i)) {
- item->d_ptr->itemDiscovered = 0;
+ Q_ASSERT(!item->d_ptr->itemDiscovered);
if (!freeItemIndexes.isEmpty()) {
int freeIndex = freeItemIndexes.takeFirst();
item->d_func()->index = freeIndex;
@@ -224,7 +224,7 @@ void QGraphicsSceneBspTreeIndexPrivate::resetIndex()
for (int i = 0; i < indexedItems.size(); ++i) {
if (QGraphicsItem *item = indexedItems.at(i)) {
item->d_ptr->index = -1;
- item->d_ptr->itemDiscovered = 0;
+ Q_ASSERT(!item->d_ptr->itemDiscovered);
unindexedItems << item;
}
}
@@ -339,10 +339,10 @@ void QGraphicsSceneBspTreeIndexPrivate::removeItem(QGraphicsItem *item, bool rec
if (item->d_ptr->index != -1) {
Q_ASSERT(item->d_ptr->index < indexedItems.size());
Q_ASSERT(indexedItems.at(item->d_ptr->index) == item);
+ Q_ASSERT(!item->d_ptr->itemDiscovered);
freeItemIndexes << item->d_ptr->index;
indexedItems[item->d_ptr->index] = 0;
item->d_ptr->index = -1;
- item->d_ptr->itemDiscovered = 0;
if (item->d_ptr->itemIsUntransformable()) {
untransformableItems.removeOne(item);
@@ -481,8 +481,8 @@ void QGraphicsSceneBspTreeIndex::clear()
for (int i = 0; i < d->indexedItems.size(); ++i) {
// Ensure item bits are reset properly.
if (QGraphicsItem *item = d->indexedItems.at(i)) {
+ Q_ASSERT(!item->d_ptr->itemDiscovered);
item->d_ptr->index = -1;
- item->d_ptr->itemDiscovered = 0;
}
}
d->indexedItems.clear();
@@ -547,25 +547,20 @@ QList<QGraphicsItem *> QGraphicsSceneBspTreeIndex::estimateItems(const QRectF &r
Q_UNUSED(deviceTransform);
QList<QGraphicsItem *> rectItems = d->bsp.items(rect);
+
// Fill in with any unindexed items
for (int i = 0; i < d->unindexedItems.size(); ++i) {
if (QGraphicsItem *item = d->unindexedItems.at(i)) {
- if (!item->d_ptr->itemDiscovered && item->d_ptr->visible && !(item->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren)) {
+ if (item->d_ptr->visible
+ && !(item->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorClipsChildren)) {
QRectF boundingRect = item->sceneBoundingRect();
- if (QRectF_intersects(boundingRect, rect)) {
- item->d_ptr->itemDiscovered = 1;
+ if (QRectF_intersects(boundingRect, rect))
rectItems << item;
- }
}
}
}
- // Reset the discovered state of all discovered items
- for (int i = 0; i < rectItems.size(); ++i)
- rectItems.at(i)->d_func()->itemDiscovered = 0;
-
rectItems += d->untransformableItems;
-
d->sortItems(&rectItems, order, d->sortCacheEnabled);
return rectItems;