Add enums support to QObject module APIs
authorChris Adams <christopher.adams@nokia.com>
Mon, 22 Aug 2011 07:01:04 +0000 (17:01 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 31 Aug 2011 03:03:34 +0000 (05:03 +0200)
This commit adds support for retrieving enum values from QObject
module APIs.

Task-number: QTBUG-21033
Task-number: QTBUG-21056
Change-Id: Ib2bd107f3f5905e2d2d35f8a20c55045ef9bb322
Reviewed-on: http://codereview.qt.nokia.com/3291
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>

src/declarative/qml/v8/qv8typewrapper.cpp
tests/auto/declarative/qdeclarativeecmascript/data/moduleapi/qobjectModuleApiEnums.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/testtypes.h
tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp

index dc99cbb..f46aaab 100644 (file)
@@ -185,6 +185,24 @@ v8::Handle<v8::Value> QV8TypeWrapper::Getter(v8::Local<v8::String> property,
             }
 
             if (moduleApi->qobjectApi) {
+                // check for enum value
+                if (QV8Engine::startsWithUpper(property)) {
+                    if (resource->mode == IncludeEnums) {
+                        QString name = v8engine->toString(property);
+
+                        // ### Optimize
+                        QByteArray enumName = name.toUtf8();
+                        const QMetaObject *metaObject = moduleApi->qobjectApi->metaObject();
+                        for (int ii = metaObject->enumeratorCount() - 1; ii >= 0; --ii) {
+                            QMetaEnum e = metaObject->enumerator(ii);
+                            int value = e.keyToValue(enumName.constData());
+                            if (value != -1)
+                                return v8::Integer::New(value);
+                        }
+                    }
+                }
+
+                // check for property.
                 v8::Handle<v8::Value> rv = v8engine->qobjectWrapper()->getProperty(moduleApi->qobjectApi, propertystring, QV8QObjectWrapper::IgnoreRevision);
                 return rv;
             } else if (moduleApi->scriptApi.isValid()) {
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/moduleapi/qobjectModuleApiEnums.qml b/tests/auto/declarative/qdeclarativeecmascript/data/moduleapi/qobjectModuleApiEnums.qml
new file mode 100644 (file)
index 0000000..da5ffd5
--- /dev/null
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+import Qt.test.qobjectApi 1.0 as QtTestQObjectApi               // qobject module API installed into new uri
+
+QtObject {
+    property int enumValue: QtTestQObjectApi.EnumValue2;
+    property int enumMethod: QtTestQObjectApi.qobjectEnumTestMethod(QtTestQObjectApi.EnumValue1);
+}
+
index d88fcd0..2738ee3 100644 (file)
@@ -934,6 +934,7 @@ private:
 class testQObjectApi : public QObject
 {
     Q_OBJECT
+    Q_ENUMS(MyEnum)
     Q_PROPERTY (int qobjectTestProperty READ qobjectTestProperty NOTIFY qobjectTestPropertyChanged)
     Q_PROPERTY (int qobjectTestWritableProperty READ qobjectTestWritableProperty WRITE setQObjectTestWritableProperty NOTIFY qobjectTestWritablePropertyChanged)
 
@@ -945,6 +946,8 @@ public:
 
     ~testQObjectApi() {}
 
+    enum MyEnum { EnumValue1 = 25, EnumValue2 = 42 };
+    Q_INVOKABLE int qobjectEnumTestMethod(MyEnum val) { return (static_cast<int>(val) + 5); }
     Q_INVOKABLE int qobjectTestMethod(int increment = 1) { m_methodCallCount += increment; return m_methodCallCount; }
 
     int qobjectTestProperty() const { return m_testProperty; }
index 111c04d..f14db0a 100644 (file)
@@ -2815,6 +2815,17 @@ void tst_qdeclarativeecmascript::moduleApi_data()
             << (QStringList() << "readBack" << "unchanged")
             << (QVariantList() << 30 << 42);
 
+    QTest::newRow("qobject module API enum values in JS")
+            << TEST_FILE("moduleapi/qobjectModuleApiEnums.qml")
+            << QString()
+            << QStringList()
+            << (QStringList() << "enumValue" << "enumMethod")
+            << (QVariantList() << 42 << 30)
+            << QStringList()
+            << QVariantList()
+            << QStringList()
+            << QVariantList();
+
     QTest::newRow("qobject, invalid major version fail")
             << TEST_FILE("moduleapi/moduleApiMajorVersionFail.qml")
             << QString("QDeclarativeComponent: Component is not ready")