]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontainer.cpp
Fix includes
[dolphin.git] / src / kitemviews / kitemlistcontainer.cpp
index 5a485b62c3338c89fa1934a42cb7eee6a1a610ec..46ac4745e70fa6ab9c3825fe7e6b5f67ed7846e7 100644 (file)
@@ -31,7 +31,6 @@
 #include <QApplication>
 #include <QGraphicsScene>
 #include <QGraphicsView>
-#include <QPropertyAnimation>
 #include <QScrollBar>
 #include <QStyle>
 #include <QStyleOption>
@@ -67,8 +66,6 @@ void KItemListContainerViewport::wheelEvent(QWheelEvent* event)
     event->ignore();
 }
 
-
-
 KItemListContainer::KItemListContainer(KItemListController* controller, QWidget* parent) :
     QAbstractScrollArea(parent),
     m_controller(controller),
@@ -77,20 +74,32 @@ KItemListContainer::KItemListContainer(KItemListController* controller, QWidget*
 {
     Q_ASSERT(controller);
     controller->setParent(this);
-    initialize();
-}
 
-KItemListContainer::KItemListContainer(QWidget* parent) :
-    QAbstractScrollArea(parent),
-    m_controller(0),
-    m_horizontalSmoothScroller(0),
-    m_verticalSmoothScroller(0)
-{
-    initialize();
+    QGraphicsView* graphicsView = new KItemListContainerViewport(new QGraphicsScene(this), this);
+    setViewport(graphicsView);
+
+    m_horizontalSmoothScroller = new KItemListSmoothScroller(horizontalScrollBar(), this);
+    m_verticalSmoothScroller = new KItemListSmoothScroller(verticalScrollBar(), this);
+
+    if (controller->model()) {
+        slotModelChanged(controller->model(), 0);
+    }
+    if (controller->view()) {
+        slotViewChanged(controller->view(), 0);
+    }
+
+    connect(controller, &KItemListController::modelChanged,
+            this, &KItemListContainer::slotModelChanged);
+    connect(controller, &KItemListController::viewChanged,
+            this, &KItemListContainer::slotViewChanged);
 }
 
 KItemListContainer::~KItemListContainer()
 {
+    // Don't rely on the QObject-order to delete the controller, otherwise
+    // the QGraphicsScene might get deleted before the view.
+    delete m_controller;
+    m_controller = 0;
 }
 
 KItemListController* KItemListContainer::controller() const
@@ -98,6 +107,33 @@ KItemListController* KItemListContainer::controller() const
     return m_controller;
 }
 
+void KItemListContainer::setEnabledFrame(bool enable)
+{
+    QGraphicsView* graphicsView = qobject_cast<QGraphicsView*>(viewport());
+    if (enable) {
+        setFrameShape(QFrame::StyledPanel);
+        graphicsView->setPalette(palette());
+        graphicsView->viewport()->setAutoFillBackground(true);
+    } else {
+        setFrameShape(QFrame::NoFrame);
+        // Make the background of the container transparent and apply the window-text color
+        // to the text color, so that enough contrast is given for all color
+        // schemes
+        QPalette p = graphicsView->palette();
+        p.setColor(QPalette::Active,   QPalette::Text, p.color(QPalette::Active,   QPalette::WindowText));
+        p.setColor(QPalette::Inactive, QPalette::Text, p.color(QPalette::Inactive, QPalette::WindowText));
+        p.setColor(QPalette::Disabled, QPalette::Text, p.color(QPalette::Disabled, QPalette::WindowText));
+        graphicsView->setPalette(p);
+        graphicsView->viewport()->setAutoFillBackground(false);
+    }
+}
+
+bool KItemListContainer::enabledFrame() const
+{
+    const QGraphicsView* graphicsView = qobject_cast<QGraphicsView*>(viewport());
+    return graphicsView->autoFillBackground();
+}
+
 void KItemListContainer::keyPressEvent(QKeyEvent* event)
 {
     // TODO: We should find a better way to handle the key press events in the view.
@@ -148,11 +184,15 @@ 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();
+        smoothScroller->scrollTo(scrollBar->value() - numPixels);
+    } else {
+        const int numDegrees = event->angleDelta().y() / 8;
+        const int numSteps = numDegrees / 15;
+        smoothScroller->scrollTo(scrollBar->value() - numSteps * scrollBar->pageStep() / 4);
+    }
 
     event->accept();
 }
@@ -174,23 +214,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());
@@ -220,20 +270,29 @@ void KItemListContainer::updateScrollOffsetScrollBar()
     QScrollBar* scrollOffsetScrollBar = 0;
     int singleStep = 0;
     int pageStep = 0;
+    int maximum = 0;
     if (view->scrollOrientation() == Qt::Vertical) {
         smoothScroller = m_verticalSmoothScroller;
         scrollOffsetScrollBar = verticalScrollBar();
         singleStep = view->itemSize().height();
-        pageStep = view->size().height();
+        // 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();
+
+        // However, the total height of the view must be considered for the
+        // maximum value of the scroll bar. Note that the view's scrollOffset()
+        // refers to the offset of the top part of the view, which might be
+        // hidden behind the header.
+        maximum = qMax(0, int(view->maximumScrollOffset() - view->size().height()));
     } else {
         smoothScroller = m_horizontalSmoothScroller;
         scrollOffsetScrollBar = horizontalScrollBar();
         singleStep = view->itemSize().width();
         pageStep = view->size().width();
+        maximum = qMax(0, int(view->maximumScrollOffset() - view->size().width()));
     }
 
     const int value = view->scrollOffset();
-    const int maximum = qMax(0, int(view->maximumScrollOffset() - pageStep));
     if (smoothScroller->requestScrollBarUpdate(maximum)) {
         const bool updatePolicy = (scrollOffsetScrollBar->maximum() > 0 && maximum == 0)
                                   || horizontalScrollBarPolicy() == Qt::ScrollBarAlwaysOn;
@@ -292,26 +351,28 @@ void KItemListContainer::updateGeometries()
     int extra = frameWidth() * 2;
     QStyleOption option;
     option.initFrom(this);
+    int scrollbarSpacing = 0;
     if (style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &option, this)) {
-        extra += style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &option, this);
+        scrollbarSpacing = style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &option, this);
     }
 
     const int widthDec = verticalScrollBar()->isVisible()
-                         ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+                         ? extra + scrollbarSpacing + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
                          : extra;
 
     const int heightDec = horizontalScrollBar()->isVisible()
-                          ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+                          ? 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();
@@ -355,29 +416,3 @@ void KItemListContainer::updateScrollOffsetScrollBarPolicy()
     }
 }
 
-void KItemListContainer::initialize()
-{
-    if (m_controller) {
-        if (m_controller->model()) {
-            slotModelChanged(m_controller->model(), 0);
-        }
-        if (m_controller->view()) {
-            slotViewChanged(m_controller->view(), 0);
-        }
-    } else {
-        m_controller = new KItemListController(this);
-    }
-
-    connect(m_controller, SIGNAL(modelChanged(KItemModelBase*,KItemModelBase*)),
-            this, SLOT(slotModelChanged(KItemModelBase*,KItemModelBase*)));
-    connect(m_controller, SIGNAL(viewChanged(KItemListView*,KItemListView*)),
-            this, SLOT(slotViewChanged(KItemListView*,KItemListView*)));
-
-    QGraphicsView* graphicsView = new KItemListContainerViewport(new QGraphicsScene(this), this);
-    setViewport(graphicsView);
-
-    m_horizontalSmoothScroller = new KItemListSmoothScroller(horizontalScrollBar(), this);
-    m_verticalSmoothScroller = new KItemListSmoothScroller(verticalScrollBar(), this);
-}
-
-#include "kitemlistcontainer.moc"