Skip to content

Commit

Permalink
Support unregistered Qt namespace enums in QML methods.
Browse files Browse the repository at this point in the history
This brings the support in line with signal handlers, which should allow
us to reuse the implementation there when appropriate. Also adds tests
for both registered and unregisted Qt namespace enums.

Change-Id: I366846626fc44d6d99b51e93fc9e3cb948c748f9
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
  • Loading branch information
Michael Brasser authored and Qt by Nokia committed Mar 21, 2012
1 parent 37cd29b commit 16c1928
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/qml/qml/qqmlpropertycache.cpp
Expand Up @@ -682,7 +682,13 @@ QStringList QQmlPropertyCache::propertyNames() const
return keys;
}

static int EnumType(const QMetaObject *meta, const QByteArray &str)
struct StaticQtMetaObject : public QObject
{
static const QMetaObject *get()
{ return &static_cast<StaticQtMetaObject*> (0)->staticQtMetaObject; }
};

static int EnumType(const QMetaObject *metaobj, const QByteArray &str)
{
QByteArray scope;
QByteArray name;
Expand All @@ -693,6 +699,11 @@ static int EnumType(const QMetaObject *meta, const QByteArray &str)
} else {
name = str;
}
const QMetaObject *meta;
if (scope == "Qt")
meta = StaticQtMetaObject::get();
else
meta = metaobj;
for (int i = meta->enumeratorCount() - 1; i >= 0; --i) {
QMetaEnum m = meta->enumerator(i);
if ((m.name() == name) && (scope.isEmpty() || (m.scope() == scope)))
Expand Down
12 changes: 12 additions & 0 deletions tests/auto/qml/qqmllanguage/data/globalEnums.qml
Expand Up @@ -19,13 +19,25 @@ Item {
bValue = newValue;
}

onValueCChanged: {
cValue = newValue;
}

onValueDChanged: {
dValue = newValue;
}

property int aValue: 0
property int bValue: 0
property int cValue: 0
property int dValue: 0
}

function setEnumValues() {
enum1Class.setValue(MyEnum1Class.A_13);
enumDerivedClass.setValueA(MyEnum1Class.A_11);
enumDerivedClass.setValueB(MyEnum2Class.B_37);
enumDerivedClass.setValueC(Qt.RichText);
enumDerivedClass.setValueD(Qt.ElideMiddle);
}
}
9 changes: 9 additions & 0 deletions tests/auto/qml/qqmllanguage/testtypes.h
Expand Up @@ -854,17 +854,25 @@ class MyEnum2Class : public QObject

MyEnum1Class::EnumA getValueA() { return valueA; }
EnumB getValueB() { return valueB; }
Qt::TextFormat getValueC() { return valueC; }
Qt::TextElideMode getValueD() { return valueD; }

Q_INVOKABLE void setValueA(MyEnum1Class::EnumA v) { valueA = v; emit valueAChanged(v); }
Q_INVOKABLE void setValueB(EnumB v) { valueB = v; emit valueBChanged(v); }
Q_INVOKABLE void setValueC(Qt::TextFormat v) { valueC = v; emit valueCChanged(v); } //registered
Q_INVOKABLE void setValueD(Qt::TextElideMode v) { valueD = v; emit valueDChanged(v); } //unregistered

signals:
void valueAChanged(MyEnum1Class::EnumA newValue);
void valueBChanged(MyEnum2Class::EnumB newValue);
void valueCChanged(Qt::TextFormat newValue);
void valueDChanged(Qt::TextElideMode newValue);

private:
MyEnum1Class::EnumA valueA;
EnumB valueB;
Qt::TextFormat valueC;
Qt::TextElideMode valueD;
};

class MyEnumDerivedClass : public MyEnum2Class
Expand All @@ -874,6 +882,7 @@ class MyEnumDerivedClass : public MyEnum2Class

Q_DECLARE_METATYPE(MyEnum2Class::EnumB)
Q_DECLARE_METATYPE(MyEnum1Class::EnumA)
Q_DECLARE_METATYPE(Qt::TextFormat)

QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered)
QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered)
Expand Down
7 changes: 7 additions & 0 deletions tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp
Expand Up @@ -2293,6 +2293,7 @@ void tst_qqmllanguage::globalEnums()
{
qRegisterMetaType<MyEnum1Class::EnumA>();
qRegisterMetaType<MyEnum2Class::EnumB>();
qRegisterMetaType<Qt::TextFormat>();

QQmlComponent component(&engine, TEST_FILE("globalEnums.qml"));

Expand All @@ -2310,6 +2311,8 @@ void tst_qqmllanguage::globalEnums()

QVERIFY(enum2Class->property("aValue") == 0);
QVERIFY(enum2Class->property("bValue") == 0);
QVERIFY(enum2Class->property("cValue") == 0);
QVERIFY(enum2Class->property("dValue") == 0);

QSignalSpy signalA(enum2Class, SIGNAL(valueAChanged(MyEnum1Class::EnumA)));
QSignalSpy signalB(enum2Class, SIGNAL(valueBChanged(MyEnum2Class::EnumB)));
Expand All @@ -2319,12 +2322,16 @@ void tst_qqmllanguage::globalEnums()
QVERIFY(enum1Class->getValue() == MyEnum1Class::A_13);
QVERIFY(enum2Class->getValueA() == MyEnum1Class::A_11);
QVERIFY(enum2Class->getValueB() == MyEnum2Class::B_37);
QVERIFY(enum2Class->getValueC() == Qt::RichText);
QVERIFY(enum2Class->getValueD() == Qt::ElideMiddle);

QVERIFY(signalA.count() == 1);
QVERIFY(signalB.count() == 1);

QVERIFY(enum2Class->property("aValue") == MyEnum1Class::A_11);
QVERIFY(enum2Class->property("bValue") == 37);
QVERIFY(enum2Class->property("cValue") == 1);
QVERIFY(enum2Class->property("dValue") == 2);

delete o;
}
Expand Down

0 comments on commit 16c1928

Please sign in to comment.