diff options
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/itemmodels/qsortfilterproxymodel.cpp | 89 | ||||
-rw-r--r-- | src/corelib/itemmodels/qsortfilterproxymodel.h | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 15 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject.h | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject_p.h | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qobjectdefs.h | 4 |
6 files changed, 95 insertions, 17 deletions
diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index 9a4e9d57ed..a620e25f13 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -274,6 +274,12 @@ class QSortFilterProxyModelPrivate : public QAbstractProxyModelPrivate Q_DECLARE_PUBLIC(QSortFilterProxyModel) public: + enum class Direction { + Rows = 1, + Columns = 2, + All = Rows | Columns + }; + struct Mapping { QVector<int> source_rows; QVector<int> source_columns; @@ -413,7 +419,7 @@ public: 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()); + void filter_changed(Direction dir, const QModelIndex &source_parent = QModelIndex()); QSet<int> handle_filter_changed( QVector<int> &source_to_proxy, QVector<int> &proxy_to_source, const QModelIndex &source_parent, Qt::Orientation orient); @@ -431,6 +437,11 @@ public: typedef QHash<QModelIndex, QSortFilterProxyModelPrivate::Mapping *> IndexMap; +static bool operator&(QSortFilterProxyModelPrivate::Direction a, QSortFilterProxyModelPrivate::Direction b) +{ + return int(a) & int(b); +} + void QSortFilterProxyModelPrivate::_q_sourceModelDestroyed() { QAbstractProxyModelPrivate::_q_sourceModelDestroyed(); @@ -1269,14 +1280,14 @@ void QSortFilterProxyModelPrivate::filter_about_to_be_changed(const QModelIndex Updates the proxy model (adds/removes rows) based on the new filter. */ -void QSortFilterProxyModelPrivate::filter_changed(const QModelIndex &source_parent) +void QSortFilterProxyModelPrivate::filter_changed(Direction dir, const QModelIndex &source_parent) { IndexMap::const_iterator it = source_index_mapping.constFind(source_parent); if (it == source_index_mapping.constEnd()) return; Mapping *m = it.value(); - QSet<int> rows_removed = handle_filter_changed(m->proxy_rows, m->source_rows, source_parent, Qt::Vertical); - QSet<int> columns_removed = handle_filter_changed(m->proxy_columns, m->source_columns, source_parent, Qt::Horizontal); + const QSet<int> rows_removed = (dir & Direction::Rows) ? handle_filter_changed(m->proxy_rows, m->source_rows, source_parent, Qt::Vertical) : QSet<int>(); + const QSet<int> columns_removed = (dir & Direction::Columns) ? handle_filter_changed(m->proxy_columns, m->source_columns, source_parent, Qt::Horizontal) : QSet<int>(); // We need to iterate over a copy of m->mapped_children because otherwise it may be changed by other code, invalidating // the iterator it2. @@ -1290,7 +1301,7 @@ void QSortFilterProxyModelPrivate::filter_changed(const QModelIndex &source_pare indexesToRemove.push_back(i); remove_from_mapping(source_child_index); } else { - filter_changed(source_child_index); + filter_changed(dir, source_child_index); } } QVector<int>::const_iterator removeIt = indexesToRemove.constEnd(); @@ -2605,7 +2616,7 @@ void QSortFilterProxyModel::setFilterRegExp(const QRegExp ®Exp) Q_D(QSortFilterProxyModel); d->filter_about_to_be_changed(); d->filter_data.setRegExp(regExp); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } #if QT_CONFIG(regularexpression) @@ -2634,7 +2645,7 @@ void QSortFilterProxyModel::setFilterRegularExpression(const QRegularExpression Q_D(QSortFilterProxyModel); d->filter_about_to_be_changed(); d->filter_data.setRegularExpression(regularExpression); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } #endif @@ -2657,7 +2668,7 @@ void QSortFilterProxyModel::setFilterKeyColumn(int column) Q_D(QSortFilterProxyModel); d->filter_about_to_be_changed(); d->filter_column = column; - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } /*! @@ -2683,7 +2694,7 @@ void QSortFilterProxyModel::setFilterCaseSensitivity(Qt::CaseSensitivity cs) return; d->filter_about_to_be_changed(); d->filter_data.setCaseSensitivity(cs); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); emit filterCaseSensitivityChanged(cs); } @@ -2754,7 +2765,7 @@ void QSortFilterProxyModel::setFilterRegExp(const QString &pattern) QRegExp rx(pattern); rx.setCaseSensitivity(d->filter_data.caseSensitivity()); d->filter_data.setRegExp(rx); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } #if QT_CONFIG(regularexpression) @@ -2775,7 +2786,7 @@ void QSortFilterProxyModel::setFilterRegularExpression(const QString &pattern) d->filter_about_to_be_changed(); QRegularExpression rx(pattern); d->filter_data.setRegularExpression(rx); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } #endif @@ -2791,7 +2802,7 @@ void QSortFilterProxyModel::setFilterWildcard(const QString &pattern) d->filter_about_to_be_changed(); QRegExp rx(pattern, d->filter_data.caseSensitivity(), QRegExp::Wildcard); d->filter_data.setRegExp(rx); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } /*! @@ -2806,7 +2817,7 @@ void QSortFilterProxyModel::setFilterFixedString(const QString &pattern) d->filter_about_to_be_changed(); QRegExp rx(pattern, d->filter_data.caseSensitivity(), QRegExp::FixedString); d->filter_data.setRegExp(rx); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } /*! @@ -2886,7 +2897,7 @@ void QSortFilterProxyModel::setFilterRole(int role) return; d->filter_about_to_be_changed(); d->filter_role = role; - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); emit filterRoleChanged(role); } @@ -2913,7 +2924,7 @@ void QSortFilterProxyModel::setRecursiveFilteringEnabled(bool recursive) return; d->filter_about_to_be_changed(); d->filter_recursive = recursive; - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); emit recursiveFilteringEnabledChanged(recursive); } @@ -2964,11 +2975,57 @@ void QSortFilterProxyModel::filterChanged() (e.g. filterAcceptsRow()), and your filter parameters have changed. \sa invalidate() + \sa invalidateColumnsFilter() + \sa invalidateRowsFilter() */ void QSortFilterProxyModel::invalidateFilter() { Q_D(QSortFilterProxyModel); - d->filter_changed(); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::All); +} + +/*! + \since 6.0 + + Invalidates the current filtering for the columns. + + This function should be called if you are implementing custom filtering + (by filterAcceptsColumn()), and your filter parameters have changed. + This differs from invalidateFilter() in that it will not invoke + filterAcceptsRow(), but only filterAcceptsColumn(). You can use this + instead of invalidateFilter() if you want to hide or show a column where + the rows don't change. + + \sa invalidate() + \sa invalidateFilter() + \sa invalidateRowsFilter() +*/ +void QSortFilterProxyModel::invalidateColumnsFilter() +{ + Q_D(QSortFilterProxyModel); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Columns); +} + +/*! + \since 6.0 + + Invalidates the current filtering for the rows. + + This function should be called if you are implementing custom filtering + (by filterAcceptsRow()), and your filter parameters have changed. + This differs from invalidateFilter() in that it will not invoke + filterAcceptsColumn(), but only filterAcceptsRow(). You can use this + instead of invalidateFilter() if you want to hide or show a row where + the columns don't change. + + \sa invalidate() + \sa invalidateFilter() + \sa invalidateColumnsFilter() +*/ +void QSortFilterProxyModel::invalidateRowsFilter() +{ + Q_D(QSortFilterProxyModel); + d->filter_changed(QSortFilterProxyModelPrivate::Direction::Rows); } /*! diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.h b/src/corelib/itemmodels/qsortfilterproxymodel.h index 91253dd601..fb26da39ba 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.h +++ b/src/corelib/itemmodels/qsortfilterproxymodel.h @@ -143,6 +143,8 @@ protected: QT_DEPRECATED_X("Use QSortFilterProxyModel::invalidateFilter") void filterChanged(); #endif void invalidateFilter(); + void invalidateRowsFilter(); + void invalidateColumnsFilter(); public: using QObject::parent; diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 9be99d8c6a..e715093127 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -3506,6 +3506,21 @@ bool QMetaProperty::isRequired() const } /*! + \since 6.0 + Returns \c true if the property is implemented using a QProperty member; otherwise returns \c false. + + This can be used to detect the availability of QProperty related meta-call types ahead of + performing the call itself. +*/ +bool QMetaProperty::isQProperty() const +{ + if (!mobj) + return false; + int flags = mobj->d.data[handle + 2]; + return flags & IsQProperty; +} + +/*! \obsolete Returns \c true if the property is editable for the given \a object; diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h index 08adc495e0..96f851a0e1 100644 --- a/src/corelib/kernel/qmetaobject.h +++ b/src/corelib/kernel/qmetaobject.h @@ -265,6 +265,7 @@ public: bool isConstant() const; bool isFinal() const; bool isRequired() const; + bool isQProperty() const; bool isFlagType() const; bool isEnumType() const; diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h index 277109dac4..49c43e3d79 100644 --- a/src/corelib/kernel/qmetaobject_p.h +++ b/src/corelib/kernel/qmetaobject_p.h @@ -87,6 +87,7 @@ enum PropertyFlags { Notify = 0x00400000, Revisioned = 0x00800000, Required = 0x01000000, + IsQProperty = 0x02000000 }; enum MethodFlags { diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index fd7c081e88..5ae4c47259 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -390,7 +390,9 @@ struct Q_CORE_EXPORT QMetaObject CreateInstance, IndexOfMethod, RegisterPropertyMetaType, - RegisterMethodArgumentMetaType + RegisterMethodArgumentMetaType, + RegisterQPropertyObserver, + SetQPropertyBinding }; int static_metacall(Call, int, void **) const; |