]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontainer.cpp
Fix drag & drop cursor issue
[dolphin.git] / src / kitemviews / kitemlistcontainer.cpp
index d006e2c4d48d455c9b1c80372b2afda0fde77b37..b480b449488eb7b40411cf88be27cd7ae31f6109 100644 (file)
@@ -33,6 +33,7 @@
 #include <QPropertyAnimation>
 #include <QScrollBar>
 #include <QStyle>
+#include <QStyleOption>
 
 #include <KDebug>
 
@@ -172,7 +173,7 @@ void KItemListContainer::slotViewChanged(KItemListView* current, KItemListView*
     QGraphicsScene* scene = static_cast<QGraphicsView*>(viewport())->scene();
     if (previous) {
         scene->removeItem(previous);
-        disconnect(current, SIGNAL(scrollOrientationChanged(Qt::Orientation,Qt::Orientation)), this, SLOT(slotScrollOrientationChanged(Qt::Orientation,Qt::Orientation)));
+        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()));
@@ -233,11 +234,19 @@ void KItemListContainer::updateScrollOffsetScrollBar()
     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;
+
         scrollOffsetScrollBar->setSingleStep(singleStep);
         scrollOffsetScrollBar->setPageStep(pageStep);
         scrollOffsetScrollBar->setMinimum(0);
         scrollOffsetScrollBar->setMaximum(maximum);
         scrollOffsetScrollBar->setValue(value);
+
+        if (updatePolicy) {
+            // Prevent a potential endless layout loop (see bug #293318).
+            updateScrollOffsetScrollBarPolicy();
+        }
     }
 }
 
@@ -279,13 +288,20 @@ void KItemListContainer::updateGeometries()
 {
     QRect rect = geometry();
 
+    int extra = frameWidth() * 2;
+    QStyleOption option;
+    option.initFrom(this);
+    if (style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &option, this)) {
+        extra += style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &option, this);
+    }
+
     const int widthDec = verticalScrollBar()->isVisible()
-                         ? frameWidth() + style()->pixelMetric(QStyle::PM_ScrollBarExtent)
-                         : frameWidth() * 2;
+                         ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+                         : extra;
 
     const int heightDec = horizontalScrollBar()->isVisible()
-                          ? frameWidth() + style()->pixelMetric(QStyle::PM_ScrollBarExtent)
-                          : frameWidth() * 2;
+                          ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+                          : extra;
 
     rect.adjust(0, 0, -widthDec, -heightDec);
 
@@ -312,9 +328,42 @@ void KItemListContainer::updateSmoothScrollers(Qt::Orientation orientation)
     }
 }
 
+void KItemListContainer::updateScrollOffsetScrollBarPolicy()
+{
+    const KItemListView* view = m_controller->view();
+    Q_ASSERT(view);
+    const bool vertical = (view->scrollOrientation() == Qt::Vertical);
+
+    QStyleOption option;
+    option.initFrom(this);
+    const int scrollBarInc = style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this);
+
+    QSizeF newViewSize = m_controller->view()->size();
+    if (vertical) {
+        newViewSize.rwidth() += scrollBarInc;
+    } else {
+        newViewSize.rheight() += scrollBarInc;
+    }
+
+    const Qt::ScrollBarPolicy policy = view->scrollBarRequired(newViewSize)
+                                       ? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAsNeeded;
+    if (vertical) {
+        setVerticalScrollBarPolicy(policy);
+    } else {
+        setHorizontalScrollBarPolicy(policy);
+    }
+}
+
 void KItemListContainer::initialize()
 {
-    if (!m_controller) {
+    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);
     }