QHeaderView - fix setOffsetToSectionPosition a bit
authorThorbjørn Lund Martsum <tmartsum@gmail.com>
Sun, 12 Feb 2012 20:11:04 +0000 (21:11 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 24 Feb 2012 13:55:06 +0000 (14:55 +0100)
It might be silly to have sections with size 0 without using hideSection.
Nevertheless we should still use the principle of least surprise.

It does not make sense that hiding a row 'far' away should affect
the semantics of setOffsetToSectionPosition on lower indexes.

Change-Id: Iaf847eba2ea4d28fc7bcfe3a27d62f432f6f61e0
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
src/widgets/itemviews/qheaderview.cpp
tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp

index c457f16..ed71c5a 100644 (file)
@@ -3390,11 +3390,11 @@ int QHeaderViewPrivate::viewSectionSizeHint(int logical) const
 
 int QHeaderViewPrivate::adjustedVisualIndex(int visualIndex) const
 {
-    if (hiddenSectionSize.count() > 0) {
+    if (!sectionHidden.isEmpty()) {
         int adjustedVisualIndex = visualIndex;
         int currentVisualIndex = 0;
         for (int i = 0; i < sectionSpans.count(); ++i) {
-            if (sectionSpans.at(i).size == 0)
+            if (sectionHidden.testBit(i))
                 ++adjustedVisualIndex;
             else
                 ++currentVisualIndex;
index 4dd57e1..3edc125 100644 (file)
@@ -205,6 +205,7 @@ private slots:
     void QTBUG12268_hiddenMovedSectionSorting();
     void QTBUG14242_hideSectionAutoSize();
     void ensureNoIndexAtLength();
+    void offsetConsistent();
 
     void initialSortOrderRole();
 
@@ -2168,6 +2169,33 @@ void tst_QHeaderView::ensureNoIndexAtLength()
     QVERIFY(hv->visualIndexAt(hv->length()) == -1);
 }
 
+void tst_QHeaderView::offsetConsistent()
+{
+    // Ensure that a hidden section 'far away'
+    // does not affect setOffsetToSectionPosition ..
+    const int sectionToHide = 513;
+    QTableView qtv;
+    QStandardItemModel amodel(1000, 4);
+    qtv.setModel(&amodel);
+    QHeaderView *hv = qtv.verticalHeader();
+    for (int u = 0; u < 100; u += 2)
+        hv->resizeSection(u, 0);
+    hv->setOffsetToSectionPosition(150);
+    int offset1 = hv->offset();
+    hv->hideSection(sectionToHide);
+    hv->setOffsetToSectionPosition(150);
+    int offset2 = hv->offset();
+    QVERIFY(offset1 == offset2);
+    // Ensure that hidden indexes (still) is considered.
+    hv->resizeSection(sectionToHide, hv->sectionSize(200) * 2);
+    hv->setOffsetToSectionPosition(800);
+    offset1 = hv->offset();
+    hv->showSection(sectionToHide);
+    hv->setOffsetToSectionPosition(800);
+    offset2 = hv->offset();
+    QVERIFY(offset2 > offset1);
+}
+
 void tst_QHeaderView::initialSortOrderRole()
 {
     QTableView view; // ### Shadowing member view (of type QHeaderView)