From b255a070907cca8a7f6857e24019ea49093a4d36 Mon Sep 17 00:00:00 2001
From: Frank Reininghaus <frank78ac@googlemail.com>
Date: Wed, 22 Sep 2010 10:19:59 +0200
Subject: QTreeView: do not scroll to top if last item is removed

When the last item is the current item and is removed,
QTreeViewPrivate::updateScrollBars() is called after QTreeViewPrivate's
viewItems member is cleared. This commit makes sure that viewItems is
restored by calling QTreeView::doItemsLayout() in this case, preventing
that the scroll bar range is set to zero temporarily and the view is
scrolled to the top unexpectedly (this was a regression in 4.7.0:
QTBUG-13567).

Merge-request: 2481
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
(cherry picked from commit 6da6b7099d4e0b49329793e4b90703ec3d868048)
---
 src/gui/itemviews/qtreeview.cpp        |  4 ++++
 tests/auto/qtreeview/tst_qtreeview.cpp | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp
index b797776..40b51fe 100644
--- a/src/gui/itemviews/qtreeview.cpp
+++ b/src/gui/itemviews/qtreeview.cpp
@@ -3435,6 +3435,10 @@ void QTreeViewPrivate::updateScrollBars()
     if (!viewportSize.isValid())
         viewportSize = QSize(0, 0);
 
+    if (viewItems.isEmpty()) {
+        q->doItemsLayout();
+    }
+
     int itemsInViewport = 0;
     if (uniformRowHeights) {
         if (defaultItemHeight <= 0)
diff --git a/tests/auto/qtreeview/tst_qtreeview.cpp b/tests/auto/qtreeview/tst_qtreeview.cpp
index 7e2e800..c7b53e9 100644
--- a/tests/auto/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/qtreeview/tst_qtreeview.cpp
@@ -240,6 +240,7 @@ private slots:
     void taskQTBUG_6450_selectAllWith1stColumnHidden();
     void taskQTBUG_9216_setSizeAndUniformRowHeightsWrongRepaint();
     void taskQTBUG_11466_keyboardNavigationRegression();
+    void taskQTBUG_13567_removeLastItemRegression();
 };
 
 class QtTestModel: public QAbstractItemModel
@@ -3910,5 +3911,26 @@ void tst_QTreeView::taskQTBUG_11466_keyboardNavigationRegression()
     QTRY_COMPARE(treeView.currentIndex(), treeView.selectionModel()->selection().indexes().first());
 }
 
+void tst_QTreeView::taskQTBUG_13567_removeLastItemRegression()
+{
+    QtTestModel model(200, 1);
+
+    QTreeView view;
+    view.setSelectionMode(QAbstractItemView::ExtendedSelection);
+    view.setModel(&model);
+    view.show();
+    QTest::qWaitForWindowShown(&view);
+
+    view.scrollToBottom();
+    QTest::qWait(10);
+    CHECK_VISIBLE(199, 0);
+
+    view.setCurrentIndex(model.index(199, 0));
+    model.removeLastRow();
+    QTest::qWait(10);
+    QCOMPARE(view.currentIndex(), model.index(198, 0));
+    CHECK_VISIBLE(198, 0);
+}
+
 QTEST_MAIN(tst_QTreeView)
 #include "tst_qtreeview.moc"
-- 
cgit v0.12