Loading...
Searching...
No Matches
VariantToJs.hpp
1#pragma once
2#include <QJSEngine>
3#include <QJSManagedValue>
4#include <QJSValue>
5#include <QVariant>
6
7#include <type_traits>
8
9namespace JS
10{
17inline QJSValue variantToJs(QJSEngine& engine, const QVariant& v);
18
19namespace detail
20{
21template <typename Map>
22inline QJSValue mapToJs(QJSEngine& engine, const Map& map)
23{
24 QJSManagedValue obj(engine.newObject(), &engine);
25 for(auto it = map.cbegin(); it != map.cend(); ++it)
26 obj.setProperty(it.key(), variantToJs(engine, it.value()));
27 return obj.toJSValue();
28}
29
30template <typename List>
31inline QJSValue listToJs(QJSEngine& engine, const List& list)
32{
33 QJSManagedValue arr(engine.newArray(uint(list.size())), &engine);
34 for(qsizetype i = 0; i < list.size(); i++)
35 {
36 if constexpr(std::is_same_v<typename List::value_type, QString>)
37 arr.setProperty(quint32(i), QJSValue(list[i]));
38 else
39 arr.setProperty(quint32(i), variantToJs(engine, list[i]));
40 }
41 return arr.toJSValue();
42}
43
44template <typename T>
45inline const T& get(const QVariant& v) noexcept
46{
47 return *static_cast<const T*>(v.constData());
48}
49}
50
51inline QJSValue variantToJs(QJSEngine& engine, const QVariant& v)
52{
53 switch(v.metaType().id())
54 {
55 case QMetaType::Double:
56 return QJSValue(detail::get<double>(v));
57 case QMetaType::Int:
58 return QJSValue(detail::get<int>(v));
59 case QMetaType::Bool:
60 return QJSValue(detail::get<bool>(v));
61 case QMetaType::QString:
62 return QJSValue(detail::get<QString>(v));
63 case QMetaType::QVariantList:
64 return detail::listToJs(engine, detail::get<QVariantList>(v));
65 case QMetaType::QStringList:
66 return detail::listToJs(engine, detail::get<QStringList>(v));
67 case QMetaType::QVariantMap:
68 return detail::mapToJs(engine, detail::get<QVariantMap>(v));
69 case QMetaType::QVariantHash:
70 return detail::mapToJs(engine, detail::get<QVariantHash>(v));
71 default:
72 // A value from another engine (a script calling uiToExecution itself)
73 // cannot be handed over as is.
74 if(v.metaType() == QMetaType::fromType<QJSValue>())
75 return variantToJs(engine, detail::get<QJSValue>(v).toVariant());
76 return engine.toScriptValue(v);
77 }
78}
79}