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>() ||
220 object.canConvert<QVariantMap>()) {
224 if (property == QStringLiteral(
"size")
225 || property == QStringLiteral(
"count")) {
229 if (property == QStringLiteral(
"items")) {
230 auto it = iter.begin();
231 const auto end = iter.end();
233 for (; it != end; ++it) {
234 list.push_back(QVariantList{it.key(), it.value()});
239 if (property == QStringLiteral(
"keys")) {
240 auto it = iter.begin();
241 const auto end = iter.end();
243 for (; it != end; ++it) {
244 list.push_back(it.key());
249 if (property == QStringLiteral(
"values")) {
250 auto it = iter.begin();
251 const auto end = iter.end();
253 for (; it != end; ++it) {
254 list.push_back(it.value());
259 auto mappedValue = iter.
value(property);
260 if (mappedValue.isValid())
271 const auto mp = mo->property(idx);
280 for (
auto i = 0; i < mo->enumeratorCount(); ++i) {
281 me = mo->enumerator(i);
284 MetaEnumVariable mev(me);
294 MetaEnumVariable mev(me, value);
300 return customTypes()->lookup(
object, property);
303bool Cutelee::MetaType::lookupAlreadyRegistered(
int id)
305 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(qsizetype i) const const
qsizetype size() const const
QJsonObject::const_iterator constBegin() const const
QJsonObject::const_iterator constEnd() const const
QStringList keys() const const
qsizetype size() const const
QJsonValue value(QLatin1StringView key) const const
QVariant toVariant() const const
QVariant at(qsizetype idx) const const
QString fromUtf8(QByteArrayView str)
QByteArray toLatin1() const const
QByteArray toUtf8() const const
QVariant fromValue(T &&value)
int toInt(bool *ok) const const