┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin T. H. Sandsmark <[email protected]>2016-07-13 00:29:15 +0200
committerMartin T. H. Sandsmark <[email protected]>2016-07-16 18:47:02 +0200
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 69a0a5f27..6974ebb48 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 c89d3cf8f..6bfdba4c9 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 fca4b0c53..a3576a3fd 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;