63void QQmlFunctionFilter::componentComplete()
65 Q_D(QQmlFunctionFilter);
66 const auto *metaObj = metaObject();
67 for (
int idx = metaObj->methodOffset(); idx < metaObj->methodCount(); idx++) {
69 QMetaMethod method = metaObj->method(idx);
70 if (method.nameView() ==
"filter") {
76 if (!d->m_method.isValid())
79 if (d->m_method.parameterCount() != 1) {
80 qWarning(
"filter method requires a single parameter");
84 QQmlData *data = QQmlData::get(
this);
85 if (!data || !data->outerContext) {
86 qWarning(
"filter requires a QML context");
90 QQmlRefPointer<QQmlContextData> context = data->outerContext;
91 QQmlEngine *engine = context->engine();
93 const QMetaType parameterType = d->m_method.parameterMetaType(0);
94 auto cu = QQmlMetaType::obtainCompilationUnit(parameterType);
95 const QQmlType parameterQmlType = QQmlMetaType::qmlType(parameterType);
97 if (!parameterQmlType.isValid()) {
98 qWarning(
"filter method parameter needs to be a QML-registered type");
112 if (parameterType.flags() & QMetaType::PointerToQObject) {
113 QObject *created =
nullptr;
114 if (parameterQmlType.isInlineComponentType()) {
115 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
116 const QString icName = parameterQmlType.elementName();
117 created = QQmlObjectCreator(context, executableCu, context, icName).create(
118 executableCu->inlineComponentId(icName),
nullptr,
nullptr,
119 QQmlObjectCreator::InlineComponent);
120 }
else if (parameterQmlType.isComposite()) {
121 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
122 created = QQmlObjectCreator(context, executableCu, context, QString()).create();
124 created = parameterQmlType.metaObject()->newInstance();
127 const auto names = d->m_method.parameterNames();
128 created->setObjectName(names[0]);
129 d->m_parameterData = QVariant::fromValue(created);
131 d->m_parameterData = QVariant(parameterType);
138bool QQmlFunctionFilter::filterAcceptsRowInternal(
int row,
const QModelIndex& sourceParent,
const QQmlSortFilterProxyModel *proxyModel)
const
140 Q_D(
const QQmlFunctionFilter);
141 if (!d->m_method.isValid() || !d->m_parameterData.isValid())
146 QSortFilterProxyModelHelper::setProperties(
147 &d->m_parameterData, proxyModel,
148 proxyModel->sourceModel()->index(row, column(), sourceParent));
149 void *argv[] = {&retVal, d->m_parameterData.data()};
150 QMetaObject::metacall(
151 const_cast<QQmlFunctionFilter *>(
this), QMetaObject::InvokeMetaMethod,
152 d->m_method.methodIndex(), argv);
154 const int columnCount = proxyModel->sourceModel()->columnCount(sourceParent);
155 for (
int column = 0; column < columnCount; column++) {
156 QSortFilterProxyModelHelper::setProperties(
157 &d->m_parameterData, proxyModel,
158 proxyModel->sourceModel()->index(row, column, sourceParent));
159 void *argv[] = {&retVal, d->m_parameterData.data()};
160 QMetaObject::metacall(
161 const_cast<QQmlFunctionFilter *>(
this), QMetaObject::InvokeMetaMethod,
162 d->m_method.methodIndex(), argv);