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