X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/5360bc3ab328c8b1161b0c5df9c5785829a3e880..0464ea82a6850f58805bc4d6fc1df5369d83c3df:/src/kitemviews/private/kitemlistsmoothscroller.cpp diff --git a/src/kitemviews/private/kitemlistsmoothscroller.cpp b/src/kitemviews/private/kitemlistsmoothscroller.cpp index 6b475b5f0..14a280e33 100644 --- a/src/kitemviews/private/kitemlistsmoothscroller.cpp +++ b/src/kitemviews/private/kitemlistsmoothscroller.cpp @@ -6,31 +6,36 @@ #include "kitemlistsmoothscroller.h" +#include +#include + #include +#include #include #include #include #include -KItemListSmoothScroller::KItemListSmoothScroller(QScrollBar* scrollBar, - QObject* parent) : - QObject(parent), - m_scrollBarPressed(false), - m_smoothScrolling(true), - m_scrollBar(scrollBar), - m_animation(nullptr) +KItemListSmoothScroller::KItemListSmoothScroller(QScrollBar *scrollBar, QObject *parent) + : QObject(parent) + , m_scrollBarPressed(false) + , m_smoothScrolling(true) + , m_scrollBar(scrollBar) + , m_animation(nullptr) { m_animation = new QPropertyAnimation(this); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - const int animationDuration = m_scrollBar->style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, m_scrollBar); - const bool animationEnabled = (animationDuration > 0); - #else - const int animationDuration = 100; - const bool animationEnabled = m_scrollBar->style()->styleHint(QStyle::SH_Widget_Animate, nullptr, m_scrollBar); -#endif - m_animation->setDuration(animationEnabled ? animationDuration : 1); - connect(m_animation, &QPropertyAnimation::stateChanged, - this, &KItemListSmoothScroller::slotAnimationStateChanged); + + KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::IncludeGlobals); + KConfigGroup configGroup(globalConfig, QStringLiteral("KDE")); + updateAnimationDuration(configGroup.readEntry("SmoothScroll", true)); + + QDBusConnection::sessionBus().connect(QString(), + QStringLiteral("/SmoothScroll"), + QStringLiteral("org.kde.SmoothScroll"), + QStringLiteral("notifyChange"), + this, + SLOT(updateAnimationDuration(bool))); + connect(m_animation, &QPropertyAnimation::stateChanged, this, &KItemListSmoothScroller::slotAnimationStateChanged); m_scrollBar->installEventFilter(this); } @@ -44,23 +49,29 @@ void KItemListSmoothScroller::setScrollBar(QScrollBar *scrollBar) m_scrollBar = scrollBar; } -QScrollBar* KItemListSmoothScroller::scrollBar() const +QScrollBar *KItemListSmoothScroller::scrollBar() const { return m_scrollBar; } -void KItemListSmoothScroller::setTargetObject(QObject* target) +void KItemListSmoothScroller::setTargetObject(QObject *target) { + if (m_animation->state() == QAbstractAnimation::Running) { + m_animation->stop(); + } m_animation->setTargetObject(target); } -QObject* KItemListSmoothScroller::targetObject() const +QObject *KItemListSmoothScroller::targetObject() const { return m_animation->targetObject(); } -void KItemListSmoothScroller::setPropertyName(const QByteArray& propertyName) +void KItemListSmoothScroller::setPropertyName(const QByteArray &propertyName) { + if (m_animation->state() == QAbstractAnimation::Running) { + m_animation->stop(); + } m_animation->setPropertyName(propertyName); } @@ -71,7 +82,7 @@ QByteArray KItemListSmoothScroller::propertyName() const void KItemListSmoothScroller::scrollContentsBy(qreal distance) { - QObject* target = targetObject(); + QObject *target = targetObject(); if (!target) { return; } @@ -148,7 +159,7 @@ bool KItemListSmoothScroller::requestScrollBarUpdate(int newMaximum) return true; } -bool KItemListSmoothScroller::eventFilter(QObject* obj, QEvent* event) +bool KItemListSmoothScroller::eventFilter(QObject *obj, QEvent *event) { Q_ASSERT(obj == m_scrollBar); @@ -173,25 +184,48 @@ bool KItemListSmoothScroller::eventFilter(QObject* obj, QEvent* event) return QObject::eventFilter(obj, event); } -void KItemListSmoothScroller::slotAnimationStateChanged(QAbstractAnimation::State newState, - QAbstractAnimation::State oldState) +void KItemListSmoothScroller::slotAnimationStateChanged(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) { Q_UNUSED(oldState) if (newState == QAbstractAnimation::Stopped && m_smoothScrolling && !m_scrollBarPressed) { m_smoothScrolling = false; } + if (newState == QAbstractAnimation::Stopped) { + Q_EMIT scrollingStopped(); + } } -void KItemListSmoothScroller::handleWheelEvent(QWheelEvent* event) +void KItemListSmoothScroller::updateAnimationDuration(bool isSmoothScrollingEnabled) +{ + if (isSmoothScrollingEnabled) { + // Breeze sets SH_Widget_Animation_Duration from the KDE global animation speed setting + const int animationDuration = m_scrollBar->style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, m_scrollBar); + const bool animationEnabled = (animationDuration > 0); + m_animation->setDuration(animationEnabled ? animationDuration : 1); + } else { + m_animation->setDuration(1); + } +} + +void KItemListSmoothScroller::handleWheelEvent(QWheelEvent *event) { const bool previous = m_smoothScrolling; m_smoothScrolling = true; - QWheelEvent copy = *event; - QApplication::sendEvent(m_scrollBar, ©); - event->setAccepted(copy.isAccepted()); + QWheelEvent *copy = event->clone(); + QApplication::sendEvent(m_scrollBar, copy); + event->setAccepted(copy->isAccepted()); m_smoothScrolling = previous; } +bool KItemListSmoothScroller::isAnimating() +{ + if (m_animation) { + return (m_animation->state() == QAbstractAnimation::Running); + } + return false; +} + +#include "moc_kitemlistsmoothscroller.cpp"