]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Add support for Plasma's global smooth scrolling setting
authorNathan Misner <nathan@infochunk.com>
Fri, 5 Jul 2024 15:49:47 +0000 (15:49 +0000)
committerFelix Ernst <felixernst@kde.org>
Fri, 5 Jul 2024 15:49:47 +0000 (15:49 +0000)
KItemListSmoothScroller now checks whether smooth scrolling is enabled
globally and listens for any changes to the setting via DBus.

src/kitemviews/private/kitemlistsmoothscroller.cpp
src/kitemviews/private/kitemlistsmoothscroller.h

index 3e325b9342d4ae729baed9dc4a31d62e0bbedfeb..1fc452542ea7148951945ab9f17c6dd731e40efe 100644 (file)
@@ -6,7 +6,11 @@
 
 #include "kitemlistsmoothscroller.h"
 
+#include <KConfigGroup>
+#include <KSharedConfig>
+
 #include <QApplication>
+#include <QDBusConnection>
 #include <QPropertyAnimation>
 #include <QScrollBar>
 #include <QStyle>
@@ -20,9 +24,17 @@ KItemListSmoothScroller::KItemListSmoothScroller(QScrollBar *scrollBar, QObject
     , m_animation(nullptr)
 {
     m_animation = new QPropertyAnimation(this);
-    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);
+
+    KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::IncludeGlobals);
+    KConfigGroup configGroup(globalConfig, QStringLiteral("KDE"));
+    updateAnimationDuration(configGroup.readEntry("SmoothScroll", true));
+
+    QDBusConnection::sessionBus().connect(QStringLiteral(""),
+                                          QStringLiteral("/SmoothScroll"),
+                                          QStringLiteral("org.kde.SmoothScroll"),
+                                          QStringLiteral("notifyChange"),
+                                          this,
+                                          SLOT(updateAnimationDuration(bool)));
     connect(m_animation, &QPropertyAnimation::stateChanged, this, &KItemListSmoothScroller::slotAnimationStateChanged);
 
     m_scrollBar->installEventFilter(this);
@@ -177,6 +189,18 @@ void KItemListSmoothScroller::slotAnimationStateChanged(QAbstractAnimation::Stat
     }
 }
 
+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;
index d1cfcf9d99c3c0dd4d0d34ad58064f8578c95d15..32effa3d66c2d079b2046c27179ebe715e05e3fd 100644 (file)
@@ -79,6 +79,13 @@ protected:
 
 private Q_SLOTS:
     void slotAnimationStateChanged(QAbstractAnimation::State newState, QAbstractAnimation::State oldState);
+    /**
+     * Calculates the duration of the smooth scrolling animation.
+     * If \p isSmoothScrollingEnabled is true, the duration will be calculated
+     * using the widget animation duration from the current style. Otherwise,
+     * the animation will be instantaneous.
+     */
+    void updateAnimationDuration(bool isSmoothScrollingEnabled);
 
 private:
     bool m_scrollBarPressed;