mirror of
https://invent.kde.org/system/dolphin
synced 2024-11-05 18:47:12 +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:
parent
4fad4405a7
commit
f688bcd1f1
3 changed files with 11 additions and 48 deletions
|
@ -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)
|
||||||
|
|
|
@ -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, ©);
|
||||||
} 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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue