From da64a5079249ec04e4d3d6df2cc87ee69f66b977 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 8 Aug 2012 14:56:14 +0200 Subject: 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 Reviewed-by: Stephen Kelly --- src/corelib/itemmodels/qsortfilterproxymodel.cpp | 42 ++++++++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) (limited to 'src/corelib') 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 &source_to_proxy = (orientation == Qt::Vertical) ? m->proxy_rows : m->proxy_columns; + + QVector proxy_positions; + proxy_positions.reserve(end - start + 1); + { + Q_ASSERT(source_to_proxy.size() > end); + QVector::const_iterator it = source_to_proxy.constBegin() + start; + const QVector::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() -- cgit v1.2.3