summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJani Honkonen <jani.honkonen@digia.com>2012-08-01 14:55:51 +0300
committerQt by Nokia <qt-info@nokia.com>2012-08-19 08:51:57 +0200
commitd4385e48b8566a5587048a3c6d8b2396ba587ed5 (patch)
tree63f0a0d5ddf344025d4b1eb3381334599a3b808c /src
parentf20472efa7e4a80b5aa1df3b98778b92cf339220 (diff)
Fix QListWidget scrolling with keys when there are hidden items
If the selected item is scrolled with keyboard keys the selected item will go outside the visible area. The scrolling did not take hidden items into account when calculating the amount to be scrolled. Task-number: QTBUG-21804 Change-Id: I63da0248cec43be464898f9dc8167e739f00ccd0 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/widgets/itemviews/qlistview.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp
index 14c6172869..11ef2430f8 100644
--- a/src/widgets/itemviews/qlistview.cpp
+++ b/src/widgets/itemviews/qlistview.cpp
@@ -2533,13 +2533,21 @@ int QListModeViewBase::perItemScrollToValue(int index, int scrollValue, int view
{
if (index < 0)
return scrollValue;
+
+ QVector<int> visibleFlowPositions;
+ visibleFlowPositions.reserve(flowPositions.count() - 1);
+ for (int i = 0; i < flowPositions.count() - 1; i++) { // flowPositions count is +1 larger than actual row count
+ if (!isHidden(i))
+ visibleFlowPositions.append(flowPositions.at(i));
+ }
+
if (!wrap) {
int topIndex = index;
const int bottomIndex = topIndex;
- const int bottomCoordinate = flowPositions.at(index);
+ const int bottomCoordinate = visibleFlowPositions.at(index);
while (topIndex > 0 &&
- (bottomCoordinate - flowPositions.at(topIndex-1) + itemExtent) <= (viewportSize)) {
+ (bottomCoordinate - visibleFlowPositions.at(topIndex - 1) + itemExtent) <= (viewportSize)) {
topIndex--;
}
@@ -2559,7 +2567,7 @@ int QListModeViewBase::perItemScrollToValue(int index, int scrollValue, int view
? Qt::Horizontal : Qt::Vertical);
if (flowOrientation == orientation) { // scrolling in the "flow" direction
// ### wrapped scrolling in the flow direction
- return flowPositions.at(index); // ### always pixel based for now
+ return visibleFlowPositions.at(index); // ### always pixel based for now
} else if (!segmentStartRows.isEmpty()) { // we are scrolling in the "segment" direction
int segment = qBinarySearch<int>(segmentStartRows, index, 0, segmentStartRows.count() - 1);
int leftSegment = segment;