]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix scrolling on hidpi screens
authorMartin T. H. Sandsmark <martin.sandsmark@kde.org>
Tue, 12 Jul 2016 22:29:15 +0000 (00:29 +0200)
committerMartin T. H. Sandsmark <martin.sandsmark@kde.org>
Sat, 16 Jul 2016 17:01:53 +0000 (19:01 +0200)
Scrolling with libinput was unbearably slow.

QScrollBar is much better at scrolling than us, so let it handle it.

REVIEW: 128432
BUG: 357618

src/kitemviews/kitemlistcontainer.cpp
src/kitemviews/private/kitemlistsmoothscroller.cpp
src/kitemviews/private/kitemlistsmoothscroller.h

index 69a0a5f27999d7f48a5b886d4b583470c2bb1508..6974ebb483ca55c5c678095686858f1a02cfb762 100644 (file)
@@ -185,27 +185,7 @@ void KItemListContainer::wheelEvent(QWheelEvent* event)
     KItemListSmoothScroller* smoothScroller = scrollHorizontally ?
                                               m_horizontalSmoothScroller : m_verticalSmoothScroller;
 
-    const QScrollBar* scrollBar = smoothScroller->scrollBar();
-    if (!event->pixelDelta().isNull()) {
-        const int numPixels =  event->pixelDelta().y();
-        if (event->modifiers().testFlag(Qt::ShiftModifier)) {
-            const int scrollingDirection = numPixels > 0 ? 1 : -1;
-            smoothScroller->scrollTo(scrollBar->value() - scrollBar->pageStep() * scrollingDirection);
-        } else {
-            smoothScroller->scrollTo(scrollBar->value() - numPixels);
-        }
-    } else {
-        const int numDegrees = event->angleDelta().y() / 8;
-        const int numSteps = qApp->wheelScrollLines() * numDegrees / 15;
-        if (event->modifiers().testFlag(Qt::ShiftModifier)) {
-            const int scrollingDirection = numSteps > 0 ? 1 : -1;
-            smoothScroller->scrollTo(scrollBar->value() - scrollBar->pageStep() * scrollingDirection);
-        } else {
-            smoothScroller->scrollTo(scrollBar->value() - numSteps * scrollBar->pageStep() / 12);
-        }
-    }
-
-    event->accept();
+    smoothScroller->handleWheelEvent(event);
 }
 
 void KItemListContainer::slotScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
index c89d3cf8f8d64d9e9f33d805b1b28764bd8ae573..6bfdba4c9ae5fbd911716e96c136685e7a5ee22e 100644 (file)
@@ -172,8 +172,7 @@ bool KItemListSmoothScroller::eventFilter(QObject* obj, QEvent* event)
         break;
 
     case QEvent::Wheel:
-        handleWheelEvent(static_cast<QWheelEvent*>(event));
-        return true; // eat event so that QScrollBar does not scroll one step more by itself
+        return false; // we're the ones sending them
 
     default:
         break;
@@ -196,25 +195,11 @@ void KItemListSmoothScroller::handleWheelEvent(QWheelEvent* event)
     const bool previous = m_smoothScrolling;
 
     m_smoothScrolling = true;
-    int numPixels;
-    if (!event->pixelDelta().isNull()) {
-        numPixels = event->pixelDelta().y();
-    } else {
-        const int numDegrees = event->angleDelta().y() / 8;
-        const int numSteps = qApp->wheelScrollLines() * numDegrees / 15;
-        numPixels = numSteps * m_scrollBar->pageStep() / 12;
-    }
-    int value = m_scrollBar->value();
-    if (event->modifiers().testFlag(Qt::ShiftModifier)) {
-        const int scrollingDirection = numPixels > 0 ? 1 : -1;
-        value -= m_scrollBar->pageStep() * scrollingDirection;
-    } else {
-        value -= numPixels;
-    }
-    m_scrollBar->setValue(value);
 
-    m_smoothScrolling = previous;
+    QWheelEvent copy = *event;
+    QApplication::sendEvent(m_scrollBar, &copy);
+    event->setAccepted(copy.isAccepted());
 
-    event->accept();
+    m_smoothScrolling = previous;
 }
 
index fca4b0c53be2d976369d0145d86d2f204af454ea..a3576a3fdddbc0874c6ff65ba6ff1557e48a0b21 100644 (file)
@@ -77,6 +77,11 @@ public:
     // stable.
     bool requestScrollBarUpdate(int newMaximum);
 
+    /**
+     * Forwards wheel events to the scrollbar, ensuring smooth and proper scrolling
+     */
+    void handleWheelEvent(QWheelEvent* event);
+
 protected:
     virtual bool eventFilter(QObject* obj, QEvent* event);
 
@@ -84,13 +89,6 @@ private slots:
     void slotAnimationStateChanged(QAbstractAnimation::State newState,
                                    QAbstractAnimation::State oldState);
 
-private:
-    /**
-     * Results into a smooth-scrolling of the target dependent on the direction
-     * of the wheel event.
-     */
-    void handleWheelEvent(QWheelEvent* event);
-
 private:
     bool m_scrollBarPressed;
     bool m_smoothScrolling;