Commit 403de19d authored by Nate Graham's avatar Nate Graham
Browse files

Improve scroll wheel speed by basing it on label height, not icon height

Dolphin currently scrolls by the height of three items at a time per "step" when
using a scroll wheel. Because item height is highly variable, this leads to scroll
speed being inconsistent between views, and generally far too fast when using
icon view with icons larger than 22px size.

This patch makes the size of the scroll step based on the text label rather than the
icon size just like D25683, ensuring that the scroll speed does not vary and become
super fast when using large icons in particular.

It also reverts 90beb4a5, which is no longer needed.

BUG: 386379
FIXED-IN: 19.12.1

Test Plan:
Use a mouse with a scroll wheel and scroll in Dolphin item views with list view,
details view, icon view, etc, using different item sizes. Speed should be
consistent in all views now, and also feel consistent with other KDE apps.

Also try with multiple scale factors to make sure the behavior does not change.

No change with high-resolution two-finger touchpad scrolling.

Reviewers: #dolphin, elvisangelaccio

Reviewed By: #dolphin, elvisangelaccio

Subscribers: ahiemstra, lots0logs, anthonyfieroni, kfm-devel

Tags: #dolphin

Differential Revision:
parent 588965fe
......@@ -27,6 +27,7 @@
#include "private/kitemlistsmoothscroller.h"
#include <QApplication>
#include <QFontMetrics>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QScrollBar>
......@@ -261,7 +262,14 @@ void KItemListContainer::updateScrollOffsetScrollBar()
if (view->scrollOrientation() == Qt::Vertical) {
smoothScroller = m_verticalSmoothScroller;
scrollOffsetScrollBar = verticalScrollBar();
singleStep = view->itemSizeHint().height();
// Don't scroll super fast when using a wheel mouse:
// We want to consider one "line" to be the text label which has a
// roughly fixed height rather than using the height of the icon which
// may be very tall
const QFontMetrics metrics(font());
singleStep = metrics.height() * QApplication::wheelScrollLines();
// 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();
......@@ -335,11 +335,6 @@ QSizeF KItemListView::itemSize() const
return m_itemSize;
QSizeF KItemListView::itemSizeHint() const
return m_sizeHintResolver->minSizeHint();
const KItemListStyleOption& KItemListView::styleOption() const
return m_styleOption;
......@@ -158,11 +158,6 @@ public:
QSizeF itemSize() const;
* @return The size hint of all items. It is provided by the KItemListSizeHintResolver.
QSizeF itemSizeHint() const;
const KItemListStyleOption& styleOption() const;
void setGeometry(const QRectF& rect) override;
......@@ -24,7 +24,6 @@ KItemListSizeHintResolver::KItemListSizeHintResolver(const KItemListView* itemLi
......@@ -34,12 +33,6 @@ KItemListSizeHintResolver::~KItemListSizeHintResolver()
QSizeF KItemListSizeHintResolver::maxSizeHint()
return QSizeF(m_logicalWidthHint, m_logicalHeightHint);
QSizeF KItemListSizeHintResolver::minSizeHint()
......@@ -162,13 +155,6 @@ 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_minHeightHint = *std::min_element(m_logicalHeightHintCache.begin(), m_logicalHeightHintCache.end());
m_needsResolving = false;
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment