17 #ifndef hifi_ScriptEngineCast_h
18 #define hifi_ScriptEngineCast_h
22 #include <QtCore/QMetaType>
23 #include <QtCore/QMetaEnum>
24 #include <QtCore/QDebug>
26 #include "ScriptEngine.h"
27 #include "ScriptValue.h"
35 return engine->create(qMetaTypeId<T>(), &t);
44 return engine->create(v.userType(), v.data());
49 inline T scriptvalue_cast(
const ScriptValue& value) {
50 const int id = qMetaTypeId<T>();
52 auto engine = value.engine();
54 QVariant varValue = engine->convert(value,
id);
55 if (varValue.isValid()) {
56 return varValue.value<T>();
59 if (value.isVariant()) {
60 return qvariant_cast<T>(value.toVariant());
67 inline QVariant scriptvalue_cast<QVariant>(
const ScriptValue& value) {
68 return value.toVariant();
71 template <
typename T, ScriptValue (*f)(ScriptEngine*, const T&)>
74 auto &src = *(
reinterpret_cast<const T*
>(p));
75 return f(engine, src);
78 template <
typename T,
bool (*f)(const ScriptValue&, T&)>
79 bool fromScriptValueWrapper(
const ScriptValue& val, QVariant &destV) {
82 bool result = f(val, dest);
87 template <
typename T, ScriptValue (*toScriptValue)(ScriptEngine*, const T&),
bool (*fromScriptValue)(const ScriptValue&, T&)>
88 int scriptRegisterMetaType(
ScriptEngine* eng,
const char* name =
"",
92 if (strlen(name) > 0) {
93 id = qRegisterMetaType<T>(name);
95 id = qRegisterMetaType<T>();
97 eng->registerCustomType(
id, toScriptValueWrapper<T, toScriptValue>,
98 fromScriptValueWrapper<T, fromScriptValue>);
103 template <
typename T>
104 int scriptRegisterMetaTypeWithLambdas(
ScriptEngine* eng,
106 bool (*fromScriptValue)(
const ScriptValue&, QVariant &dest),
const char* name =
"",
110 if (strlen(name) > 0) {
111 id = qRegisterMetaType<T>(name);
113 id = qRegisterMetaType<T>();
115 eng->registerCustomType(
id, toScriptValue,
120 template <
class Container>
123 typename Container::const_iterator begin = cont.begin();
124 typename Container::const_iterator end = cont.end();
125 typename Container::const_iterator it;
127 for (it = begin, i = 0; it != end; ++it, ++i) {
128 a.setProperty(i, eng->toScriptValue(*it));
133 template <
class Container>
134 bool scriptValueToSequence(
const ScriptValue& value, Container& cont) {
135 quint32 len = value.property(QLatin1String(
"length")).toUInt32();
136 for (quint32 i = 0; i < len; ++i) {
138 cont.push_back(scriptvalue_cast<typename Container::value_type>(item));
145 ScriptValue a = eng->newValue(
static_cast<int>(enumValue));
150 bool scriptValueToEnumClass(
const ScriptValue& value, T& enumValue) {
151 if(!value.isNumber()){
152 qCDebug(scriptengine) <<
"ScriptValue \"" << value.toQObject()->metaObject()->className() <<
"\" is not a number";
155 QMetaEnum metaEnum = QMetaEnum::fromType<T>();
156 if (!metaEnum.isValid()) {
157 qCDebug(scriptengine) <<
"Invalid QMetaEnum";
160 bool isValid =
false;
161 int enumInteger =
static_cast<int>(value.toInteger());
162 for(
int i = 0; i < metaEnum.keyCount(); i++){
163 if (metaEnum.value(i) == enumInteger) {
169 enumValue =
static_cast<T
>(enumInteger);
172 qCDebug(scriptengine) <<
"ScriptValue has invalid value " << value.toInteger() <<
" for enum" << metaEnum.name();
177 template <
typename T>
178 int scriptRegisterSequenceMetaType(
ScriptEngine* engine,
180 return scriptRegisterMetaType<T, scriptValueFromSequence, scriptValueToSequence>(engine);
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40