summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin T. H. Sandsmark <martin.sandsmark@kde.org>2016-07-12 22:29:15 (GMT)
committerMartin T. H. Sandsmark <martin.sandsmark@kde.org>2016-07-16 16:47:02 (GMT)
commitf688bcd1f14175f1624e2abcc6452882448467c0 (patch)
treee396225b381a3ed9680a5067b3d6481b88439605
parent4fad4405a719a43968f0ff5e99b169cd5a81df5c (diff)
Fix scrolling on hidpi screens
Scrolling with libinput was unbearably slow. QScrollBar is much better at scrolling than us, so let it handle it. REVIEW: 128432 BUG: 357618
-rw-r--r--src/kitemviews/kitemlistcontainer.cpp22
-rw-r--r--src/kitemviews/private/kitemlistsmoothscroller.cpp25
-rw-r--r--src/kitemviews/private/kitemlistsmoothscroller.h12
3 files changed, 11 insertions, 48 deletions
diff --git a/src/kitemviews/kitemlistcontainer.cpp b/src/kitemviews/kitemlistcontainer.cpp
index 69a0a5f..6974ebb 100644
--- a/src/kitemviews/kitemlistcontainer.cpp
+++ b/src/kitemviews/kitemlistcontainer.cpp
@@ -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)
diff --git a/src/kitemviews/private/kitemlistsmoothscroller.cpp b/src/kitemviews/private/kitemlistsmoothscroller.cpp
index c89d3cf..6bfdba4 100644
--- a/src/kitemviews/private/kitemlistsmoothscroller.cpp
+++ b/src/kitemviews/private/kitemlistsmoothscroller.cpp
@@ -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;
}
diff --git a/src/kitemviews/private/kitemlistsmoothscroller.h b/src/kitemviews/private/kitemlistsmoothscroller.h
index fca4b0c..a3576a3 100644
--- a/src/kitemviews/private/kitemlistsmoothscroller.h
+++ b/src/kitemviews/private/kitemlistsmoothscroller.h
@@ -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);
@@ -85,13 +90,6 @@ private slots:
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;
QScrollBar* m_scrollBar;