summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStephen Kelly <stephen.kelly@kdab.com>2012-08-08 14:56:14 +0200
committerQt by Nokia <qt-info@nokia.com>2012-08-15 15:04:11 +0200
commitda64a5079249ec04e4d3d6df2cc87ee69f66b977 (patch)
tree5d383efa68882af141995f83868f20ad1a7279d0 /src
parentfb07ce50ae2dcfb61c5a366bba3b4e2862301d25 (diff)
Only emit headerDataChanged for valid proxy intervals.
Modeltest asserts before the patch, and passes afterward. Task-number: QTBUG-26515 Change-Id: I08a89cd5c9c59613badcddbd056a3d0b8fbbca13 Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/itemmodels/qsortfilterproxymodel.cpp42
1 files changed, 35 insertions, 7 deletions
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
index fb84dce861..7863dc6f4f 100644
--- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp
+++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp
@@ -1226,15 +1226,43 @@ void QSortFilterProxyModelPrivate::_q_sourceDataChanged(const QModelIndex &sourc
void QSortFilterProxyModelPrivate::_q_sourceHeaderDataChanged(Qt::Orientation orientation,
int start, int end)
{
+ Q_ASSERT(start <= end);
+
Q_Q(QSortFilterProxyModel);
Mapping *m = create_mapping(QModelIndex()).value();
- int proxy_start = (orientation == Qt::Vertical
- ? m->proxy_rows.at(start)
- : m->proxy_columns.at(start));
- int proxy_end = (orientation == Qt::Vertical
- ? m->proxy_rows.at(end)
- : m->proxy_columns.at(end));
- emit q->headerDataChanged(orientation, proxy_start, proxy_end);
+
+ const QVector<int> &source_to_proxy = (orientation == Qt::Vertical) ? m->proxy_rows : m->proxy_columns;
+
+ QVector<int> proxy_positions;
+ proxy_positions.reserve(end - start + 1);
+ {
+ Q_ASSERT(source_to_proxy.size() > end);
+ QVector<int>::const_iterator it = source_to_proxy.constBegin() + start;
+ const QVector<int>::const_iterator endIt = source_to_proxy.constBegin() + end + 1;
+ for ( ; it != endIt; ++it) {
+ if (*it != -1)
+ proxy_positions.push_back(*it);
+ }
+ }
+
+ qSort(proxy_positions);
+
+ int last_index = 0;
+ const int numItems = proxy_positions.size();
+ while (last_index < numItems) {
+ const int proxyStart = proxy_positions.at(last_index);
+ int proxyEnd = proxyStart;
+ ++last_index;
+ for (int i = last_index; i < numItems; ++i) {
+ if (proxy_positions.at(i) == proxyEnd + 1) {
+ ++last_index;
+ ++proxyEnd;
+ } else {
+ break;
+ }
+ }
+ emit q->headerDataChanged(orientation, proxyStart, proxyEnd);
+ }
}
void QSortFilterProxyModelPrivate::_q_sourceAboutToBeReset()