From b411c4db37bcbb5152bf8e8b225e259c05c46b59 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Mon, 5 Oct 2009 18:37:48 +1000 Subject: Support all variant types as signal parameters --- src/declarative/qml/qmlmetatype.cpp | 206 +++++++++++++++++++-- .../qmlecmascript/data/signalParameterTypes.qml | 16 ++ .../qmlecmascript/tst_qmlecmascript.cpp | 16 +- 3 files changed, 219 insertions(+), 19 deletions(-) create mode 100644 tests/auto/declarative/qmlecmascript/data/signalParameterTypes.qml diff --git a/src/declarative/qml/qmlmetatype.cpp b/src/declarative/qml/qmlmetatype.cpp index 14d85ff..663e8e0 100644 --- a/src/declarative/qml/qmlmetatype.cpp +++ b/src/declarative/qml/qmlmetatype.cpp @@ -929,6 +929,30 @@ QList QmlMetaType::qmlTypes() return data->nameToType.values(); } +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include + /*! Copies \a copy into \a data, assuming they both are of type \a type. If \a copy is zero, a default type is copied. Returns true if the copy was @@ -988,7 +1012,6 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QChar: *static_cast(data) = *static_cast(copy); return true; -#ifndef QT_BOOTSTRAPPED case QMetaType::QVariantMap: *static_cast(data) = *static_cast(copy); return true; @@ -998,7 +1021,6 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QVariantList: *static_cast(data) = *static_cast(copy); return true; -#endif case QMetaType::QByteArray: *static_cast(data) = *static_cast(copy); return true; @@ -1008,11 +1030,9 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QStringList: *static_cast(data) = *static_cast(copy); return true; -#ifndef QT_BOOTSTRAPPED case QMetaType::QBitArray: *static_cast(data) = *static_cast(copy); return true; -#endif case QMetaType::QDate: *static_cast(data) = *static_cast(copy); return true; @@ -1022,15 +1042,12 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QDateTime: *static_cast(data) = *static_cast(copy); return true; -#ifndef QT_BOOTSTRAPPED case QMetaType::QUrl: *static_cast(data) = *static_cast(copy); return true; -#endif case QMetaType::QLocale: *static_cast(data) = *static_cast(copy); return true; -#ifndef QT_NO_GEOM_VARIANT case QMetaType::QRect: *static_cast(data) = *static_cast(copy); return true; @@ -1058,7 +1075,6 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QVector3D: *static_cast(data) = *static_cast(copy); return true; -#endif #ifndef QT_NO_REGEXP case QMetaType::QRegExp: *static_cast(data) = *static_cast(copy); @@ -1066,8 +1082,90 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) #endif case QMetaType::Void: return true; + + +#ifdef QT3_SUPPORT + case QMetaType::QColorGroup: + *static_cast(data) = *static_cast(copy); + return true; +#endif + + case QMetaType::QFont: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QPixmap: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QBrush: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QColor: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QPalette: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QIcon: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QImage: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QPolygon: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QRegion: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QBitmap: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QCursor: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QSizePolicy: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QKeySequence: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QPen: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QTextLength: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QTextFormat: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QMatrix: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QTransform: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QMatrix4x4: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QVector2D: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QVector4D: + *static_cast(data) = *static_cast(copy); + return true; + case QMetaType::QQuaternion: + *static_cast(data) = *static_cast(copy); + return true; + default: - ; + if (type == qMetaTypeId()) { + *static_cast(data) = *static_cast(copy); + return true; + } else if (typeCategory(type) != Unknown) { + *static_cast(data) = *static_cast(copy); + return true; + } + break; } } else { switch(type) { @@ -1118,7 +1216,6 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QChar: *static_cast(data) = NS(QChar)(); return true; -#ifndef QT_BOOTSTRAPPED case QMetaType::QVariantMap: *static_cast(data) = NS(QVariantMap)(); return true; @@ -1128,7 +1225,6 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QVariantList: *static_cast(data) = NS(QVariantList)(); return true; -#endif case QMetaType::QByteArray: *static_cast(data) = NS(QByteArray)(); return true; @@ -1138,11 +1234,9 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QStringList: *static_cast(data) = NS(QStringList)(); return true; -#ifndef QT_BOOTSTRAPPED case QMetaType::QBitArray: *static_cast(data) = NS(QBitArray)(); return true; -#endif case QMetaType::QDate: *static_cast(data) = NS(QDate)(); return true; @@ -1152,15 +1246,12 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QDateTime: *static_cast(data) = NS(QDateTime)(); return true; -#ifndef QT_BOOTSTRAPPED case QMetaType::QUrl: *static_cast(data) = NS(QUrl)(); return true; -#endif case QMetaType::QLocale: *static_cast(data) = NS(QLocale)(); return true; -#ifndef QT_NO_GEOM_VARIANT case QMetaType::QRect: *static_cast(data) = NS(QRect)(); return true; @@ -1188,7 +1279,6 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) case QMetaType::QVector3D: *static_cast(data) = NS(QVector3D)(); return true; -#endif #ifndef QT_NO_REGEXP case QMetaType::QRegExp: *static_cast(data) = NS(QRegExp)(); @@ -1196,8 +1286,88 @@ bool QmlMetaType::copy(int type, void *data, const void *copy) #endif case QMetaType::Void: return true; + +#ifdef QT3_SUPPORT + case QMetaType::QColorGroup: + *static_cast(data) = NS(QColorGroup)(); + return true; +#endif + + case QMetaType::QFont: + *static_cast(data) = NS(QFont)(); + return true; + case QMetaType::QPixmap: + *static_cast(data) = NS(QPixmap)(); + return true; + case QMetaType::QBrush: + *static_cast(data) = NS(QBrush)(); + return true; + case QMetaType::QColor: + *static_cast(data) = NS(QColor)(); + return true; + case QMetaType::QPalette: + *static_cast(data) = NS(QPalette)(); + return true; + case QMetaType::QIcon: + *static_cast(data) = NS(QIcon)(); + return true; + case QMetaType::QImage: + *static_cast(data) = NS(QImage)(); + return true; + case QMetaType::QPolygon: + *static_cast(data) = NS(QPolygon)(); + return true; + case QMetaType::QRegion: + *static_cast(data) = NS(QRegion)(); + return true; + case QMetaType::QBitmap: + *static_cast(data) = NS(QBitmap)(); + return true; + case QMetaType::QCursor: + *static_cast(data) = NS(QCursor)(); + return true; + case QMetaType::QSizePolicy: + *static_cast(data) = NS(QSizePolicy)(); + return true; + case QMetaType::QKeySequence: + *static_cast(data) = NS(QKeySequence)(); + return true; + case QMetaType::QPen: + *static_cast(data) = NS(QPen)(); + return true; + case QMetaType::QTextLength: + *static_cast(data) = NS(QTextLength)(); + return true; + case QMetaType::QTextFormat: + *static_cast(data) = NS(QTextFormat)(); + return true; + case QMetaType::QMatrix: + *static_cast(data) = NS(QMatrix)(); + return true; + case QMetaType::QTransform: + *static_cast(data) = NS(QTransform)(); + return true; + case QMetaType::QMatrix4x4: + *static_cast(data) = NS(QMatrix4x4)(); + return true; + case QMetaType::QVector2D: + *static_cast(data) = NS(QVector2D)(); + return true; + case QMetaType::QVector4D: + *static_cast(data) = NS(QVector4D)(); + return true; + case QMetaType::QQuaternion: + *static_cast(data) = NS(QQuaternion)(); + return true; default: - ; + if (type == qMetaTypeId()) { + *static_cast(data) = NS(QVariant)(); + return true; + } else if (typeCategory(type) != Unknown) { + *static_cast(data) = 0; + return true; + } + break; } } diff --git a/tests/auto/declarative/qmlecmascript/data/signalParameterTypes.qml b/tests/auto/declarative/qmlecmascript/data/signalParameterTypes.qml new file mode 100644 index 0000000..42d26a1 --- /dev/null +++ b/tests/auto/declarative/qmlecmascript/data/signalParameterTypes.qml @@ -0,0 +1,16 @@ +import Qt.test 1.0 + +MyQmlObject +{ + id: Root + property int intProperty + property real realProperty + property color colorProperty + property var variantProperty + + signal mySignal(int a, real b, color c, var d) + + onMySignal: { intProperty = a; realProperty = b; colorProperty = c; variantProperty = d; } + + onBasicSignal: Root.mySignal(10, 19.2, Qt.rgba(1, 1, 0, 1), Qt.rgba(1, 0, 1, 1)) +} diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp index 00c3475..65f7021 100644 --- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp +++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp @@ -52,6 +52,7 @@ private slots: void aliasPropertyAndBinding(); void nonExistantAttachedObject(); void scope(); + void signalParameterTypes(); private: QmlEngine engine; @@ -529,7 +530,6 @@ void tst_qmlecmascript::nonExistantAttachedObject() void tst_qmlecmascript::scope() { QmlComponent component(&engine, TEST_FILE("scope.qml")); - qWarning() << component.errors(); QObject *object = component.create(); QVERIFY(object != 0); @@ -543,6 +543,20 @@ void tst_qmlecmascript::scope() QCOMPARE(object->property("test8").toInt(), 2); } +void tst_qmlecmascript::signalParameterTypes() +{ + QmlComponent component(&engine, TEST_FILE("signalParameterTypes.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + emit object->basicSignal(); + + QCOMPARE(object->property("intProperty").toInt(), 10); + QCOMPARE(object->property("realProperty").toReal(), 19.2); + QVERIFY(object->property("colorProperty").value() == QColor(255, 255, 0, 255)); + QVERIFY(object->property("variantProperty") == QVariant::fromValue(QColor(255, 0, 255, 255))); +} + /* Confirm bindings and alias properties can coexist. -- cgit v0.12