]> cloud.milkyroute.net Git - dolphin.git/commitdiff
DolphinView: Conform to global scroll speed
authorAleksandr Borodetckii <glempi@protonmail.com>
Mon, 2 Jun 2025 01:01:06 +0000 (04:01 +0300)
committerAleksandr Borodetckii <glempi@protonmail.com>
Thu, 12 Jun 2025 09:27:56 +0000 (09:27 +0000)
One scroll with the mouse wheel is supposed to scroll the view by
QApplication::wheelScrollLines, however previous to this commit Dolphin
scrolled the view by QApplication::wheelScrollLines^2 instead, which
was wrong and way too much.

This commit fixes this by defining one line height as the height of the
current default font. This value is multiplied by
QApplication::wheelScrollLines to determine the scroll amount per mouse
wheel scroll.

In details view mode however, where there really are rows to go by,
this commit makes sure to always scroll by full rows. The number of
rows to scroll is determined by rounding up from the scroll amount used
in the other view modes.

Co-authored-by: Felix Ernst
src/kitemviews/kitemlistcontainer.cpp
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h
src/kitemviews/kstandarditemlistview.cpp
src/kitemviews/kstandarditemlistview.h

index 128140e2e4cdf88422676bae110b3371a44be9af..3ec56e5f10c57da4423ac4ade5f79f0682b8d06e 100644 (file)
@@ -286,7 +286,6 @@ void KItemListContainer::updateScrollOffsetScrollBar()
 
     KItemListSmoothScroller *smoothScroller = nullptr;
     QScrollBar *scrollOffsetScrollBar = nullptr;
-    int singleStep = 0;
     int pageStep = 0;
     int maximum = 0;
     if (view->scrollOrientation() == Qt::Vertical) {
@@ -296,13 +295,6 @@ void KItemListContainer::updateScrollOffsetScrollBar()
         }
         scrollOffsetScrollBar = verticalScrollBar();
 
-        // 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();
@@ -318,11 +310,11 @@ void KItemListContainer::updateScrollOffsetScrollBar()
             return;
         }
         scrollOffsetScrollBar = horizontalScrollBar();
-        singleStep = view->itemSize().width();
         pageStep = view->size().width();
         maximum = qMax(0, int(view->maximumScrollOffset() - view->size().width()));
     }
 
+    const int singleStep = view->scrollSingleStep();
     const int value = view->scrollOffset();
     if (smoothScroller->requestScrollBarUpdate(maximum)) {
         const bool updatePolicy = (scrollOffsetScrollBar->maximum() > 0 && maximum == 0) || horizontalScrollBarPolicy() == Qt::ScrollBarAlwaysOn;
index c56785c36f5af2c6099ae6404a11473fc4feae23..265e41e6ca3dfec63542e19bb91c45498d481608 100644 (file)
@@ -398,6 +398,12 @@ void KItemListView::setGeometry(const QRectF &rect)
     doLayout(NoAnimation);
 }
 
+qreal KItemListView::scrollSingleStep() const
+{
+    const QFontMetrics metrics(font());
+    return metrics.height();
+}
+
 qreal KItemListView::verticalPageStep() const
 {
     qreal headerHeight = 0;
index 7fb3344b472fce2a50094e98a256d1133b1185d8..1a4ff0df1c7bf9b280574f35810545c6d762121e 100644 (file)
@@ -175,6 +175,11 @@ public:
      */
     qreal verticalPageStep() const;
 
+    /**
+     * @return The line step which should be used for the scroll by mouse wheel.
+     */
+    virtual qreal scrollSingleStep() const;
+
     /**
      * @return Index of the item that is below the point \a pos.
      *         The position is relative to the upper right of
index a4e7c3edd37dcb4c37ecaf35f3903cad0488fded..0d57388f3a509b4b8e2b8151287f7fa691180f54 100644 (file)
@@ -4,6 +4,8 @@
  * SPDX-License-Identifier: GPL-2.0-or-later
  */
 
+#include <QApplication>
+
 #include "kstandarditemlistview.h"
 
 #include "kstandarditemlistwidget.h"
@@ -110,6 +112,17 @@ bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) c
     return layout == DetailsLayout;
 }
 
+qreal KStandardItemListView::scrollSingleStep() const
+{
+    if (itemLayout() == DetailsLayout) {
+        // We want each scroll in details view mode to move by some number of complete rows.
+        const int rowsPerFullScroll = qCeil((KItemListView::scrollSingleStep() * QApplication::wheelScrollLines()) / itemSize().height());
+        return (rowsPerFullScroll * itemSize().height()) / QApplication::wheelScrollLines();
+    }
+
+    return KItemListView::scrollSingleStep();
+}
+
 void KStandardItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
 {
     Q_UNUSED(current)
index 396383718636b481bbb1c2b852155d5f7db1863a..eb2f01d197b285415bef478e4fe9444ca3219eb6 100644 (file)
@@ -48,6 +48,7 @@ protected:
     /** To be overriden by sub-classes to specify when full row highlighting should be enabled. */
     virtual bool itemLayoutHighlightEntireRow(ItemLayout layout) const;
     virtual void onItemLayoutChanged(ItemLayout current, ItemLayout previous);
+    virtual qreal scrollSingleStep() const override;
     void onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous) override;
     void onSupportsItemExpandingChanged(bool supportsExpanding) override;
     void polishEvent() override;