summaryrefslogtreecommitdiffstats
path: root/src/declarative/graphicsitems
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2009-11-19 04:29:54 (GMT)
committerMartin Jones <martin.jones@nokia.com>2009-11-19 04:29:54 (GMT)
commitb044184888d45dd4f9d94574c4528867e13845ef (patch)
tree3e202930ea9133eabff81c8c48779e693dbe6495 /src/declarative/graphicsitems
parent08c45e83b05aa22b0d37a16aa01cbf5b3056bd15 (diff)
downloadQt-b044184888d45dd4f9d94574c4528867e13845ef.zip
Qt-b044184888d45dd4f9d94574c4528867e13845ef.tar.gz
Qt-b044184888d45dd4f9d94574c4528867e13845ef.tar.bz2
Fix GridView scrolling due to currentIndex changes. Add tests.
Diffstat (limited to 'src/declarative/graphicsitems')
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsgridview.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp
index 473f9e5..7e2d983 100644
--- a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp
@@ -1302,12 +1302,21 @@ void QmlGraphicsGridView::trackedPositionChanged()
if (!d->trackedItem)
return;
if (!isFlicking() && !d->moving && d->moveReason != QmlGraphicsGridViewPrivate::Mouse) {
- if (d->trackedItem->rowPos() < d->position()) {
- d->setPosition(d->trackedItem->rowPos());
- } else if (d->trackedItem->endRowPos() > d->position() + d->size()) {
- qreal pos = d->trackedItem->endRowPos() - d->size();
- if (d->rowSize() > d->size())
- pos = d->trackedItem->rowPos();
+ const qreal viewPos = d->position();
+ if (d->trackedItem->rowPos() < viewPos && d->currentItem->rowPos() < viewPos) {
+ d->setPosition(d->currentItem->rowPos() < d->trackedItem->rowPos() ? d->trackedItem->rowPos() : d->currentItem->rowPos());
+ } else if (d->trackedItem->endRowPos() > viewPos + d->size()
+ && d->currentItem->endRowPos() > viewPos + d->size()) {
+ qreal pos;
+ if (d->trackedItem->endRowPos() < d->currentItem->endRowPos()) {
+ pos = d->trackedItem->endRowPos() - d->size();
+ if (d->rowSize() > d->size())
+ pos = d->trackedItem->rowPos();
+ } else {
+ pos = d->currentItem->endRowPos() - d->size();
+ if (d->rowSize() > d->size())
+ pos = d->currentItem->rowPos();
+ }
d->setPosition(pos);
}
}