aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
authorChris Adams <christopher.adams@nokia.com>2011-08-22 15:51:28 +1000
committerQt by Nokia <qt-info@nokia.com>2011-09-02 01:34:21 +0200
commit6080375fed90c09bfabb96a0319817f14f693b05 (patch)
tree2f91acc1e37cf5a747086066b741fa68fa0bbe57 /src/declarative
parentd481f2ff518df1e44103d1850e7d52bd69260c34 (diff)
Allow conversion of QObject Module API to QVariant
This commit adds a conversion codepath for QV8TypeResource to QVariant where the resource contains a QObject module API. This allows such a module API to be used as the "target" in a Connections element. Task-number: QTBUG-20937 Change-Id: I9214b531968f2e6981a86e643859a97297c6a02a Reviewed-on: http://codereview.qt.nokia.com/3286 Reviewed-by: Chris Adams <christopher.adams@nokia.com> Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Diffstat (limited to 'src/declarative')
-rw-r--r--src/declarative/qml/v8/qv8engine.cpp3
-rw-r--r--src/declarative/qml/v8/qv8typewrapper.cpp28
-rw-r--r--src/declarative/qml/v8/qv8typewrapper_p.h1
3 files changed, 31 insertions, 1 deletions
diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp
index 8eaf9024ea..5b74f48170 100644
--- a/src/declarative/qml/v8/qv8engine.cpp
+++ b/src/declarative/qml/v8/qv8engine.cpp
@@ -208,7 +208,6 @@ QVariant QV8Engine::toVariant(v8::Handle<v8::Value> value, int typeHint)
if (r) {
switch (r->resourceType()) {
case QV8ObjectResource::ContextType:
- case QV8ObjectResource::TypeType:
case QV8ObjectResource::XMLHttpRequestType:
case QV8ObjectResource::DOMNodeType:
case QV8ObjectResource::SQLDatabaseType:
@@ -216,6 +215,8 @@ QVariant QV8Engine::toVariant(v8::Handle<v8::Value> value, int typeHint)
case QV8ObjectResource::Context2DType:
case QV8ObjectResource::ParticleDataType:
return QVariant();
+ case QV8ObjectResource::TypeType:
+ return m_typeWrapper.toVariant(r);
case QV8ObjectResource::QObjectType:
return qVariantFromValue<QObject *>(m_qobjectWrapper.toQObject(r));
case QV8ObjectResource::ListType:
diff --git a/src/declarative/qml/v8/qv8typewrapper.cpp b/src/declarative/qml/v8/qv8typewrapper.cpp
index f46aaab320..c89d5ab8ae 100644
--- a/src/declarative/qml/v8/qv8typewrapper.cpp
+++ b/src/declarative/qml/v8/qv8typewrapper.cpp
@@ -128,6 +128,34 @@ v8::Local<v8::Object> QV8TypeWrapper::newObject(QObject *o, QDeclarativeTypeName
return rv;
}
+QVariant QV8TypeWrapper::toVariant(QV8ObjectResource *r)
+{
+ Q_ASSERT(r->resourceType() == QV8ObjectResource::TypeType);
+ QV8TypeResource *resource = static_cast<QV8TypeResource *>(r);
+ QV8Engine *v8engine = resource->engine;
+
+ if (resource->typeNamespace) {
+ if (QDeclarativeMetaType::ModuleApiInstance *moduleApi = resource->typeNamespace->moduleApi(resource->importNamespace)) {
+ if (moduleApi->scriptCallback) {
+ moduleApi->scriptApi = moduleApi->scriptCallback(v8engine->engine(), v8engine->engine());
+ moduleApi->scriptCallback = 0;
+ moduleApi->qobjectCallback = 0;
+ } else if (moduleApi->qobjectCallback) {
+ moduleApi->qobjectApi = moduleApi->qobjectCallback(v8engine->engine(), v8engine->engine());
+ moduleApi->scriptCallback = 0;
+ moduleApi->qobjectCallback = 0;
+ }
+
+ if (moduleApi->qobjectApi) {
+ return QVariant::fromValue<QObject*>(moduleApi->qobjectApi);
+ }
+ }
+ }
+
+ // only QObject Module API can be converted to a variant.
+ return QVariant();
+}
+
v8::Handle<v8::Value> QV8TypeWrapper::Getter(v8::Local<v8::String> property,
const v8::AccessorInfo &info)
{
diff --git a/src/declarative/qml/v8/qv8typewrapper_p.h b/src/declarative/qml/v8/qv8typewrapper_p.h
index 2e79946a6e..f9309f8e28 100644
--- a/src/declarative/qml/v8/qv8typewrapper_p.h
+++ b/src/declarative/qml/v8/qv8typewrapper_p.h
@@ -75,6 +75,7 @@ public:
v8::Local<v8::Object> newObject(QObject *, QDeclarativeType *, TypeNameMode = IncludeEnums);
v8::Local<v8::Object> newObject(QObject *, QDeclarativeTypeNameCache *, const void *,
TypeNameMode = IncludeEnums);
+ QVariant toVariant(QV8ObjectResource *);
private:
static v8::Handle<v8::Value> Getter(v8::Local<v8::String> property,