void ObjectNodeInstance::addToNewProperty(QObject *object, QObject *newParent, const PropertyName &newParentProperty) { QQmlProperty property(newParent, QString::fromUtf8(newParentProperty), context()); if (object) object->setParent(newParent); if (isList(property)) { QQmlListReference list = qvariant_cast<QQmlListReference>(property.read()); if (!QmlPrivateGate::hasFullImplementedListInterface(list)) { qWarning() << "Property list interface not fully implemented for Class " << property.property().typeName() << " in property " << property.name() << "!"; return; } list.append(object); } else if (isObject(property)) { property.write(objectToVariant(object)); if (QQuickItem *item = qobject_cast<QQuickItem *>(object)) if (QQuickItem *newParentItem = qobject_cast<QQuickItem *>(newParent)) item->setParentItem(newParentItem); } Q_ASSERT(objectToVariant(object).isValid()); }
void tst_qqmllistreference::qmllistreference_invalid() { TestType tt; // Invalid { QQmlListReference r; QVERIFY(r.isValid() == false); QVERIFY(r.object() == 0); QVERIFY(r.listElementType() == 0); QVERIFY(r.canAt() == false); QVERIFY(r.canClear() == false); QVERIFY(r.canCount() == false); QVERIFY(r.append(0) == false); QVERIFY(r.at(10) == 0); QVERIFY(r.clear() == false); QVERIFY(r.count() == 0); QVERIFY(r.isReadable() == false); QVERIFY(r.isManipulable() == false); } // Non-property { QQmlListReference r(&tt, "blah"); QVERIFY(r.isValid() == false); QVERIFY(r.object() == 0); QVERIFY(r.listElementType() == 0); QVERIFY(r.canAt() == false); QVERIFY(r.canClear() == false); QVERIFY(r.canCount() == false); QVERIFY(r.append(0) == false); QVERIFY(r.at(10) == 0); QVERIFY(r.clear() == false); QVERIFY(r.count() == 0); QVERIFY(r.isReadable() == false); QVERIFY(r.isManipulable() == false); } // Non-list property { QQmlListReference r(&tt, "intProperty"); QVERIFY(r.isValid() == false); QVERIFY(r.object() == 0); QVERIFY(r.listElementType() == 0); QVERIFY(r.canAt() == false); QVERIFY(r.canClear() == false); QVERIFY(r.canCount() == false); QVERIFY(r.append(0) == false); QVERIFY(r.at(10) == 0); QVERIFY(r.clear() == false); QVERIFY(r.count() == 0); QVERIFY(r.isReadable() == false); QVERIFY(r.isManipulable() == false); } }
void tst_qqmllistreference::append() { TestType *tt = new TestType; QObject object; { QQmlListReference ref; QVERIFY(ref.append(tt) == false); } { QQmlListReference ref(tt, "blah"); QVERIFY(ref.append(tt) == false); } { QQmlListReference ref(tt, "data"); QVERIFY(ref.append(tt) == true); QVERIFY(tt->data.count() == 1); QVERIFY(tt->data.at(0) == tt); QVERIFY(ref.append(&object) == false); QVERIFY(tt->data.count() == 1); QVERIFY(tt->data.at(0) == tt); QVERIFY(ref.append(0) == true); QVERIFY(tt->data.count() == 2); QVERIFY(tt->data.at(0) == tt); QVERIFY(tt->data.at(1) == 0); delete tt; QVERIFY(ref.append(0) == false); } { TestType tt; tt.property.append = 0; QQmlListReference ref(&tt, "data"); QVERIFY(ref.append(&tt) == false); } }
void tst_qqmllistreference::append() { TestType *tt = new TestType; QObject object; { QQmlListReference ref; QVERIFY(!ref.append(tt)); } { QQmlListReference ref(tt, "blah"); QVERIFY(!ref.append(tt)); } { QQmlListReference ref(tt, "data"); QVERIFY(ref.append(tt)); QCOMPARE(tt->data.count(), 1); QCOMPARE(tt->data.at(0), tt); QVERIFY(!ref.append(&object)); QCOMPARE(tt->data.count(), 1); QCOMPARE(tt->data.at(0), tt); QVERIFY(ref.append(0)); QCOMPARE(tt->data.count(), 2); QCOMPARE(tt->data.at(0), tt); QVERIFY(!tt->data.at(1)); delete tt; QVERIFY(!ref.append(0)); } { TestType tt; tt.property.append = 0; QQmlListReference ref(&tt, "data"); QVERIFY(!ref.append(&tt)); } }