diff options
| author | Frank Reininghaus <[email protected]> | 2014-06-05 08:57:31 +0200 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2014-06-05 08:57:31 +0200 |
| commit | c12dc996f535f787ab828560068a2c8b7f98c5cf (patch) | |
| tree | 479d4363cd26849fc406641092196c4eaefc27b8 /src/kitemviews/private | |
| parent | 470e305be419646a3e1301cd9942be5f1ece58d9 (diff) | |
| parent | ea713e7a791e4685be6d3c22756d59cef91fa77a (diff) | |
Merge remote-tracking branch 'origin/master' into frameworks
Diffstat (limited to 'src/kitemviews/private')
| -rw-r--r-- | src/kitemviews/private/kitemlistsizehintresolver.cpp | 45 | ||||
| -rw-r--r-- | src/kitemviews/private/kitemlistsizehintresolver.h | 3 | ||||
| -rw-r--r-- | src/kitemviews/private/kitemlistviewlayouter.cpp | 7 |
3 files changed, 30 insertions, 25 deletions
diff --git a/src/kitemviews/private/kitemlistsizehintresolver.cpp b/src/kitemviews/private/kitemlistsizehintresolver.cpp index 029beddf9..1d8067026 100644 --- a/src/kitemviews/private/kitemlistsizehintresolver.cpp +++ b/src/kitemviews/private/kitemlistsizehintresolver.cpp @@ -23,7 +23,8 @@ KItemListSizeHintResolver::KItemListSizeHintResolver(const KItemListView* itemListView) : m_itemListView(itemListView), - m_sizeHintCache(), + m_logicalHeightHintCache(), + m_logicalWidthHint(0.0), m_needsResolving(false) { } @@ -35,7 +36,7 @@ KItemListSizeHintResolver::~KItemListSizeHintResolver() QSizeF KItemListSizeHintResolver::sizeHint(int index) { updateCache(); - return m_sizeHintCache.at(index); + return QSizeF(m_logicalWidthHint, m_logicalHeightHintCache.at(index)); } void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges) @@ -45,15 +46,15 @@ void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges) insertedCount += range.count; } - const int currentCount = m_sizeHintCache.count(); - m_sizeHintCache.reserve(currentCount + insertedCount); + const int currentCount = m_logicalHeightHintCache.count(); + m_logicalHeightHintCache.reserve(currentCount + insertedCount); // We build the new list from the end to the beginning to mimize the // number of moves. - m_sizeHintCache.insert(m_sizeHintCache.end(), insertedCount, QSizeF()); + m_logicalHeightHintCache.insert(m_logicalHeightHintCache.end(), insertedCount, 0.0); int sourceIndex = currentCount - 1; - int targetIndex = m_sizeHintCache.count() - 1; + int targetIndex = m_logicalHeightHintCache.count() - 1; int itemsToInsertBeforeCurrentRange = insertedCount; for (int rangeIndex = itemRanges.count() - 1; rangeIndex >= 0; --rangeIndex) { @@ -62,33 +63,33 @@ void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges) // First: move all existing items that must be put behind 'range'. while (targetIndex >= itemsToInsertBeforeCurrentRange + range.index + range.count) { - m_sizeHintCache[targetIndex] = m_sizeHintCache[sourceIndex]; + m_logicalHeightHintCache[targetIndex] = m_logicalHeightHintCache[sourceIndex]; --sourceIndex; --targetIndex; } // Then: insert QSizeF() for the items which are inserted into 'range'. while (targetIndex >= itemsToInsertBeforeCurrentRange + range.index) { - m_sizeHintCache[targetIndex] = QSizeF(); + m_logicalHeightHintCache[targetIndex] = 0.0; --targetIndex; } } m_needsResolving = true; - Q_ASSERT(m_sizeHintCache.count() == m_itemListView->model()->count()); + Q_ASSERT(m_logicalHeightHintCache.count() == m_itemListView->model()->count()); } void KItemListSizeHintResolver::itemsRemoved(const KItemRangeList& itemRanges) { - const QVector<QSizeF>::iterator begin = m_sizeHintCache.begin(); - const QVector<QSizeF>::iterator end = m_sizeHintCache.end(); + const QVector<qreal>::iterator begin = m_logicalHeightHintCache.begin(); + const QVector<qreal>::iterator end = m_logicalHeightHintCache.end(); KItemRangeList::const_iterator rangeIt = itemRanges.constBegin(); const KItemRangeList::const_iterator rangeEnd = itemRanges.constEnd(); - QVector<QSizeF>::iterator destIt = begin + rangeIt->index; - QVector<QSizeF>::iterator srcIt = destIt + rangeIt->count; + QVector<qreal>::iterator destIt = begin + rangeIt->index; + QVector<qreal>::iterator srcIt = destIt + rangeIt->count; ++rangeIt; @@ -104,33 +105,33 @@ void KItemListSizeHintResolver::itemsRemoved(const KItemRangeList& itemRanges) } } - m_sizeHintCache.erase(destIt, end); + m_logicalHeightHintCache.erase(destIt, end); // Note that the cache size might temporarily not match the model size if // this function is called from KItemListView::setModel() to empty the cache. - if (!m_sizeHintCache.isEmpty() && m_itemListView->model()) { - Q_ASSERT(m_sizeHintCache.count() == m_itemListView->model()->count()); + if (!m_logicalHeightHintCache.isEmpty() && m_itemListView->model()) { + Q_ASSERT(m_logicalHeightHintCache.count() == m_itemListView->model()->count()); } } void KItemListSizeHintResolver::itemsMoved(const KItemRange& range, const QList<int>& movedToIndexes) { - QVector<QSizeF> newSizeHintCache(m_sizeHintCache); + QVector<qreal> newLogicalHeightHintCache(m_logicalHeightHintCache); const int movedRangeEnd = range.index + range.count; for (int i = range.index; i < movedRangeEnd; ++i) { const int newIndex = movedToIndexes.at(i - range.index); - newSizeHintCache[newIndex] = m_sizeHintCache.at(i); + newLogicalHeightHintCache[newIndex] = m_logicalHeightHintCache.at(i); } - m_sizeHintCache = newSizeHintCache; + m_logicalHeightHintCache = newLogicalHeightHintCache; } void KItemListSizeHintResolver::itemsChanged(int index, int count, const QSet<QByteArray>& roles) { Q_UNUSED(roles); while (count) { - m_sizeHintCache[index] = QSizeF(); + m_logicalHeightHintCache[index] = 0.0; ++index; --count; } @@ -140,14 +141,14 @@ void KItemListSizeHintResolver::itemsChanged(int index, int count, const QSet<QB void KItemListSizeHintResolver::clearCache() { - m_sizeHintCache.fill(QSizeF()); + m_logicalHeightHintCache.fill(0.0); m_needsResolving = true; } void KItemListSizeHintResolver::updateCache() { if (m_needsResolving) { - m_itemListView->calculateItemSizeHints(m_sizeHintCache); + m_itemListView->calculateItemSizeHints(m_logicalHeightHintCache, m_logicalWidthHint); m_needsResolving = false; } } diff --git a/src/kitemviews/private/kitemlistsizehintresolver.h b/src/kitemviews/private/kitemlistsizehintresolver.h index 86580bf7b..a0ad033f3 100644 --- a/src/kitemviews/private/kitemlistsizehintresolver.h +++ b/src/kitemviews/private/kitemlistsizehintresolver.h @@ -48,7 +48,8 @@ public: private: const KItemListView* m_itemListView; - mutable QVector<QSizeF> m_sizeHintCache; + mutable QVector<qreal> m_logicalHeightHintCache; + mutable qreal m_logicalWidthHint; bool m_needsResolving; }; diff --git a/src/kitemviews/private/kitemlistviewlayouter.cpp b/src/kitemviews/private/kitemlistviewlayouter.cpp index 9da5384d4..04325c7d0 100644 --- a/src/kitemviews/private/kitemlistviewlayouter.cpp +++ b/src/kitemviews/private/kitemlistviewlayouter.cpp @@ -239,6 +239,7 @@ QRectF KItemListViewLayouter::itemRect(int index) const // to get the physical horizontal direction QPointF pos(y, x); pos.rx() -= m_scrollOffset; + sizeHint.transpose(); return QRectF(pos, sizeHint); } @@ -282,7 +283,9 @@ QRectF KItemListViewLayouter::groupHeaderRect(int index) const break; } - const qreal itemWidth = m_sizeHintResolver->sizeHint(index).width(); + const qreal itemWidth = (m_scrollOrientation == Qt::Vertical) + ? m_sizeHintResolver->sizeHint(index).width() + : m_sizeHintResolver->sizeHint(index).height(); if (itemWidth > headerWidth) { headerWidth = itemWidth; @@ -461,7 +464,7 @@ void KItemListViewLayouter::doLayout() while (index < itemCount && column < m_columnCount) { qreal requiredItemHeight = itemSize.height(); const QSizeF sizeHint = m_sizeHintResolver->sizeHint(index); - const qreal sizeHintHeight = horizontalScrolling ? sizeHint.width() : sizeHint.height(); + const qreal sizeHintHeight = sizeHint.height(); if (sizeHintHeight > requiredItemHeight) { requiredItemHeight = sizeHintHeight; } |
