From 85554f7f262ff5aae15562b11c6d08bcc03c961f Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Thu, 8 Sep 2011 15:13:42 +1000 Subject: Fix QDeclarativeListProperty assignment This commit ensures that a QDeclarativeListReference can be assigned to another QDeclarativeListProperty, by retrieving each element in the list reference and converting to the appropriate type before appending to the target list property. Task-number: QTBUG-16316 Change-Id: Id8858058f052a53bf43eadc085fd278654478d77 Reviewed-on: http://codereview.qt-project.org/4388 Reviewed-by: Qt Sanity Bot Reviewed-by: Aaron Kennedy --- src/declarative/qml/qdeclarativeproperty.cpp | 11 ++++++++++- .../qdeclarativeecmascript/data/listAssignment.qml | 20 ++++++++++++++++++++ .../tst_qdeclarativeecmascript.cpp | 16 ++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/listAssignment.qml diff --git a/src/declarative/qml/qdeclarativeproperty.cpp b/src/declarative/qml/qdeclarativeproperty.cpp index 60e785510a..acc2cfb752 100644 --- a/src/declarative/qml/qdeclarativeproperty.cpp +++ b/src/declarative/qml/qdeclarativeproperty.cpp @@ -1215,7 +1215,16 @@ bool QDeclarativePropertyPrivate::write(QObject *object, const QDeclarativePrope prop.clear(&prop); - if (value.userType() == qMetaTypeId >()) { + if (value.userType() == qMetaTypeId()) { + QDeclarativeListReference qdlr = value.value(); + + for (int ii = 0; ii < qdlr.count(); ++ii) { + QObject *o = qdlr.at(ii); + if (o && !canConvert(o->metaObject(), listType)) + o = 0; + prop.append(&prop, (void *)o); + } + } else if (value.userType() == qMetaTypeId >()) { const QList &list = qvariant_cast >(value); for (int ii = 0; ii < list.count(); ++ii) { diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/listAssignment.qml b/tests/auto/declarative/qdeclarativeecmascript/data/listAssignment.qml new file mode 100644 index 0000000000..6e6039715b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/listAssignment.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 +import Qt.test 1.0 + +Item { + id: root + width: 640 + height: 480 + + property int list1length: list1.length + + property list list1 + property list list2: [ + MyQmlObject { id: one; value: 100 }, + MyQmlObject { id: two; value: 300 } + ] + + Component.onCompleted: { + root.list1 = root.list2; + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index b732cd8193..dc3f053e17 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -131,6 +131,7 @@ private slots: void jsObject(); void undefinedResetsProperty(); void listToVariant(); + void listAssignment(); void multiEngineObject(); void deletedObject(); void attachedPropertyScope(); @@ -2233,6 +2234,21 @@ void tst_qdeclarativeecmascript::listToVariant() delete object; } +// QTBUG-16316 +Q_DECLARE_METATYPE(QDeclarativeListProperty) +void tst_qdeclarativeecmascript::listAssignment() +{ + QDeclarativeComponent component(&engine, TEST_FILE("listAssignment.qml")); + QObject *obj = component.create(); + QCOMPARE(obj->property("list1length").toInt(), 2); + QDeclarativeListProperty list1 = obj->property("list1").value >(); + QDeclarativeListProperty list2 = obj->property("list2").value >(); + QCOMPARE(list1.count(&list1), list2.count(&list2)); + QCOMPARE(list1.at(&list1, 0), list2.at(&list2, 0)); + QCOMPARE(list1.at(&list1, 1), list2.at(&list2, 1)); + delete obj; +} + // QTBUG-7957 void tst_qdeclarativeecmascript::multiEngineObject() { -- cgit v1.2.3