diff options
Diffstat (limited to 'src/corelib/itemmodels/qsortfilterproxymodel.cpp')
-rw-r--r-- | src/corelib/itemmodels/qsortfilterproxymodel.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index 6853cbd38f..0771fd0e30 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -272,6 +272,7 @@ public: QModelIndexPairList store_persistent_indexes(); void update_persistent_indexes(const QModelIndexPairList &source_indexes); + void filter_about_to_be_changed(const QModelIndex &source_parent = QModelIndex()); void filter_changed(const QModelIndex &source_parent = QModelIndex()); QSet<int> handle_filter_changed( QVector<int> &source_to_proxy, QVector<int> &proxy_to_source, @@ -1011,6 +1012,7 @@ QModelIndexPairList QSortFilterProxyModelPrivate::store_persistent_indexes() { Q_Q(QSortFilterProxyModel); QModelIndexPairList source_indexes; + source_indexes.reserve(persistent.indexes.count()); foreach (QPersistentModelIndexData *data, persistent.indexes) { QModelIndex proxy_index = data->index; QModelIndex source_index = q->mapToSource(proxy_index); @@ -1030,7 +1032,10 @@ void QSortFilterProxyModelPrivate::update_persistent_indexes( { Q_Q(QSortFilterProxyModel); QModelIndexList from, to; - for (int i = 0; i < source_indexes.count(); ++i) { + const int numSourceIndexes = source_indexes.count(); + from.reserve(numSourceIndexes); + to.reserve(numSourceIndexes); + for (int i = 0; i < numSourceIndexes; ++i) { QModelIndex source_index = source_indexes.at(i).second; QModelIndex old_proxy_index = source_indexes.at(i).first; create_mapping(source_index.parent()); @@ -1041,6 +1046,19 @@ void QSortFilterProxyModelPrivate::update_persistent_indexes( q->changePersistentIndexList(from, to); } +/*! + \internal + + Updates the source_index mapping in case it's invalid and we + need it because we have a valid filter +*/ +void QSortFilterProxyModelPrivate::filter_about_to_be_changed(const QModelIndex &source_parent) +{ + if (!filter_regexp.pattern().isEmpty() && + source_index_mapping.constFind(source_parent) == source_index_mapping.constEnd()) + create_mapping(source_parent); +} + /*! \internal @@ -2013,7 +2031,9 @@ QMimeData *QSortFilterProxyModel::mimeData(const QModelIndexList &indexes) const { Q_D(const QSortFilterProxyModel); QModelIndexList source_indexes; - for (int i = 0; i < indexes.count(); ++i) + const int numIndexes = indexes.count(); + source_indexes.reserve(numIndexes); + for (int i = 0; i < numIndexes; ++i) source_indexes << mapToSource(indexes.at(i)); return d->model->mimeData(source_indexes); } @@ -2108,6 +2128,7 @@ bool QSortFilterProxyModel::removeRows(int row, int count, const QModelIndex &pa // remove corresponding source intervals // ### if this proves to be slow, we can switch to single-row removal QVector<int> rows; + rows.reserve(count); for (int i = row; i < row + count; ++i) rows.append(m->source_rows.at(i)); std::sort(rows.begin(), rows.end()); @@ -2147,6 +2168,7 @@ bool QSortFilterProxyModel::removeColumns(int column, int count, const QModelInd } // remove corresponding source intervals QVector<int> columns; + columns.reserve(count); for (int i = column; i < column + count; ++i) columns.append(m->source_columns.at(i)); @@ -2298,6 +2320,7 @@ QRegExp QSortFilterProxyModel::filterRegExp() const void QSortFilterProxyModel::setFilterRegExp(const QRegExp ®Exp) { Q_D(QSortFilterProxyModel); + d->filter_about_to_be_changed(); d->filter_regexp = regExp; d->filter_changed(); } @@ -2319,6 +2342,7 @@ int QSortFilterProxyModel::filterKeyColumn() const void QSortFilterProxyModel::setFilterKeyColumn(int column) { Q_D(QSortFilterProxyModel); + d->filter_about_to_be_changed(); d->filter_column = column; d->filter_changed(); } @@ -2344,6 +2368,7 @@ void QSortFilterProxyModel::setFilterCaseSensitivity(Qt::CaseSensitivity cs) Q_D(QSortFilterProxyModel); if (cs == d->filter_regexp.caseSensitivity()) return; + d->filter_about_to_be_changed(); d->filter_regexp.setCaseSensitivity(cs); d->filter_changed(); } @@ -2409,6 +2434,7 @@ void QSortFilterProxyModel::setSortLocaleAware(bool on) void QSortFilterProxyModel::setFilterRegExp(const QString &pattern) { Q_D(QSortFilterProxyModel); + d->filter_about_to_be_changed(); d->filter_regexp.setPatternSyntax(QRegExp::RegExp); d->filter_regexp.setPattern(pattern); d->filter_changed(); @@ -2423,6 +2449,7 @@ void QSortFilterProxyModel::setFilterRegExp(const QString &pattern) void QSortFilterProxyModel::setFilterWildcard(const QString &pattern) { Q_D(QSortFilterProxyModel); + d->filter_about_to_be_changed(); d->filter_regexp.setPatternSyntax(QRegExp::Wildcard); d->filter_regexp.setPattern(pattern); d->filter_changed(); @@ -2437,6 +2464,7 @@ void QSortFilterProxyModel::setFilterWildcard(const QString &pattern) void QSortFilterProxyModel::setFilterFixedString(const QString &pattern) { Q_D(QSortFilterProxyModel); + d->filter_about_to_be_changed(); d->filter_regexp.setPatternSyntax(QRegExp::FixedString); d->filter_regexp.setPattern(pattern); d->filter_changed(); @@ -2516,6 +2544,7 @@ void QSortFilterProxyModel::setFilterRole(int role) Q_D(QSortFilterProxyModel); if (d->filter_role == role) return; + d->filter_about_to_be_changed(); d->filter_role = role; d->filter_changed(); } |