summaryrefslogtreecommitdiffstats
path: root/src/gui/graphicsview/qgraphicsscene.cpp
diff options
context:
space:
mode:
authorAndreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com>2009-06-23 10:35:31 (GMT)
committerAndreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com>2009-06-23 12:29:56 (GMT)
commitbe79229e9c454764d63262f46f686b3e1721ee2c (patch)
tree30435b985928ee6fd6e738c51db6a7f2e7a4efb1 /src/gui/graphicsview/qgraphicsscene.cpp
parent375c4f53e9702aa3273154c0879e3b6dbd2723d6 (diff)
downloadQt-be79229e9c454764d63262f46f686b3e1721ee2c.zip
Qt-be79229e9c454764d63262f46f686b3e1721ee2c.tar.gz
Qt-be79229e9c454764d63262f46f686b3e1721ee2c.tar.bz2
More work on getting autotests to pass.
Diffstat (limited to 'src/gui/graphicsview/qgraphicsscene.cpp')
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 2f7ae04..6f92629 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -273,6 +273,7 @@ QGraphicsScenePrivate::QGraphicsScenePrivate()
index(0),
lastItemCount(0),
hasSceneRect(false),
+ dirtyGrowingItemsBoundingRect(true),
updateAll(false),
calledEmitUpdated(false),
processDirtyItemsEmitted(false),
@@ -378,8 +379,9 @@ void QGraphicsScenePrivate::unregisterTopLevelItem(QGraphicsItem *item)
*/
void QGraphicsScenePrivate::_q_updateLater()
{
+ QRectF null;
foreach (QGraphicsItem *item, pendingUpdateItems)
- item->update();
+ markDirty(item, null);
pendingUpdateItems.clear();
}
@@ -409,8 +411,11 @@ void QGraphicsScenePrivate::_q_processDirtyItems()
const bool wasPendingSceneUpdate = calledEmitUpdated;
const QRectF oldGrowingItemsBoundingRect = growingItemsBoundingRect;
processDirtyItemsRecursive(0);
- if (!hasSceneRect && oldGrowingItemsBoundingRect != growingItemsBoundingRect)
+ dirtyGrowingItemsBoundingRect = false;
+ if (oldGrowingItemsBoundingRect != growingItemsBoundingRect) {
+ index->sceneRectChanged();
emit q_func()->sceneRectChanged(growingItemsBoundingRect);
+ }
if (wasPendingSceneUpdate)
return;
@@ -1250,9 +1255,18 @@ QGraphicsScene::~QGraphicsScene()
QRectF QGraphicsScene::sceneRect() const
{
Q_D(const QGraphicsScene);
- /// ### Remove? The growing items bounding rect might be managed
- // by the scene.
- return d->index->indexedRect();
+ if (!d->hasSceneRect && d->dirtyGrowingItemsBoundingRect) {
+ // Lazily update the growing items bounding rect
+ QGraphicsScenePrivate *thatd = const_cast<QGraphicsScenePrivate *>(d);
+ QRectF oldGrowingBoundingRect = thatd->growingItemsBoundingRect;
+ thatd->growingItemsBoundingRect |= itemsBoundingRect();
+ thatd->dirtyGrowingItemsBoundingRect = false;
+ if (oldGrowingBoundingRect != thatd->growingItemsBoundingRect) {
+ thatd->index->sceneRectChanged();
+ emit const_cast<QGraphicsScene *>(this)->sceneRectChanged(thatd->growingItemsBoundingRect);
+ }
+ }
+ return d->hasSceneRect ? d->sceneRect : d->growingItemsBoundingRect;
}
void QGraphicsScene::setSceneRect(const QRectF &rect)
{
@@ -1260,8 +1274,8 @@ void QGraphicsScene::setSceneRect(const QRectF &rect)
if (rect != d->sceneRect) {
d->hasSceneRect = !rect.isNull();
d->sceneRect = rect;
- d->index->sceneRectChanged(rect);
- emit sceneRectChanged(rect);
+ d->index->sceneRectChanged();
+ emit sceneRectChanged(d->hasSceneRect ? rect : d->growingItemsBoundingRect);
}
}
@@ -1411,8 +1425,6 @@ void QGraphicsScene::setItemIndexMethod(ItemIndexMethod method)
d->index = new QGraphicsSceneLinearIndex(this);
for (int i = oldItems.size() - 1; i >= 0; --i)
d->index->addItem(oldItems.at(i));
-
- d->index->sceneRectChanged(d->sceneRect);
}
/*!
@@ -2057,6 +2069,8 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
if (d->pendingUpdateItems.isEmpty())
QMetaObject::invokeMethod(this, "_q_updateLater", Qt::QueuedConnection);
d->pendingUpdateItems << item;
+ } else {
+ d->dirtyGrowingItemsBoundingRect = true;
}
// Disable selectionChanged() for individual items
@@ -4235,6 +4249,7 @@ void QGraphicsScenePrivate::markDirty(QGraphicsItem *item, const QRectF &rect, b
bool removingItemFromScene)
{
Q_ASSERT(item);
+ dirtyGrowingItemsBoundingRect = true;
if (updateAll)
return;