Enable literal Qt enum assignment to enum properties.
authorMichael Brasser <michael.brasser@nokia.com>
Thu, 14 Jun 2012 00:18:45 +0000 (10:18 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 21 Jun 2012 02:13:17 +0000 (04:13 +0200)
Assigning Qt global enums to enum properties was previously handled as
a binding, rather than a literal assignment.

Change-Id: If6bb65f63b34f4e10c0636221ddadb11f7025735
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
src/qml/qml/qqmlcompiler.cpp
tests/auto/qml/qqmllanguage/data/assignBasicTypes.qml
tests/auto/qml/qqmllanguage/testtypes.h
tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp

index 8450221..71c5bdc 100644 (file)
@@ -2480,6 +2480,12 @@ bool QQmlCompiler::buildPropertyLiteralAssignment(QQmlScript::Property *prop,
     return true;
 }
 
+struct StaticQtMetaObject : public QObject
+{
+    static const QMetaObject *get()
+        { return &static_cast<StaticQtMetaObject*> (0)->staticQtMetaObject; }
+};
+
 bool QQmlCompiler::testQualifiedEnumAssignment(QQmlScript::Property *prop,
                                                        QQmlScript::Object *obj,
                                                        QQmlScript::Value *v,
@@ -2523,13 +2529,13 @@ bool QQmlCompiler::testQualifiedEnumAssignment(QQmlScript::Property *prop,
     QQmlType *type = 0;
     unit->imports().resolveType(typeName, &type, 0, 0, 0, 0);
 
-    if (!type)
+    if (!type && typeName != QLatin1String("Qt"))
         return true;
 
     int value = 0;
     bool ok;
 
-    if (toQmlType(obj) == type) {
+    if (type && toQmlType(obj) == type) {
         // When these two match, we can short cut the search
         if (mprop.isFlagType()) {
             value = mprop.enumerator().keysToValue(enumValue.toUtf8().constData(), &ok);
@@ -2540,7 +2546,7 @@ bool QQmlCompiler::testQualifiedEnumAssignment(QQmlScript::Property *prop,
         // Otherwise we have to search the whole type
         // This matches the logic in QV8TypeWrapper
         QByteArray enumName = enumValue.toUtf8();
-        const QMetaObject *metaObject = type->baseMetaObject();
+        const QMetaObject *metaObject = type ? type->baseMetaObject() : StaticQtMetaObject::get();
         ok = false;
         for (int ii = metaObject->enumeratorCount() - 1; !ok && ii >= 0; --ii) {
             QMetaEnum e = metaObject->enumerator(ii);
@@ -2558,12 +2564,6 @@ bool QQmlCompiler::testQualifiedEnumAssignment(QQmlScript::Property *prop,
     return true;
 }
 
-struct StaticQtMetaObject : public QObject
-{
-    static const QMetaObject *get()
-        { return &static_cast<StaticQtMetaObject*> (0)->staticQtMetaObject; }
-};
-
 // Similar logic to above, but not knowing target property.
 int QQmlCompiler::evaluateEnum(const QHashedStringRef &scope, const QByteArray& enumValue) const
 {
index 28a3401..697278e 100644 (file)
@@ -2,6 +2,8 @@ import Test 1.0
 MyTypeObject {
     flagProperty: "FlagVal1 | FlagVal3"
     enumProperty: "EnumVal2"
+    qtEnumProperty: Qt.RichText
+    mirroredEnumProperty: Qt.AlignHCenter
     stringProperty: "Hello World!"
     uintProperty: 10
     intProperty: -19
@@ -25,4 +27,10 @@ MyTypeObject {
     urlProperty: "main.qml?with%3cencoded%3edata"
 
     objectProperty: MyTypeObject { intProperty: 8 }
+
+    property bool qtEnumTriggeredChange: false
+    onQtEnumPropertyChanged: qtEnumTriggeredChange = true
+
+    property bool mirroredEnumTriggeredChange: false
+    onMirroredEnumPropertyChanged: mirroredEnumTriggeredChange = true
 }
index b601a54..f84e42f 100644 (file)
@@ -209,6 +209,7 @@ class MyTypeObject : public QObject
 {
     Q_OBJECT
     Q_ENUMS(MyEnum)
+    Q_ENUMS(MyMirroredEnum)
     Q_FLAGS(MyFlags)
 
     Q_PROPERTY(QString id READ id WRITE setId)
@@ -217,6 +218,8 @@ class MyTypeObject : public QObject
     Q_PROPERTY(MyFlags flagProperty READ flagProperty WRITE setFlagProperty NOTIFY flagPropertyChanged)
     Q_PROPERTY(MyEnum enumProperty READ enumProperty WRITE setEnumProperty NOTIFY enumPropertyChanged)
     Q_PROPERTY(MyEnum readOnlyEnumProperty READ readOnlyEnumProperty)
+    Q_PROPERTY(Qt::TextFormat qtEnumProperty READ qtEnumProperty WRITE setQtEnumProperty NOTIFY qtEnumPropertyChanged)
+    Q_PROPERTY(MyMirroredEnum mirroredEnumProperty READ mirroredEnumProperty WRITE setMirroredEnumProperty NOTIFY mirroredEnumPropertyChanged)
     Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringPropertyChanged)
     Q_PROPERTY(uint uintProperty READ uintProperty WRITE setUintProperty NOTIFY uintPropertyChanged)
     Q_PROPERTY(int intProperty READ intProperty WRITE setIntProperty NOTIFY intPropertyChanged)
@@ -298,6 +301,28 @@ public:
         return EnumVal1;
     }
 
+    Qt::TextFormat qtEnumPropertyValue;
+    Qt::TextFormat qtEnumProperty() const {
+        return qtEnumPropertyValue;
+    }
+    void setQtEnumProperty(Qt::TextFormat v) {
+        qtEnumPropertyValue = v;
+        emit qtEnumPropertyChanged();
+    }
+
+    enum MyMirroredEnum {
+        MirroredEnumVal1 = Qt::AlignLeft,
+        MirroredEnumVal2 = Qt::AlignRight,
+        MirroredEnumVal3 = Qt::AlignHCenter };
+    MyMirroredEnum mirroredEnumPropertyValue;
+    MyMirroredEnum mirroredEnumProperty() const {
+        return mirroredEnumPropertyValue;
+    }
+    void setMirroredEnumProperty(MyMirroredEnum v) {
+        mirroredEnumPropertyValue = v;
+        emit mirroredEnumPropertyChanged();
+    }
+
     QString stringPropertyValue;
     QString stringProperty() const {
        return stringPropertyValue;
@@ -515,6 +540,8 @@ signals:
     void objectPropertyChanged();
     void flagPropertyChanged();
     void enumPropertyChanged();
+    void qtEnumPropertyChanged();
+    void mirroredEnumPropertyChanged();
     void stringPropertyChanged();
     void uintPropertyChanged();
     void intPropertyChanged();
index c6b0dd6..e324896 100644 (file)
@@ -579,6 +579,8 @@ void tst_qqmllanguage::assignBasicTypes()
     QVERIFY(object != 0);
     QCOMPARE(object->flagProperty(), MyTypeObject::FlagVal1 | MyTypeObject::FlagVal3);
     QCOMPARE(object->enumProperty(), MyTypeObject::EnumVal2);
+    QCOMPARE(object->qtEnumProperty(), Qt::RichText);
+    QCOMPARE(object->mirroredEnumProperty(), MyTypeObject::MirroredEnumVal3);
     QCOMPARE(object->stringProperty(), QString("Hello World!"));
     QCOMPARE(object->uintProperty(), uint(10));
     QCOMPARE(object->intProperty(), -19);
@@ -606,6 +608,10 @@ void tst_qqmllanguage::assignBasicTypes()
     MyTypeObject *child = qobject_cast<MyTypeObject *>(object->objectProperty());
     QVERIFY(child != 0);
     QCOMPARE(child->intProperty(), 8);
+
+    //these used to go via script. Ensure they no longer do
+    QCOMPARE(object->property("qtEnumTriggeredChange").toBool(), false);
+    QCOMPARE(object->property("mirroredEnumTriggeredChange").toBool(), false);
 }
 
 // Test edge case type assignments