- KItemListView* view = m_controller->view();
- if (!view) {
- return;
- }
-
- const QScrollBar* scrollBar = (view->scrollOrientation() == Qt::Vertical)
- ? verticalScrollBar() : horizontalScrollBar();
- const qreal currentOffset = view->scrollOffset();
- if (static_cast<int>(currentOffset) == scrollBar->value()) {
- // The current offset is already synchronous to the scrollbar
- return;
- }
-
- qreal offsetDiff = (view->scrollOrientation() == Qt::Vertical) ? dy : dx;
-
- const bool animRunning = (m_smoothScrollingAnimation->state() == QAbstractAnimation::Running);
- if (animRunning) {
- // Stopping a running animation means skipping the range from the current offset
- // until the target offset. To prevent skipping of the range the difference
- // is added to the new target offset.
- const qreal oldEndOffset = m_smoothScrollingAnimation->endValue().toReal();
- offsetDiff += (currentOffset - oldEndOffset);
- }
-
- const qreal endOffset = currentOffset - offsetDiff;
-
- if (m_smoothScrolling || animRunning) {
- qreal startOffset = currentOffset;
- if (animRunning) {
- // If the animation was running and has been interrupted by assigning a new end-offset
- // one frame must be added to the start-offset to keep the animation smooth. This also
- // assures that animation proceeds even in cases where new end-offset are triggered
- // within a very short timeslots.
- startOffset += (endOffset - currentOffset) * 1000 / (m_smoothScrollingAnimation->duration() * 60);
- }
-
- m_smoothScrollingAnimation->stop();
- m_smoothScrollingAnimation->setStartValue(startOffset);
- m_smoothScrollingAnimation->setEndValue(endOffset);
- m_smoothScrollingAnimation->setEasingCurve(animRunning ? QEasingCurve::OutQuad : QEasingCurve::InOutQuad);
- m_smoothScrollingAnimation->start();
- view->setScrollOffset(startOffset);
- } else {
- view->setScrollOffset(endOffset);
- }
-}
-
-bool KItemListContainer::eventFilter(QObject* obj, QEvent* event)
-{
- Q_ASSERT(obj == horizontalScrollBar() || obj == verticalScrollBar());
-
- // Check whether the scrollbar has been adjusted by a mouse-event
- // triggered by the user and remember this in m_scrollBarPressed.
- // The smooth scrolling will only get active if m_scrollBarPressed
- // is true (see scrollContentsBy()).
- const bool scrollVertical = (m_controller->view()->scrollOrientation() == Qt::Vertical);
- const bool checkEvent = ( scrollVertical && obj == verticalScrollBar()) ||
- (!scrollVertical && obj == horizontalScrollBar());
- if (checkEvent) {
- switch (event->type()) {
- case QEvent::MouseButtonPress:
- m_scrollBarPressed = true;
- m_smoothScrolling = true;
- break;
-
- case QEvent::MouseButtonRelease:
- m_scrollBarPressed = false;
- m_smoothScrolling = false;
- break;
-
- case QEvent::Wheel:
- wheelEvent(static_cast<QWheelEvent*>(event));
- break;
-
- default:
- break;
- }
- }
-
- return QAbstractScrollArea::eventFilter(obj, event);