54QQmlFunctionSorter::~QQmlFunctionSorter()
56 Q_D(QQmlFunctionSorter);
57 if (d->m_lhsParameterData.metaType().flags() & QMetaType::PointerToQObject)
58 delete d->m_lhsParameterData.value<QObject *>();
59 if (d->m_rhsParameterData.metaType().flags() & QMetaType::PointerToQObject)
60 delete d->m_rhsParameterData.value<QObject *>();
63void QQmlFunctionSorter::componentComplete()
65 Q_D(QQmlFunctionSorter);
66 const auto *metaObj =
this->metaObject();
67 for (
int idx = metaObj->methodOffset(); idx < metaObj->methodCount(); idx++) {
69 QMetaMethod method = metaObj->method(idx);
70 if (method.nameView() ==
"sort") {
76 if (!d->m_method.isValid())
79 if (d->m_method.parameterCount() != 2) {
80 qWarning(
"sort method requires two parameters");
84 QQmlData *data = QQmlData::get(
this);
85 if (!data || !data->outerContext) {
86 qWarning(
"sort requires a QML context");
90 const QMetaType parameterType = d->m_method.parameterMetaType(0);
91 if (parameterType != d->m_method.parameterMetaType(1)) {
92 qWarning(
"sort parameters have to be equal");
96 auto cu = QQmlMetaType::obtainCompilationUnit(parameterType);
97 const QQmlType parameterQmlType = QQmlMetaType::qmlType(parameterType);
99 QQmlRefPointer<QQmlContextData> context = data->outerContext;
100 QQmlEngine *engine = context->engine();
112 if (parameterType.flags() & QMetaType::PointerToQObject) {
113 QObject *created0 =
nullptr;
114 QObject *created1 =
nullptr;
115 if (parameterQmlType.isInlineComponentType()) {
116 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
117 const QString icName = parameterQmlType.elementName();
118 created0 = QQmlObjectCreator(context, executableCu, context, icName).create(
119 executableCu->inlineComponentId(icName),
nullptr,
nullptr,
120 QQmlObjectCreator::InlineComponent);
121 created1 = QQmlObjectCreator(context, executableCu, context, icName).create(
122 executableCu->inlineComponentId(icName),
nullptr,
nullptr,
123 QQmlObjectCreator::InlineComponent);
124 }
else if (parameterQmlType.isComposite()) {
125 const auto executableCu = engine->handle()->executableCompilationUnit(std::move(cu));
126 created0 = QQmlObjectCreator(context, executableCu, context, QString()).create();
127 created1 = QQmlObjectCreator(context, executableCu, context, QString()).create();
129 created0 = parameterQmlType.metaObject()->newInstance();
130 created1 = parameterQmlType.metaObject()->newInstance();
133 const auto names = d->m_method.parameterNames();
134 created0->setObjectName(names[0]);
135 created1->setObjectName(names[1]);
136 d->m_lhsParameterData = QVariant::fromValue(created0);
137 d->m_rhsParameterData = QVariant::fromValue(created1);
139 d->m_lhsParameterData = QVariant(parameterType);
140 d->m_rhsParameterData = QVariant(parameterType);
147QPartialOrdering QQmlFunctionSorter::compare(
148 const QModelIndex& sourceLeft,
const QModelIndex& sourceRight,
149 const QQmlSortFilterProxyModel *proxyModel)
const
151 Q_D(
const QQmlFunctionSorter);
152 if (!d->m_method.isValid()
153 || !d->m_lhsParameterData.isValid()
154 || !d->m_rhsParameterData.isValid()) {
155 return QPartialOrdering::Unordered;
159 QSortFilterProxyModelHelper::setProperties(&d->m_lhsParameterData, proxyModel, sourceLeft);
160 QSortFilterProxyModelHelper::setProperties(&d->m_rhsParameterData, proxyModel, sourceRight);
162 void *argv[] = {&retVal, d->m_lhsParameterData.data(), d->m_rhsParameterData.data()};
163 QMetaObject::metacall(
164 const_cast<QQmlFunctionSorter *>(
this), QMetaObject::InvokeMetaMethod,
165 d->m_method.methodIndex(), argv);
168 ? QPartialOrdering::Equivalent
169 : ((retVal < 0) ? QPartialOrdering::Less : QPartialOrdering::Greater);