summaryrefslogtreecommitdiff
path: root/user/qt5-qtbase/section-header.patch
diff options
context:
space:
mode:
Diffstat (limited to 'user/qt5-qtbase/section-header.patch')
-rw-r--r--user/qt5-qtbase/section-header.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/user/qt5-qtbase/section-header.patch b/user/qt5-qtbase/section-header.patch
new file mode 100644
index 000000000..20664104a
--- /dev/null
+++ b/user/qt5-qtbase/section-header.patch
@@ -0,0 +1,95 @@
+From ba6e0e4aac4d06782325c7032c8ea475f2d3eab0 Mon Sep 17 00:00:00 2001
+From: David Faure <david.faure@kdab.com>
+Date: Sat, 13 Apr 2019 19:37:37 +0200
+Subject: [PATCH 1/1] QHeaderView: fix assert when restoring section sizes over
+ less columns
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf8
+Content-Transfer-Encoding: 8bit
+
+If columns are removed and we get notified via layoutChanged, the code
+tries to restore old section sizes, and went out of bounds, leading to
+an assert in QVector. Simply add an if() to skip restoring out-of-bounds columns.
+
+This comes from https://bugs.kde.org/show_bug.cgi?id=395181,
+which translates into the unittest that is part of this commit.
+
+Change-Id: Ide42176a758f87b21957c40508127d67f1d5a2d9
+Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de>
+Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
+---
+ src/widgets/itemviews/qheaderview.cpp | 16 +++++++++-------
+ .../widgets/itemviews/qheaderview/tst_qheaderview.cpp | 17 +++++++++++++++++
+ 2 files changed, 26 insertions(+), 7 deletions(-)
+
+diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp
+index 62abf567511..99309633a7b 100644
+--- a/src/widgets/itemviews/qheaderview.cpp
++++ b/src/widgets/itemviews/qheaderview.cpp
+@@ -2283,13 +2283,15 @@ void QHeaderViewPrivate::_q_sectionsChanged(const QList<QPersistentModelIndex> &
+ : index.row());
+ // the new visualIndices are already adjusted / reset by initializeSections()
+ const int newVisualIndex = visualIndex(newLogicalIndex);
+- auto &newSection = sectionItems[newVisualIndex];
+- newSection = item.section;
+-
+- if (newSection.isHidden) {
+- // otherwise setSectionHidden will return without doing anything
+- newSection.isHidden = false;
+- q->setSectionHidden(newLogicalIndex, true);
++ if (newVisualIndex < sectionItems.count()) {
++ auto &newSection = sectionItems[newVisualIndex];
++ newSection = item.section;
++
++ if (newSection.isHidden) {
++ // otherwise setSectionHidden will return without doing anything
++ newSection.isHidden = false;
++ q->setSectionHidden(newLogicalIndex, true);
++ }
+ }
+ }
+
+diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+index eaf75e74945..1b3e1e1f34e 100644
+--- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
++++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+@@ -248,6 +248,7 @@ private slots:
+ void sizeHintCrash();
+ void testResetCachedSizeHint();
+ void statusTips();
++ void testRemovingColumnsViaLayoutChanged();
+
+ protected:
+ void setupTestData(bool use_reset_model = false);
+@@ -353,6 +354,7 @@ public:
+
+ void cleanup()
+ {
++ emit layoutAboutToBeChanged();
+ cols = 3;
+ rows = 3;
+ emit layoutChanged();
+@@ -3489,5 +3491,20 @@ void tst_QHeaderView::statusTips()
+ QCOMPARE(headerView.statusTipText, QLatin1String("[0,1,0] -- Header"));
+ }
+
++void tst_QHeaderView::testRemovingColumnsViaLayoutChanged()
++{
++ const int persistentSectionSize = 101;
++
++ QtTestModel model;
++ model.rows = model.cols = 5;
++ view->setModel(&model);
++ for (int i = 0; i < model.cols; ++i)
++ view->resizeSection(i, persistentSectionSize + i);
++ model.cleanup(); // down to 3 via layoutChanged (not columnsRemoved)
++ for (int j = 0; j < model.cols; ++j)
++ QCOMPARE(view->sectionSize(j), persistentSectionSize + j);
++ // The main point of this test is that the section-size restoring code didn't go out of bounds.
++}
++
+ QTEST_MAIN(tst_QHeaderView)
+ #include "tst_qheaderview.moc"
+--
+2.16.3
+