]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontainer.cpp
Utilize ecm_set_deprecation_versions to exclude deprecated API
[dolphin.git] / src / kitemviews / kitemlistcontainer.cpp
index c1eae53bd6a8c628cefe917c5859be572d7bd939..10b9f1415c95f6064aa95daca68651287d948706 100644 (file)
@@ -1,38 +1,23 @@
-/***************************************************************************
- *   Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com>             *
- *                                                                         *
- *   Based on the Itemviews NG project from Trolltech Labs:                *
- *   http://qt.gitorious.org/qt-labs/itemviews-ng                          *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
- ***************************************************************************/
+/*
+ * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
+ *
+ * Based on the Itemviews NG project from Trolltech Labs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
 
 #include "kitemlistcontainer.h"
 
 #include "kitemlistcontroller.h"
 #include "kitemlistview.h"
-#include "kitemmodelbase.h"
-
 #include "private/kitemlistsmoothscroller.h"
 
 #include <QApplication>
+#include <QFontMetrics>
 #include <QGraphicsScene>
 #include <QGraphicsView>
 #include <QScrollBar>
-#include <QStyle>
+#include <QScroller>
 #include <QStyleOption>
 
 /**
@@ -70,7 +55,8 @@ KItemListContainer::KItemListContainer(KItemListController* controller, QWidget*
     QAbstractScrollArea(parent),
     m_controller(controller),
     m_horizontalSmoothScroller(nullptr),
-    m_verticalSmoothScroller(nullptr)
+    m_verticalSmoothScroller(nullptr),
+    m_scroller(nullptr)
 {
     Q_ASSERT(controller);
     controller->setParent(this);
@@ -92,6 +78,13 @@ KItemListContainer::KItemListContainer(KItemListController* controller, QWidget*
             this, &KItemListContainer::slotModelChanged);
     connect(controller, &KItemListController::viewChanged,
             this, &KItemListContainer::slotViewChanged);
+
+    m_scroller = QScroller::scroller(viewport());
+    m_scroller->grabGesture(viewport());
+    connect(controller, &KItemListController::scrollerStop,
+            this, &KItemListContainer::stopScroller);
+    connect(m_scroller, &QScroller::stateChanged,
+            controller, &KItemListController::slotStateChanged);
 }
 
 KItemListContainer::~KItemListContainer()
@@ -179,8 +172,8 @@ void KItemListContainer::wheelEvent(QWheelEvent* event)
         return;
     }
 
-    const bool scrollHorizontally = (event->orientation() == Qt::Horizontal) ||
-                                    (event->orientation() == Qt::Vertical && !verticalScrollBar()->isVisible());
+    const bool scrollHorizontally = (qAbs(event->angleDelta().y()) < qAbs(event->angleDelta().x())) ||
+                                    (!verticalScrollBar()->isVisible());
     KItemListSmoothScroller* smoothScroller = scrollHorizontally ?
                                               m_horizontalSmoothScroller : m_verticalSmoothScroller;
 
@@ -189,14 +182,14 @@ void KItemListContainer::wheelEvent(QWheelEvent* event)
 
 void KItemListContainer::slotScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
 {
-    Q_UNUSED(previous);
+    Q_UNUSED(previous)
     updateSmoothScrollers(current);
 }
 
 void KItemListContainer::slotModelChanged(KItemModelBase* current, KItemModelBase* previous)
 {
-    Q_UNUSED(current);
-    Q_UNUSED(previous);
+    Q_UNUSED(current)
+    Q_UNUSED(previous)
 }
 
 void KItemListContainer::slotViewChanged(KItemListView* current, KItemListView* previous)
@@ -215,6 +208,8 @@ void KItemListContainer::slotViewChanged(KItemListView* current, KItemListView*
         disconnect(previous, &KItemListView::maximumItemOffsetChanged,
                    this, &KItemListContainer::updateItemOffsetScrollBar);
         disconnect(previous, &KItemListView::scrollTo, this, &KItemListContainer::scrollTo);
+        disconnect(m_horizontalSmoothScroller, &KItemListSmoothScroller::scrollingStopped, previous, &KItemListView::scrollingStopped);
+        disconnect(m_verticalSmoothScroller, &KItemListSmoothScroller::scrollingStopped, previous, &KItemListView::scrollingStopped);
         m_horizontalSmoothScroller->setTargetObject(nullptr);
         m_verticalSmoothScroller->setTargetObject(nullptr);
     }
@@ -231,6 +226,9 @@ void KItemListContainer::slotViewChanged(KItemListView* current, KItemListView*
         connect(current, &KItemListView::maximumItemOffsetChanged,
                 this, &KItemListContainer::updateItemOffsetScrollBar);
         connect(current, &KItemListView::scrollTo, this, &KItemListContainer::scrollTo);
+        connect(m_horizontalSmoothScroller, &KItemListSmoothScroller::scrollingStopped, current, &KItemListView::scrollingStopped);
+        connect(m_verticalSmoothScroller, &KItemListSmoothScroller::scrollingStopped, current, &KItemListView::scrollingStopped);
+
         m_horizontalSmoothScroller->setTargetObject(current);
         m_verticalSmoothScroller->setTargetObject(current);
         updateSmoothScrollers(current->scrollOrientation());
@@ -264,7 +262,14 @@ void KItemListContainer::updateScrollOffsetScrollBar()
     if (view->scrollOrientation() == Qt::Vertical) {
         smoothScroller = m_verticalSmoothScroller;
         scrollOffsetScrollBar = verticalScrollBar();
-        singleStep = view->itemSizeHint().height();
+
+        // Don't scroll super fast when using a wheel mouse:
+        // We want to consider one "line" to be the text label which has a
+        // roughly fixed height rather than using the height of the icon which
+        // may be very tall
+        const QFontMetrics metrics(font());
+        singleStep = metrics.height() * QApplication::wheelScrollLines();
+
         // We cannot use view->size().height() because this height might
         // include the header widget, which is not part of the scrolled area.
         pageStep = view->verticalPageStep();
@@ -334,6 +339,11 @@ void KItemListContainer::updateItemOffsetScrollBar()
     }
 }
 
+void KItemListContainer::stopScroller()
+{
+    m_scroller->stop();
+}
+
 void KItemListContainer::updateGeometries()
 {
     QRect rect = geometry();