Merge branch 'Applications/16.12'

* Applications/16.12:
  Fix slow scrolling in dock panels
This commit is contained in:
Elvis Angelaccio 2016-11-20 13:04:47 +01:00
commit 4322ef4114
5 changed files with 27 additions and 2 deletions

View file

@ -265,7 +265,7 @@ void KItemListContainer::updateScrollOffsetScrollBar()
if (view->scrollOrientation() == Qt::Vertical) {
smoothScroller = m_verticalSmoothScroller;
scrollOffsetScrollBar = verticalScrollBar();
singleStep = view->itemSize().height();
singleStep = view->itemSizeHint().height();
// We cannot use view->size().height() because this height might
// include the header widget, which is not part of the scrolled area.
pageStep = view->verticalPageStep();

View file

@ -344,6 +344,11 @@ QSizeF KItemListView::itemSize() const
return m_itemSize;
}
QSizeF KItemListView::itemSizeHint() const
{
return m_sizeHintResolver->maxSizeHint();
}
const KItemListStyleOption& KItemListView::styleOption() const
{
return m_styleOption;

View file

@ -154,10 +154,15 @@ public:
/**
* @return The basic size of all items. The size of an item may be larger than
* the basic size (see KItemListView::itemSizeHint() and KItemListView::itemRect()).
* the basic size (see KItemListView::itemRect()).
*/
QSizeF itemSize() const;
/**
* @return The size hint of all items. It is provided by the KItemListSizeHintResolver.
*/
QSizeF itemSizeHint() const;
const KItemListStyleOption& styleOption() const;
virtual void setGeometry(const QRectF& rect) Q_DECL_OVERRIDE;

View file

@ -25,6 +25,7 @@ KItemListSizeHintResolver::KItemListSizeHintResolver(const KItemListView* itemLi
m_itemListView(itemListView),
m_logicalHeightHintCache(),
m_logicalWidthHint(0.0),
m_logicalHeightHint(0.0),
m_needsResolving(false)
{
}
@ -33,6 +34,12 @@ KItemListSizeHintResolver::~KItemListSizeHintResolver()
{
}
QSizeF KItemListSizeHintResolver::maxSizeHint()
{
updateCache();
return QSizeF(m_logicalWidthHint, m_logicalHeightHint);
}
QSizeF KItemListSizeHintResolver::sizeHint(int index)
{
updateCache();
@ -149,6 +156,12 @@ void KItemListSizeHintResolver::updateCache()
{
if (m_needsResolving) {
m_itemListView->calculateItemSizeHints(m_logicalHeightHintCache, m_logicalWidthHint);
// Set logical height as the max cached height (if the cache is not empty).
if (m_logicalHeightHintCache.isEmpty()) {
m_logicalHeightHint = 0.0;
} else {
m_logicalHeightHint = *std::max_element(m_logicalHeightHintCache.begin(), m_logicalHeightHintCache.end());
}
m_needsResolving = false;
}
}

View file

@ -36,6 +36,7 @@ class DOLPHIN_EXPORT KItemListSizeHintResolver
public:
KItemListSizeHintResolver(const KItemListView* itemListView);
virtual ~KItemListSizeHintResolver();
QSizeF maxSizeHint();
QSizeF sizeHint(int index);
void itemsInserted(const KItemRangeList& itemRanges);
@ -50,6 +51,7 @@ private:
const KItemListView* m_itemListView;
mutable QVector<qreal> m_logicalHeightHintCache;
mutable qreal m_logicalWidthHint;
mutable qreal m_logicalHeightHint;
bool m_needsResolving;
};