67void QQmlFunctionSorter::componentComplete()
69 Q_D(QQmlFunctionSorter);
70 const auto *metaObj =
this->metaObject();
71 for (
int idx = metaObj->methodOffset(); idx < metaObj->methodCount(); idx++) {
73 QMetaMethod method = metaObj->method(idx);
74 if (method.nameView() ==
"compare") {
77 }
else if (method.nameView() ==
"sort") {
78 qmlWarning(
this) <<
"The 'sort' method is deprecated and will be removed in a future version. Rename it to 'compare'.";
84 if (!d->m_method.isValid())
87 if (d->m_method.parameterCount() != 2) {
88 qmlWarning(
this) << d->m_method.name() <<
" requires two parameters.";
92 QQmlData *data = QQmlData::get(
this);
93 if (!data || !data->outerContext) {
94 qmlWarning(
this) << d->m_method.name() <<
" requires a QML context.";
98 const QMetaType parameterType = d->m_method.parameterMetaType(0);
99 if (parameterType != d->m_method.parameterMetaType(1)) {
100 qmlWarning(
this) << d->m_method.name() <<
" parameters need to have matching types.";
104 auto cu = QQmlMetaType::obtainCompilationUnit(parameterType);
105 const QQmlType parameterQmlType = QQmlMetaType::qmlType(parameterType);
107 QQmlRefPointer<QQmlContextData> context = data->outerContext;
108 QQmlEngine *engine = context->engine();
120 if (parameterType.flags() & QMetaType::PointerToQObject) {
121 QObject *created0 =
nullptr;
122 QObject *created1 =
nullptr;
123 if (parameterQmlType.isInlineComponentType()) {
124 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
125 const QString icName = parameterQmlType.elementName();
126 created0 = QQmlObjectCreator(context, executableCu, context, icName).create(
127 executableCu->inlineComponentId(icName),
nullptr,
nullptr,
128 QQmlObjectCreator::InlineComponent);
129 created1 = QQmlObjectCreator(context, executableCu, context, icName).create(
130 executableCu->inlineComponentId(icName),
nullptr,
nullptr,
131 QQmlObjectCreator::InlineComponent);
132 }
else if (parameterQmlType.isComposite()) {
133 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
134 created0 = QQmlObjectCreator(context, executableCu, context, QString()).create();
135 created1 = QQmlObjectCreator(context, executableCu, context, QString()).create();
137 created0 = parameterQmlType.metaObject()->newInstance();
138 created1 = parameterQmlType.metaObject()->newInstance();
141 const auto names = d->m_method.parameterNames();
142 created0->setObjectName(names[0]);
143 created1->setObjectName(names[1]);
144 d->m_lhsParameterData = QVariant::fromValue(created0);
145 d->m_rhsParameterData = QVariant::fromValue(created1);
147 d->m_lhsParameterData = QVariant(parameterType);
148 d->m_rhsParameterData = QVariant(parameterType);
155QPartialOrdering QQmlFunctionSorter::compare(
156 const QModelIndex& sourceLeft,
const QModelIndex& sourceRight,
157 const QQmlSortFilterProxyModel *proxyModel)
const
159 Q_D(
const QQmlFunctionSorter);
160 if (!d->m_method.isValid()
161 || !d->m_lhsParameterData.isValid()
162 || !d->m_rhsParameterData.isValid()) {
163 return QPartialOrdering::Unordered;
167 QSortFilterProxyModelHelper::setProperties(&d->m_lhsParameterData, proxyModel, sourceLeft);
168 QSortFilterProxyModelHelper::setProperties(&d->m_rhsParameterData, proxyModel, sourceRight);
170 void *argv[] = {&retVal, d->m_lhsParameterData.data(), d->m_rhsParameterData.data()};
171 QMetaObject::metacall(
172 const_cast<QQmlFunctionSorter *>(
this), QMetaObject::InvokeMetaMethod,
173 d->m_method.methodIndex(), argv);
176 ? QPartialOrdering::Equivalent
177 : ((retVal < 0) ? QPartialOrdering::Less : QPartialOrdering::Greater);