5#include <QtQmlModels/private/qqmlfiltercompositor_p.h>
6#include <QtQmlModels/private/qqmlsortfilterproxymodel_p.h>
12QQmlFilterCompositor::QQmlFilterCompositor(QObject *parent)
13 : QQmlFilterBase(
new QQmlFilterCompositorPrivate, parent)
15 Q_D(QQmlFilterCompositor);
24 connect(d->m_sfpmModel, &QQmlSortFilterProxyModel::modelReset,
25 this, &QQmlFilterCompositor::updateFilters);
28QQmlFilterCompositor::QQmlFilterCompositor(QQmlFilterBasePrivate *priv, QObject *parent)
29 : QQmlFilterBase(priv, parent)
34void QQmlFilterCompositorPrivate::init()
36 Q_Q(QQmlFilterCompositor);
37 m_sfpmModel = qobject_cast<QQmlSortFilterProxyModel *>(q->parent());
40void QQmlFilterCompositor::append(QQmlListProperty<QQmlFilterBase> *filterComp, QQmlFilterBase* filter)
42 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
43 filterCompositor->append(filter);
46qsizetype QQmlFilterCompositor::count(QQmlListProperty<QQmlFilterBase> *filterComp)
48 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
49 return filterCompositor->count();
52QQmlFilterBase *QQmlFilterCompositor::at(QQmlListProperty<QQmlFilterBase> *filterComp, qsizetype index)
54 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
55 return filterCompositor->at(index);
58void QQmlFilterCompositor::clear(QQmlListProperty<QQmlFilterBase> *filterComp)
60 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
61 filterCompositor->clear();
64void QQmlFilterCompositor::append(QQmlFilterBase *filter)
69 Q_D(QQmlFilterCompositor);
70 d->m_filters.append(filter);
74 QObject::connect(filter, &QQmlFilterBase::invalidateCache,
75 this, &QQmlFilterCompositor::refreshCache);
80 QObject::connect(filter, &QQmlFilterBase::invalidateModel,
81 d->m_sfpmModel, &QQmlSortFilterProxyModel::invalidate);
84 filter->update(d->m_sfpmModel);
88 emit d->m_sfpmModel->filtersChanged();
92qsizetype QQmlFilterCompositor::count()
94 Q_D(QQmlFilterCompositor);
95 return d->m_filters.count();
98QQmlFilterBase *QQmlFilterCompositor::at(qsizetype index)
100 Q_D(QQmlFilterCompositor);
101 return d->m_filters.at(index);
104void QQmlFilterCompositor::clear()
106 Q_D(QQmlFilterCompositor);
107 d->m_effectiveFilters.clear();
108 d->m_filters.clear();
111 emit d->m_sfpmModel->filtersChanged();
114QList<QQmlFilterBase *> QQmlFilterCompositor::filters()
116 Q_D(QQmlFilterCompositor);
120QQmlListProperty<QQmlFilterBase> QQmlFilterCompositor::filtersListProperty()
122 Q_D(QQmlFilterCompositor);
123 return QQmlListProperty<QQmlFilterBase>(
reinterpret_cast<QObject*>(
this), &d->m_filters,
124 QQmlFilterCompositor::append,
125 QQmlFilterCompositor::count,
126 QQmlFilterCompositor::at,
127 QQmlFilterCompositor::clear);
130void QQmlFilterCompositor::updateFilters()
132 Q_D(QQmlFilterCompositor);
134 for (
auto &filter: d->m_filters)
135 filter->update(d->m_sfpmModel);
140void QQmlFilterCompositor::refreshCache()
142 Q_D(QQmlFilterCompositor);
144 d->m_effectiveFilters.clear();
145 if (d->m_sfpmModel && d->m_sfpmModel->sourceModel()) {
146 for (
auto &filter: d->m_filters) {
147 if (filter->isActive())
148 d->m_effectiveFilters.append(filter);
153bool QQmlFilterCompositor::filterAcceptsRowInternal(
int row,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
155 Q_D(
const QQmlFilterCompositor);
158 return std::all_of(d->m_effectiveFilters.begin(), d->m_effectiveFilters.end(),
159 [row, &sourceParent, proxyModel](
const QQmlFilterBase *filter) {
160 const bool filterStatus = filter->filterAcceptsRowInternal(row, sourceParent, proxyModel);
161 return filter->isInverted() != filterStatus;
165bool QQmlFilterCompositor::filterAcceptsColumnInternal(
int column,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
167 Q_D(
const QQmlFilterCompositor);
170 return std::all_of(d->m_effectiveFilters.begin(), d->m_effectiveFilters.end(),
171 [column, &sourceParent, proxyModel](
const QQmlFilterBase *filter) {
172 if (!filter->supportColumnFiltering())
174 const bool filterStatus = filter->filterAcceptsColumnInternal(column, sourceParent, proxyModel);
175 return filter->isInverted() != filterStatus;
181#include "moc_qqmlfiltercompositor_p.cpp"
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")