void tst_qdeclarativelistreference::canCount() { TestType *tt = new TestType; { QDeclarativeListReference ref; QVERIFY(ref.canCount() == false); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.canCount() == false); } { QDeclarativeListReference ref(tt, "data"); QVERIFY(ref.canCount() == true); delete tt; QVERIFY(ref.canCount() == false); } { TestType tt; tt.property.count = 0; QDeclarativeListReference ref(&tt, "data"); QVERIFY(ref.canCount() == false); } }
void tst_qdeclarativelistreference::clear() { TestType *tt = new TestType; tt->data.append(tt); tt->data.append(0); tt->data.append(tt); { QDeclarativeListReference ref; QVERIFY(ref.clear() == false); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.clear() == false); } { QDeclarativeListReference ref(tt, "data"); QVERIFY(ref.clear() == true); QVERIFY(tt->data.count() == 0); delete tt; QVERIFY(ref.clear() == false); } { TestType tt; tt.property.clear = 0; QDeclarativeListReference ref(&tt, "data"); QVERIFY(ref.clear() == false); } }
void tst_qdeclarativelistreference::at() { TestType *tt = new TestType; tt->data.append(tt); tt->data.append(0); tt->data.append(tt); { QDeclarativeListReference ref; QVERIFY(ref.at(0) == 0); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.at(0) == 0); } { QDeclarativeListReference ref(tt, "data"); QVERIFY(ref.at(0) == tt); QVERIFY(ref.at(1) == 0); QVERIFY(ref.at(2) == tt); delete tt; QVERIFY(ref.at(0) == 0); } { TestType tt; tt.data.append(&tt); tt.property.at = 0; QDeclarativeListReference ref(&tt, "data"); QVERIFY(ref.at(0) == 0); } }
void tst_qdeclarativelistreference::count() { TestType *tt = new TestType; tt->data.append(tt); tt->data.append(0); tt->data.append(tt); { QDeclarativeListReference ref; QVERIFY(ref.count() == 0); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.count() == 0); } { QDeclarativeListReference ref(tt, "data"); QVERIFY(ref.count() == 3); tt->data.removeAt(1); QVERIFY(ref.count() == 2); delete tt; QVERIFY(ref.count() == 0); } { TestType tt; tt.data.append(&tt); tt.property.count = 0; QDeclarativeListReference ref(&tt, "data"); QVERIFY(ref.count() == 0); } }
void tst_qdeclarativelistreference::qmlmetaproperty() { TestType tt; tt.data.append(&tt); tt.data.append(0); tt.data.append(&tt); QDeclarativeProperty prop(&tt, QLatin1String("data")); QVariant v = prop.read(); QVERIFY(v.userType() == qMetaTypeId<QDeclarativeListReference>()); QDeclarativeListReference ref = qvariant_cast<QDeclarativeListReference>(v); QVERIFY(ref.count() == 3); QVERIFY(ref.listElementType() == &TestType::staticMetaObject); }
void ObjectNodeInstance::deleteObjectsInList(const QDeclarativeProperty &property) { QObjectList objectList; QDeclarativeListReference list = qvariant_cast<QDeclarativeListReference>(property.read()); if (!hasFullImplementedListInterface(list)) { qWarning() << "Property list interface not fully implemented for Class " << property.property().typeName() << " in property " << property.name() << "!"; return; } for(int i = 0; i < list.count(); i++) { objectList += list.at(i); } list.clear(); }
void PQBaseItem::serializeProperty(QTextStream &stream, const QDeclarativeProperty &property, unsigned indentSize) const { QString str; QTextStream outStream(&str); if (property.propertyTypeCategory() == QDeclarativeProperty::Normal) { // Normal value property const int propertyType = property.propertyType(); const QString propertyValue = property.read().toString(); if (propertyType >= QVariant::Bool && propertyType <= QVariant::Double) { // Numerical, unquoted values outStream << propertyValue; } else { if (!propertyValue.isEmpty()) { QString value = propertyValue; value.replace(QLatin1Char('\\'), QLatin1String("\\\\")) // escape backslashes in rich text .replace(QLatin1Char('"'), QLatin1String("\\\"")); // escape quotes value = QLatin1Char('"') % value % QLatin1Char('"'); outStream << value; } } } else if (property.propertyTypeCategory() == QDeclarativeProperty::Object) { // Complex Object type const QVariant variantValue = property.read(); if (variantValue.isValid() && !variantValue.isNull()) { serializeObject(outStream, variantValue.value<QObject *>(), indentSize); } } else if (property.propertyTypeCategory() == QDeclarativeProperty::List) { // List of objects const QDeclarativeListReference list = qvariant_cast<QDeclarativeListReference>(property.read()); outStream << QLatin1Char('[') << endl; for (int itemIndex = 0, c = list.count(); itemIndex < c; ++itemIndex) { QObject *item = list.at(itemIndex); serializeObject(outStream, item, indentSize+1); if (itemIndex + 1 != list.count()) { outStream << QLatin1Char(','); // separator } outStream << endl; } outStream << PQSerializer::indentStep().repeated(indentSize) << QLatin1String("]"); // close list } if (!str.isEmpty()) { stream << PQSerializer::indentStep().repeated(indentSize) << property.name() << QLatin1String(": ") << str << endl; } }
void ObjectNodeInstance::doResetProperty(const QString &propertyName) { m_modelAbstractPropertyHash.remove(propertyName); QDeclarativeProperty property(object(), propertyName, context()); if (!property.isValid()) return; QVariant oldValue = property.read(); if (oldValue.type() == QVariant::Url) { QUrl url = oldValue.toUrl(); QString path = url.toLocalFile(); if (QFileInfo(path).exists() && nodeInstanceView()) nodeInstanceView()->removeFilePropertyFromFileSystemWatcher(object(), propertyName, path); } QDeclarativeAbstractBinding *binding = QDeclarativePropertyPrivate::binding(property); if (binding) { binding->setEnabled(false, 0); binding->destroy(); } if (property.isResettable()) { property.reset(); } else if (property.propertyTypeCategory() == QDeclarativeProperty::List) { QDeclarativeListReference list = qvariant_cast<QDeclarativeListReference>(property.read()); if (!hasFullImplementedListInterface(list)) { qWarning() << "Property list interface not fully implemented for Class " << property.property().typeName() << " in property " << property.name() << "!"; return; } list.clear(); } else if (property.isWritable()) { if (property.read() == resetValue(propertyName)) return; property.write(resetValue(propertyName)); } }
void ObjectNodeInstance::addToNewProperty(QObject *object, QObject *newParent, const QString &newParentProperty) { QDeclarativeProperty property(newParent, newParentProperty, context()); if (isList(property)) { QDeclarativeListReference list = qvariant_cast<QDeclarativeListReference>(property.read()); if (!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)); } object->setParent(newParent); Q_ASSERT(objectToVariant(object).isValid()); }
void tst_qdeclarativelistreference::isValid() { TestType *tt = new TestType; { QDeclarativeListReference ref; QVERIFY(ref.isValid() == false); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.isValid() == false); } { QDeclarativeListReference ref(tt, "data"); QVERIFY(ref.isValid() == true); delete tt; QVERIFY(ref.isValid() == false); } }
void tst_qdeclarativelistreference::object() { TestType *tt = new TestType; { QDeclarativeListReference ref; QVERIFY(ref.object() == 0); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.object() == 0); } { QDeclarativeListReference ref(tt, "data"); QVERIFY(ref.object() == tt); delete tt; QVERIFY(ref.object() == 0); } }
void tst_qdeclarativelistreference::listElementType() { TestType *tt = new TestType; { QDeclarativeListReference ref; QVERIFY(ref.listElementType() == 0); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.listElementType() == 0); } { QDeclarativeListReference ref(tt, "data"); QVERIFY(ref.listElementType() == &TestType::staticMetaObject); delete tt; QVERIFY(ref.listElementType() == 0); } }
void tst_qdeclarativelistreference::engineTypes() { QDeclarativeEngine engine; QDeclarativeComponent component(&engine, TEST_FILE("engineTypes.qml")); QObject *o = component.create(); QVERIFY(o); QDeclarativeProperty p1(o, QLatin1String("myList")); QVERIFY(p1.propertyTypeCategory() == QDeclarativeProperty::Normal); QDeclarativeProperty p2(o, QLatin1String("myList"), engine.rootContext()); QVERIFY(p2.propertyTypeCategory() == QDeclarativeProperty::List); QVariant v = p2.read(); QVERIFY(v.userType() == qMetaTypeId<QDeclarativeListReference>()); QDeclarativeListReference ref = qvariant_cast<QDeclarativeListReference>(v); QVERIFY(ref.count() == 2); QVERIFY(ref.listElementType()); QVERIFY(ref.listElementType() != &QObject::staticMetaObject); delete o; }
bool removeObjectFromListProperty(QDeclarativeListReference &fromList, QObject *object) { QList<QObject *> tmpList; int i; if (!(fromList.canCount() && fromList.canAt() && fromList.canAppend() && fromList.canClear())) return false; for (i=0; i<fromList.count(); ++i) if (object != fromList.at(i)) tmpList << fromList.at(i); fromList.clear(); foreach (QObject *item, tmpList) fromList.append(item); return true; }
void tst_qdeclarativelistreference::append() { TestType *tt = new TestType; QObject object; { QDeclarativeListReference ref; QVERIFY(ref.append(tt) == false); } { QDeclarativeListReference ref(tt, "blah"); QVERIFY(ref.append(tt) == false); } { QDeclarativeListReference 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; QDeclarativeListReference ref(&tt, "data"); QVERIFY(ref.append(&tt) == false); } }
static bool hasFullImplementedListInterface(const QDeclarativeListReference &list) { #if QT_VERSION<0x050000 return list.isValid() && list.canCount() && list.canAt() && list.canAppend() && list.canClear(); #else return list.isChangeable(); #endif }
bool insertObjectInListProperty(QDeclarativeListReference &fromList, int position, QObject *object) { QList<QObject *> tmpList; int i; if (!(fromList.canCount() && fromList.canAt() && fromList.canAppend() && fromList.canClear())) return false; if (position == fromList.count()) { fromList.append(object); return true; } for (i=0; i<fromList.count(); ++i) tmpList << fromList.at(i); fromList.clear(); for (i=0; i<position; ++i) fromList.append(tmpList.at(i)); fromList.append(object); for (; i<tmpList.count(); ++i) fromList.append(tmpList.at(i)); return true; }
static bool hasFullImplementedListInterface(const QDeclarativeListReference &list) { return list.isValid() && list.canCount() && list.canAt() && list.canAppend() && list.canClear(); }
void tst_qdeclarativelistreference::qmllistreference_invalid() { TestType tt; // Invalid { QDeclarativeListReference 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); } // Non-property { QDeclarativeListReference 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); } // Non-list property { QDeclarativeListReference 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); } }