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
This commit is contained in:
Martin T. H. Sandsmark 2016-07-13 00:29:15 +02:00
parent 4fad4405a7
commit f688bcd1f1
3 changed files with 11 additions and 48 deletions

View file

@ -185,27 +185,7 @@ void KItemListContainer::wheelEvent(QWheelEvent* event)
KItemListSmoothScroller* smoothScroller = scrollHorizontally ? KItemListSmoothScroller* smoothScroller = scrollHorizontally ?
m_horizontalSmoothScroller : m_verticalSmoothScroller; m_horizontalSmoothScroller : m_verticalSmoothScroller;
const QScrollBar* scrollBar = smoothScroller->scrollBar(); smoothScroller->handleWheelEvent(event);
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();
} }
void KItemListContainer::slotScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous) void KItemListContainer::slotScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)

View file

@ -172,8 +172,7 @@ bool KItemListSmoothScroller::eventFilter(QObject* obj, QEvent* event)
break; break;
case QEvent::Wheel: case QEvent::Wheel:
handleWheelEvent(static_cast<QWheelEvent*>(event)); return false; // we're the ones sending them
return true; // eat event so that QScrollBar does not scroll one step more by itself
default: default:
break; break;
@ -196,25 +195,11 @@ void KItemListSmoothScroller::handleWheelEvent(QWheelEvent* event)
const bool previous = m_smoothScrolling; const bool previous = m_smoothScrolling;
m_smoothScrolling = true; m_smoothScrolling = true;
int numPixels;
if (!event->pixelDelta().isNull()) { QWheelEvent copy = *event;
numPixels = event->pixelDelta().y(); QApplication::sendEvent(m_scrollBar, &copy);
} else { event->setAccepted(copy.isAccepted());
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; m_smoothScrolling = previous;
event->accept();
} }

View file

@ -77,6 +77,11 @@ public:
// stable. // stable.
bool requestScrollBarUpdate(int newMaximum); bool requestScrollBarUpdate(int newMaximum);
/**
* Forwards wheel events to the scrollbar, ensuring smooth and proper scrolling
*/
void handleWheelEvent(QWheelEvent* event);
protected: protected:
virtual bool eventFilter(QObject* obj, QEvent* event); virtual bool eventFilter(QObject* obj, QEvent* event);
@ -84,13 +89,6 @@ private slots:
void slotAnimationStateChanged(QAbstractAnimation::State newState, void slotAnimationStateChanged(QAbstractAnimation::State newState,
QAbstractAnimation::State oldState); 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: private:
bool m_scrollBarPressed; bool m_scrollBarPressed;
bool m_smoothScrolling; bool m_smoothScrolling;