1
0
mirror of https://invent.kde.org/system/dolphin synced 2024-07-07 10:51:45 +00:00

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 ?
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)

View 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);
QWheelEvent copy = *event;
QApplication::sendEvent(m_scrollBar, &copy);
event->setAccepted(copy.isAccepted());
m_smoothScrolling = previous;
event->accept();
}

View 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;