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);
23 connect(d->m_sfpmModel, &QQmlSortFilterProxyModel::modelReset,
24 this, &QQmlFilterCompositor::updateFilters);
27QQmlFilterCompositor::~QQmlFilterCompositor()
32void QQmlFilterCompositorPrivate::init()
34 Q_Q(QQmlFilterCompositor);
35 m_sfpmModel = qobject_cast<QQmlSortFilterProxyModel *>(q->parent());
38void QQmlFilterCompositor::append(QQmlListProperty<QQmlFilterBase> *filterComp, QQmlFilterBase* filter)
40 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
41 filterCompositor->append(filter);
44qsizetype QQmlFilterCompositor::count(QQmlListProperty<QQmlFilterBase> *filterComp)
46 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
47 return filterCompositor->count();
50QQmlFilterBase *QQmlFilterCompositor::at(QQmlListProperty<QQmlFilterBase> *filterComp, qsizetype index)
52 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
53 return filterCompositor->at(index);
56void QQmlFilterCompositor::clear(QQmlListProperty<QQmlFilterBase> *filterComp)
58 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
59 filterCompositor->clear();
62void QQmlFilterCompositor::append(QQmlFilterBase *filter)
67 Q_D(QQmlFilterCompositor);
68 d->m_filters.append(filter);
71 QObject::connect(filter, &QQmlFilterBase::invalidateModel,
72 d->m_sfpmModel, &QQmlSortFilterProxyModel::invalidate);
76 QObject::connect(filter, &QQmlFilterBase::invalidateCache,
77 this, &QQmlFilterCompositor::updateCache);
80 filter->update(d->m_sfpmModel);
84 emit d->m_sfpmModel->filtersChanged();
87qsizetype QQmlFilterCompositor::count()
89 Q_D(QQmlFilterCompositor);
90 return d->m_filters.count();
93QQmlFilterBase *QQmlFilterCompositor::at(qsizetype index)
95 Q_D(QQmlFilterCompositor);
96 return d->m_filters.at(index);
99void QQmlFilterCompositor::clear()
101 Q_D(QQmlFilterCompositor);
102 d->m_effectiveFilters.clear();
103 d->m_filters.clear();
105 emit d->m_sfpmModel->filtersChanged();
108QList<QQmlFilterBase *> QQmlFilterCompositor::filters()
110 Q_D(QQmlFilterCompositor);
114QQmlListProperty<QQmlFilterBase> QQmlFilterCompositor::filtersListProperty()
116 Q_D(QQmlFilterCompositor);
117 return QQmlListProperty<QQmlFilterBase>(
reinterpret_cast<QObject*>(
this), &d->m_filters,
118 QQmlFilterCompositor::append,
119 QQmlFilterCompositor::count,
120 QQmlFilterCompositor::at,
121 QQmlFilterCompositor::clear);
124void QQmlFilterCompositor::updateFilters()
126 Q_D(QQmlFilterCompositor);
128 for (
auto &filter: d->m_filters)
129 filter->update(d->m_sfpmModel);
134void QQmlFilterCompositor::updateCache()
136 Q_D(QQmlFilterCompositor);
138 d->m_effectiveFilters.clear();
139 if (d->m_sfpmModel && d->m_sfpmModel->sourceModel()) {
140 QList<QQmlFilterBase *> filters = d->m_filters;
142 std::copy_if(filters.begin(), filters.end(), std::back_inserter(d->m_effectiveFilters),
143 [](QQmlFilterBase *filter){
return filter->enabled(); });
147bool QQmlFilterCompositor::filterAcceptsRowInternal(
int row,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
149 Q_D(
const QQmlFilterCompositor);
152 return std::all_of(d->m_effectiveFilters.begin(), d->m_effectiveFilters.end(),
153 [row, &sourceParent, proxyModel](
const QQmlFilterBase *filter) {
154 const bool filterStatus = filter->filterAcceptsRowInternal(row, sourceParent, proxyModel);
155 return !(filter->isInverted()) ? filterStatus : !filterStatus;
159bool QQmlFilterCompositor::filterAcceptsColumnInternal(
int column,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
161 Q_D(
const QQmlFilterCompositor);
164 return std::all_of(d->m_effectiveFilters.begin(), d->m_effectiveFilters.end(),
165 [column, &sourceParent, proxyModel](
const QQmlFilterBase *filter) {
166 return filter->filterAcceptsColumnInternal(column, sourceParent, proxyModel);
172#include "moc_qqmlfiltercompositor_p.cpp"
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")