diff options
| author | Peter Penz <[email protected]> | 2011-12-21 23:17:13 +0100 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-12-21 23:19:08 +0100 |
| commit | a63c476db23d76c61ede05006d155c2c192c7582 (patch) | |
| tree | d7df7a1d436b66215a924c1c97b9aec1d8b52318 | |
| parent | 677f94c80078aed63fa714f00f72f444060b2d8a (diff) | |
Fix first visible index calculation
When having a row with different item-heights, the calculation of the
first visible index might have been wrong.
| -rw-r--r-- | src/kitemviews/kitemlistviewlayouter.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/kitemviews/kitemlistviewlayouter.cpp b/src/kitemviews/kitemlistviewlayouter.cpp index f3c14f53d..8dbbb372a 100644 --- a/src/kitemviews/kitemlistviewlayouter.cpp +++ b/src/kitemviews/kitemlistviewlayouter.cpp @@ -441,21 +441,31 @@ void KItemListViewLayouter::updateVisibleIndexes() const int maxIndex = m_model->count() - 1; - // Calculate the first visible index that is (at least partly) visible + // Calculate the first visible index that is fully visible int min = 0; int max = maxIndex; int mid = 0; do { mid = (min + max) / 2; - if (m_itemRects[mid].bottom() < m_scrollOffset) { + if (m_itemRects[mid].top() < m_scrollOffset) { min = mid + 1; } else { max = mid - 1; } } while (min <= max); - while (mid < maxIndex && m_itemRects[mid].bottom() < m_scrollOffset) { - ++mid; + if (mid > 0) { + // Include the row before the first fully visible index, as it might + // be partly visible + if (m_itemRects[mid].top() >= m_scrollOffset) { + --mid; + Q_ASSERT(m_itemRects[mid].top() < m_scrollOffset); + } + + const qreal rowTop = m_itemRects[mid].top(); + while (mid > 0 && m_itemRects[mid - 1].top() == rowTop) { + --mid; + } } m_firstVisibleIndex = mid; |
