]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix incorrect geometry updates in KItemListContainer
authorYichao Yu <yyc1992@gmail.com>
Wed, 20 Nov 2013 23:47:23 +0000 (00:47 +0100)
committerFrank Reininghaus <frank78ac@googlemail.com>
Wed, 20 Nov 2013 23:47:40 +0000 (00:47 +0100)
When resizing the window and when KItemListContainer::updateGeometries
is called before the scrollbar visibility is updated, a relayout is
triggered in `m_controller->view()->setGeometry` which updates the
scrollbar visibility and calls back to
`KItemListContainer::updateGeometries` again. Since the first call,
which has the wrong geometry (due to the incorrect scrollbar states),
updates the geometries of the scene and viewport after the second call
(which has the right geometry!!) returns, the final result is a size
that corresponded to the old scrollbar state before this commit.

This patch uses the new geometry of the view after updating it (since
it might not be the size we put in) and therefore makes the sizes
consistent.

BUG: 327709
FIXED-IN: 4.11.4
REVIEW: 113939

src/kitemviews/kitemlistcontainer.cpp

index cd2fca1e1dc70cb5f844a647d68e8d547a4645b3..8498286c9f68293709b74b5a86301878b86987ee 100644 (file)
@@ -351,14 +351,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();