]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/private/kitemlistsmoothscroller.cpp
Merge branch 'Applications/15.08'
[dolphin.git] / src / kitemviews / private / kitemlistsmoothscroller.cpp
index 491461b806bc438bbac6cc11e03cc0ddb7bcc943..2bd467aa53833ea3d4e436dde4c7cc7597a56b01 100644 (file)
 
 #include "kitemlistsmoothscroller.h"
 
-#include <KGlobalSettings>
 #include <QEvent>
 #include <QPropertyAnimation>
 #include <QScrollBar>
 #include <QWheelEvent>
-
-#include <KDebug>
+#include <QStyle>
 
 KItemListSmoothScroller::KItemListSmoothScroller(QScrollBar* scrollBar,
                                                  QObject* parent) :
@@ -36,10 +34,10 @@ KItemListSmoothScroller::KItemListSmoothScroller(QScrollBar* scrollBar,
     m_animation(0)
 {
     m_animation = new QPropertyAnimation(this);
-    const int duration = (KGlobalSettings::graphicEffectsLevel() == KGlobalSettings::NoEffects) ? 1 : 100;
+    const int duration = m_scrollBar->style()->styleHint(QStyle::SH_Widget_Animate, nullptr, m_scrollBar) ? 100 : 1;
     m_animation->setDuration(duration);
-    connect(m_animation, SIGNAL(stateChanged(QAbstractAnimation::State,QAbstractAnimation::State)),
-            this, SLOT(slotAnimationStateChanged(QAbstractAnimation::State,QAbstractAnimation::State)));
+    connect(m_animation, &QPropertyAnimation::stateChanged,
+            this, &KItemListSmoothScroller::slotAnimationStateChanged);
 
     m_scrollBar->installEventFilter(this);
 }
@@ -174,7 +172,7 @@ bool KItemListSmoothScroller::eventFilter(QObject* obj, QEvent* event)
 
     case QEvent::Wheel:
         handleWheelEvent(static_cast<QWheelEvent*>(event));
-        break;
+        return true; // eat event so that QScrollBar does not scroll one step more by itself
 
     default:
         break;
@@ -194,19 +192,28 @@ void KItemListSmoothScroller::slotAnimationStateChanged(QAbstractAnimation::Stat
 
 void KItemListSmoothScroller::handleWheelEvent(QWheelEvent* event)
 {
-    const int numDegrees = event->delta() / 8;
-    const int numSteps = numDegrees / 15;
-
     const bool previous = m_smoothScrolling;
 
     m_smoothScrolling = true;
-    const int value = m_scrollBar->value();
-    const int pageStep = m_scrollBar->pageStep();
-    m_scrollBar->setValue(value - numSteps * pageStep);
+    int numPixels;
+    if (!event->pixelDelta().isNull()) {
+        numPixels = event->pixelDelta().y();
+    } else {
+        const int numDegrees = event->angleDelta().y() / 8;
+        const int numSteps = numDegrees / 15;
+        numPixels = numSteps * m_scrollBar->pageStep() / 4;
+    }
+    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;
 
     event->accept();
 }
 
-#include "kitemlistsmoothscroller.moc"