]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontainer.cpp
Merge branch 'Applications/16.04'
[dolphin.git] / src / kitemviews / kitemlistcontainer.cpp
index cd2fca1e1dc70cb5f844a647d68e8d547a4645b3..69a0a5f27999d7f48a5b886d4b583470c2bb1508 100644 (file)
 #include <QApplication>
 #include <QGraphicsScene>
 #include <QGraphicsView>
-#include <QPropertyAnimation>
 #include <QScrollBar>
 #include <QStyle>
 #include <QStyleOption>
 
-#include <KDebug>
 
 /**
  * Replaces the default viewport of KItemListContainer by a
@@ -45,6 +43,8 @@
  */
 class KItemListContainerViewport : public QGraphicsView
 {
+    Q_OBJECT
+
 public:
     KItemListContainerViewport(QGraphicsScene* scene, QWidget* parent);
 protected:
@@ -89,10 +89,10 @@ KItemListContainer::KItemListContainer(KItemListController* controller, QWidget*
         slotViewChanged(controller->view(), 0);
     }
 
-    connect(controller, SIGNAL(modelChanged(KItemModelBase*,KItemModelBase*)),
-            this, SLOT(slotModelChanged(KItemModelBase*,KItemModelBase*)));
-    connect(controller, SIGNAL(viewChanged(KItemListView*,KItemListView*)),
-            this, SLOT(slotViewChanged(KItemListView*,KItemListView*)));
+    connect(controller, &KItemListController::modelChanged,
+            this, &KItemListContainer::slotModelChanged);
+    connect(controller, &KItemListController::viewChanged,
+            this, &KItemListContainer::slotViewChanged);
 }
 
 KItemListContainer::~KItemListContainer()
@@ -185,11 +185,25 @@ void KItemListContainer::wheelEvent(QWheelEvent* event)
     KItemListSmoothScroller* smoothScroller = scrollHorizontally ?
                                               m_horizontalSmoothScroller : m_verticalSmoothScroller;
 
-    const int numDegrees = event->delta() / 8;
-    const int numSteps = numDegrees / 15;
-
     const QScrollBar* scrollBar = smoothScroller->scrollBar();
-    smoothScroller->scrollTo(scrollBar->value() - numSteps * scrollBar->pageStep() / 4);
+    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();
 }
@@ -211,23 +225,33 @@ void KItemListContainer::slotViewChanged(KItemListView* current, KItemListView*
     QGraphicsScene* scene = static_cast<QGraphicsView*>(viewport())->scene();
     if (previous) {
         scene->removeItem(previous);
-        disconnect(previous, SIGNAL(scrollOrientationChanged(Qt::Orientation,Qt::Orientation)), this, SLOT(slotScrollOrientationChanged(Qt::Orientation,Qt::Orientation)));
-        disconnect(previous, SIGNAL(scrollOffsetChanged(qreal,qreal)),        this, SLOT(updateScrollOffsetScrollBar()));
-        disconnect(previous, SIGNAL(maximumScrollOffsetChanged(qreal,qreal)), this, SLOT(updateScrollOffsetScrollBar()));
-        disconnect(previous, SIGNAL(itemOffsetChanged(qreal,qreal)),          this, SLOT(updateItemOffsetScrollBar()));
-        disconnect(previous, SIGNAL(maximumItemOffsetChanged(qreal,qreal)),   this, SLOT(updateItemOffsetScrollBar()));
-        disconnect(previous, SIGNAL(scrollTo(qreal)),                         this, SLOT(scrollTo(qreal)));
+        disconnect(previous, &KItemListView::scrollOrientationChanged,
+                   this, &KItemListContainer::slotScrollOrientationChanged);
+        disconnect(previous, &KItemListView::scrollOffsetChanged,
+                   this, &KItemListContainer::updateScrollOffsetScrollBar);
+        disconnect(previous, &KItemListView::maximumScrollOffsetChanged,
+                   this, &KItemListContainer::updateScrollOffsetScrollBar);
+        disconnect(previous, &KItemListView::itemOffsetChanged,
+                   this, &KItemListContainer::updateItemOffsetScrollBar);
+        disconnect(previous, &KItemListView::maximumItemOffsetChanged,
+                   this, &KItemListContainer::updateItemOffsetScrollBar);
+        disconnect(previous, &KItemListView::scrollTo, this, &KItemListContainer::scrollTo);
         m_horizontalSmoothScroller->setTargetObject(0);
         m_verticalSmoothScroller->setTargetObject(0);
     }
     if (current) {
         scene->addItem(current);
-        connect(current, SIGNAL(scrollOrientationChanged(Qt::Orientation,Qt::Orientation)), this, SLOT(slotScrollOrientationChanged(Qt::Orientation,Qt::Orientation)));
-        connect(current, SIGNAL(scrollOffsetChanged(qreal,qreal)),        this, SLOT(updateScrollOffsetScrollBar()));
-        connect(current, SIGNAL(maximumScrollOffsetChanged(qreal,qreal)), this, SLOT(updateScrollOffsetScrollBar()));
-        connect(current, SIGNAL(itemOffsetChanged(qreal,qreal)),          this, SLOT(updateItemOffsetScrollBar()));
-        connect(current, SIGNAL(maximumItemOffsetChanged(qreal,qreal)),   this, SLOT(updateItemOffsetScrollBar()));
-        connect(current, SIGNAL(scrollTo(qreal)),                         this, SLOT(scrollTo(qreal)));
+        connect(current, &KItemListView::scrollOrientationChanged,
+                this, &KItemListContainer::slotScrollOrientationChanged);
+        connect(current, &KItemListView::scrollOffsetChanged,
+                this, &KItemListContainer::updateScrollOffsetScrollBar);
+        connect(current, &KItemListView::maximumScrollOffsetChanged,
+                this, &KItemListContainer::updateScrollOffsetScrollBar);
+        connect(current, &KItemListView::itemOffsetChanged,
+                this, &KItemListContainer::updateItemOffsetScrollBar);
+        connect(current, &KItemListView::maximumItemOffsetChanged,
+                this, &KItemListContainer::updateItemOffsetScrollBar);
+        connect(current, &KItemListView::scrollTo, this, &KItemListContainer::scrollTo);
         m_horizontalSmoothScroller->setTargetObject(current);
         m_verticalSmoothScroller->setTargetObject(current);
         updateSmoothScrollers(current->scrollOrientation());
@@ -351,14 +375,15 @@ void KItemListContainer::updateGeometries()
                           ? extra + scrollbarSpacing + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
                           : extra;
 
-    rect.adjust(0, 0, -widthDec, -heightDec);
-
-    const QRectF newGeometry(0, 0, rect.width(), rect.height());
+    const QRectF newGeometry(0, 0, rect.width() - widthDec,
+                             rect.height() - heightDec);
     if (m_controller->view()->geometry() != newGeometry) {
         m_controller->view()->setGeometry(newGeometry);
 
-        static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(0, 0, rect.width(), rect.height());
-        static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
+        // Get the real geometry of the view again since the scrollbars
+        // visibilities and the view geometry may have changed in re-layout.
+        static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(m_controller->view()->geometry());
+        static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(m_controller->view()->geometry().toRect());
 
         updateScrollOffsetScrollBar();
         updateItemOffsetScrollBar();