4#include <QtQmlModels/private/qqmlfiltercompositor_p.h>
5#include <QtQmlModels/private/qqmlsortfilterproxymodel_p.h>
11QQmlFilterCompositor::QQmlFilterCompositor(QObject *parent)
12 : QQmlFilterBase(
new QQmlFilterCompositorPrivate, parent)
14 Q_D(QQmlFilterCompositor);
22 connect(d->m_sfpmModel, &QQmlSortFilterProxyModel::modelReset,
23 this, &QQmlFilterCompositor::updateFilters);
26QQmlFilterCompositor::~QQmlFilterCompositor()
31void QQmlFilterCompositorPrivate::init()
33 Q_Q(QQmlFilterCompositor);
34 m_sfpmModel = qobject_cast<QQmlSortFilterProxyModel *>(q->parent());
37void QQmlFilterCompositor::append(QQmlListProperty<QQmlFilterBase> *filterComp, QQmlFilterBase* filter)
39 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
40 filterCompositor->append(filter);
43qsizetype QQmlFilterCompositor::count(QQmlListProperty<QQmlFilterBase> *filterComp)
45 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
46 return filterCompositor->count();
49QQmlFilterBase *QQmlFilterCompositor::at(QQmlListProperty<QQmlFilterBase> *filterComp, qsizetype index)
51 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
52 return filterCompositor->at(index);
55void QQmlFilterCompositor::clear(QQmlListProperty<QQmlFilterBase> *filterComp)
57 auto *filterCompositor =
reinterpret_cast<QQmlFilterCompositor *> (filterComp->object);
58 filterCompositor->clear();
61void QQmlFilterCompositor::append(QQmlFilterBase *filter)
66 Q_D(QQmlFilterCompositor);
67 d->m_filters.append(filter);
70 QObject::connect(filter, &QQmlFilterBase::invalidateModel,
71 d->m_sfpmModel, &QQmlSortFilterProxyModel::invalidate);
75 QObject::connect(filter, &QQmlFilterBase::invalidateCache,
76 this, &QQmlFilterCompositor::updateCache);
79 filter->update(d->m_sfpmModel);
83 emit d->m_sfpmModel->filtersChanged();
86qsizetype QQmlFilterCompositor::count()
88 Q_D(QQmlFilterCompositor);
89 return d->m_filters.count();
92QQmlFilterBase *QQmlFilterCompositor::at(qsizetype index)
94 Q_D(QQmlFilterCompositor);
95 return d->m_filters.at(index);
98void QQmlFilterCompositor::clear()
100 Q_D(QQmlFilterCompositor);
101 d->m_effectiveFilters.clear();
102 d->m_filters.clear();
104 emit d->m_sfpmModel->filtersChanged();
107QList<QQmlFilterBase *> QQmlFilterCompositor::filters()
109 Q_D(QQmlFilterCompositor);
113QQmlListProperty<QQmlFilterBase> QQmlFilterCompositor::filtersListProperty()
115 Q_D(QQmlFilterCompositor);
116 return QQmlListProperty<QQmlFilterBase>(
reinterpret_cast<QObject*>(
this), &d->m_filters,
117 QQmlFilterCompositor::append,
118 QQmlFilterCompositor::count,
119 QQmlFilterCompositor::at,
120 QQmlFilterCompositor::clear);
123void QQmlFilterCompositor::updateFilters()
125 Q_D(QQmlFilterCompositor);
127 for (
auto &filter: d->m_filters)
128 filter->update(d->m_sfpmModel);
133void QQmlFilterCompositor::updateCache()
135 Q_D(QQmlFilterCompositor);
137 d->m_effectiveFilters.clear();
138 if (d->m_sfpmModel && d->m_sfpmModel->sourceModel()) {
139 QList<QQmlFilterBase *> filters = d->m_filters;
141 std::copy_if(filters.begin(), filters.end(), std::back_inserter(d->m_effectiveFilters),
142 [](QQmlFilterBase *filter){
return filter->enabled(); });
146bool QQmlFilterCompositor::filterAcceptsRowInternal(
int row,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
148 Q_D(
const QQmlFilterCompositor);
151 return std::all_of(d->m_effectiveFilters.begin(), d->m_effectiveFilters.end(),
152 [row, &sourceParent, proxyModel](
const QQmlFilterBase *filter) {
153 const bool filterStatus = filter->filterAcceptsRowInternal(row, sourceParent, proxyModel);
154 return !(filter->isInverted()) ? filterStatus : !filterStatus;
158bool QQmlFilterCompositor::filterAcceptsColumnInternal(
int column,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
160 Q_D(
const QQmlFilterCompositor);
163 return std::all_of(d->m_effectiveFilters.begin(), d->m_effectiveFilters.end(),
164 [column, &sourceParent, proxyModel](
const QQmlFilterBase *filter) {
165 return filter->filterAcceptsColumnInternal(column, sourceParent, proxyModel);
171#include "moc_qqmlfiltercompositor_p.cpp"
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")