24#include "customtyperegistry_p.h"
25#include "metaenumvariable_p.h"
27#include <QtCore/QDebug>
29#include <QAssociativeIterable>
32#include <QJsonDocument>
33#include <QSequentialIterable>
37Q_GLOBAL_STATIC(CustomTypeRegistry, customTypes)
39void Cutelee::MetaType::internalLock() {
return customTypes()->mutex.lock(); }
41void Cutelee::MetaType::internalUnlock()
43 return customTypes()->mutex.unlock();
46void Cutelee::MetaType::registerLookUpOperator(
int id, LookupFunction f)
51 customTypes()->registerLookupOperator(
id, f);
59 if (property == QStringLiteral(
"children")) {
60 const auto childList =
object->children();
61 if (childList.isEmpty())
63 QVariantList children;
65 auto it = childList.constBegin();
66 const auto end = childList.constEnd();
67 for (; it != end; ++it)
72 if (property == QStringLiteral(
"objectName")) {
73 return object->objectName();
76 auto metaObj =
object->metaObject();
79 for (
auto i = 0; i < metaObj->propertyCount(); ++i) {
82 mp = metaObj->property(i);
92 return mp.
read(
object);
95 for (
auto i = 0; i < metaObj->enumeratorCount(); ++i) {
96 me = metaObj->enumerator(i);
99 MetaEnumVariable mev(me);
108 const MetaEnumVariable mev(me, value);
123 const int listIndex =
property.
toInt(&ok);
124 if (!ok || listIndex >= list.
size()) {
140 list.reserve(obj.
size());
142 list.push_back(QVariantList{it.key(), it.value().toVariant()});
153 list.reserve(obj.
size());
155 list.push_back(it.value().toVariant());
166 if (
object.canConvert<QObject *>()) {
167 return doQobjectLookUp(
object.value<QObject *>(), property);
170 const auto doc =
object.toJsonDocument();
171 if (doc.isObject()) {
172 return doJsonObjectLookUp(doc.object(), property);
175 return doJsonArrayLookUp(doc.array(), property);
180 const auto val =
object.toJsonValue();
182 switch (val.type()) {
186 return val.toDouble();
188 return val.toString();
190 return doJsonArrayLookUp(val.toArray(), property);
192 return doJsonObjectLookUp(val.toObject(), property);
198 return doJsonArrayLookUp(
object.toJsonArray(), property);
201 return doJsonObjectLookUp(
object.toJsonObject(), property);
203 if (
object.canConvert<QVariantList>()) {
205 if (property == QStringLiteral(
"size")
206 || property == QStringLiteral(
"count")) {
211 const auto listIndex =
property.toInt(&ok);
213 if (!ok || listIndex >= iter.size()) {
217 return iter.
at(listIndex);
219 if (
object.canConvert<QVariantHash>()) {
223 auto mappedValue = iter.
value(property);
224 if (mappedValue.isValid())
227 if (property == QStringLiteral(
"size")
228 || property == QStringLiteral(
"count")) {
232 if (property == QStringLiteral(
"items")) {
233 auto it = iter.begin();
234 const auto end = iter.end();
236 for (; it != end; ++it) {
237 list.push_back(QVariantList{it.key(), it.value()});
242 if (property == QStringLiteral(
"keys")) {
243 auto it = iter.begin();
244 const auto end = iter.end();
246 for (; it != end; ++it) {
247 list.push_back(it.key());
252 if (property == QStringLiteral(
"values")) {
253 auto it = iter.begin();
254 const auto end = iter.end();
256 for (; it != end; ++it) {
257 list.push_back(it.value());
264#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
274 const auto mp = mo->property(idx);
283 for (
auto i = 0; i < mo->enumeratorCount(); ++i) {
284 me = mo->enumerator(i);
287 MetaEnumVariable mev(me);
297 MetaEnumVariable mev(me, value);
303 return customTypes()->lookup(
object, property);
306bool Cutelee::MetaType::lookupAlreadyRegistered(
int id)
308 return customTypes()->lookupAlreadyRegistered(
id);
The Cutelee namespace holds all public Cutelee API.
QVariant value(const QVariant &key) const const
const char * constData() const const
QJsonValue at(int i) const const
const_iterator constBegin() const const
const_iterator constEnd() const const
QStringList keys() const const
QJsonValue value(const QString &key) const const
QVariant toVariant() const const
QVariant at(int idx) const const
QString fromUtf8(const char *str, int size)
QByteArray toLatin1() const const
QByteArray toUtf8() const const
QVariant fromValue(const T &value)
int toInt(bool *ok) const const