section.property cannot deal with nested properties
authorMartin Jones <martin.jones@nokia.com>
Mon, 2 Jul 2012 01:52:08 +0000 (11:52 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 2 Jul 2012 04:09:21 +0000 (06:09 +0200)
Handle nested property names in section.property.

Task-number: QTBUG-24569
Change-Id: I0ea6003313108b8232bcd3a3015a4dbbd0753cec
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
src/quick/items/qquickvisualadaptormodel.cpp
src/quick/items/qquickvisualadaptormodel_p.h
src/quick/items/qquickvisualdatamodel.cpp
tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml
tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp

index b15513e..bc8c759 100644 (file)
@@ -457,15 +457,15 @@ public:
         const_cast<VDMAbstractItemModelDataType *>(this)->release();
     }
 
-    QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
+    QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
     {
         QHash<QByteArray, int>::const_iterator it = roleNames.find(role.toUtf8());
         if (it != roleNames.end()) {
-            return model.aim()->index(index, 0, model.rootIndex).data(*it).toString();
+            return model.aim()->index(index, 0, model.rootIndex).data(*it);
         } else if (role == QLatin1String("hasModelChildren")) {
-            return QVariant(model.aim()->hasChildren(model.aim()->index(index, 0, model.rootIndex))).toString();
+            return QVariant(model.aim()->hasChildren(model.aim()->index(index, 0, model.rootIndex)));
         } else {
-            return QString();
+            return QVariant();
         }
     }
 
@@ -596,12 +596,12 @@ public:
         const_cast<VDMListModelInterfaceDataType *>(this)->release();
     }
 
-    QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
+    QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
     {
         QHash<QByteArray, int>::const_iterator it = roleNames.find(role.toUtf8());
         return it != roleNames.end() && model
-                ? model.lmi()->data(index, *it).toString()
-                : QString();
+                ? model.lmi()->data(index, *it)
+                : QVariant();
     }
 
     QQuickVisualDataModelItem *createItem(
@@ -735,11 +735,11 @@ public:
         return model.list.count();
     }
 
-    QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
+    QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
     {
         return role == QLatin1String("modelData")
-                ? model.list.at(index).toString()
-                : QString();
+                ? model.list.at(index)
+                : QVariant();
     }
 
     QQuickVisualDataModelItem *createItem(
@@ -819,11 +819,11 @@ public:
         return model.list.count();
     }
 
-    QString stringValue(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
+    QVariant value(const QQuickVisualAdaptorModel &model, int index, const QString &role) const
     {
         if (QObject *object = model.list.at(index).value<QObject *>())
-            return object->property(role.toUtf8()).toString();
-        return QString();
+            return object->property(role.toUtf8());
+        return QVariant();
     }
 
     QQuickVisualDataModelItem *createItem(
index dba65e1..5176921 100644 (file)
@@ -69,8 +69,8 @@ public:
         virtual int count(const QQuickVisualAdaptorModel &) const { return 0; }
         virtual void cleanup(QQuickVisualAdaptorModel &, QQuickVisualDataModel * = 0) const {}
 
-        virtual QString stringValue(const QQuickVisualAdaptorModel &, int, const QString &) const {
-            return QString(); }
+        virtual QVariant value(const QQuickVisualAdaptorModel &, int, const QString &) const {
+            return QVariant(); }
 
         virtual QQuickVisualDataModelItem *createItem(
                 QQuickVisualAdaptorModel &,
@@ -113,8 +113,8 @@ public:
     inline const QListModelInterface *lmi() const { return static_cast<const QListModelInterface *>(object()); }
 
     inline int count() const { return qMax(0, accessors->count(*this)); }
-    inline QString stringValue(int index, const QString &role) const {
-        return accessors->stringValue(*this, index, role); }
+    inline QVariant value(int index, const QString &role) const {
+        return accessors->value(*this, index, role); }
     inline QQuickVisualDataModelItem *createItem(QQuickVisualDataModelItemMetaType *metaType, QQmlEngine *engine, int index) {
         return accessors->createItem(*this, metaType, engine, index); }
     inline bool hasProxyObject() const {
index ddd8e16..e721391 100644 (file)
@@ -955,7 +955,20 @@ QString QQuickVisualDataModelPrivate::stringValue(Compositor::Group group, int i
 {
     Compositor::iterator it = m_compositor.find(group, index);
     if (QQuickVisualAdaptorModel *model = it.list<QQuickVisualAdaptorModel>()) {
-        return model->stringValue(it.modelIndex(), name);
+        QString role = name;
+        int dot = name.indexOf(QLatin1Char('.'));
+        if (dot > 0)
+            role = name.left(dot);
+        QVariant value = model->value(it.modelIndex(), role);
+        while (dot > 0) {
+            QObject *obj = qvariant_cast<QObject*>(value);
+            if (!obj)
+                return QString();
+            int from = dot+1;
+            dot = name.indexOf(QLatin1Char('.'), from);
+            value = obj->property(name.mid(from, dot-from).toUtf8());
+        }
+        return value.toString();
     }
     return QString();
 }
index 99151aa..b0d5bd8 100644 (file)
@@ -14,6 +14,10 @@ ListView {
             Text { objectName: "section"; text: parent.ListView.section }
         }
     }
+
+    function changeSectionProperty() {
+        section.property = "object.subName"
+    }
     section.property: "name"
     section.criteria: ViewSection.FullString
 }
index 5da7dc7..4684df2 100644 (file)
@@ -151,17 +151,42 @@ public:
 };
 #endif
 
+class DataSubObject : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(QString subName READ subName WRITE setSubName NOTIFY subNameChanged)
+
+public:
+    DataSubObject(QObject *parent=0) : QObject(parent) {}
+
+    QString subName() const { return m_subName; }
+    void setSubName(const QString &name) {
+        if (name != m_subName) {
+            m_subName = name;
+            emit subNameChanged();
+        }
+    }
+
+signals:
+    void subNameChanged();
+
+private:
+    QString m_subName;
+};
+
 class DataObject : public QObject
 {
     Q_OBJECT
 
     Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
     Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
+    Q_PROPERTY(QObject *object READ object)
 
 public:
     DataObject(QObject *parent=0) : QObject(parent) {}
     DataObject(const QString &name, const QString &color, QObject *parent=0)
-        : QObject(parent), m_name(name), m_color(color) { }
+        : QObject(parent), m_name(name), m_color(color), m_object(new DataSubObject(this)) { }
 
 
     QString name() const { return m_name; }
@@ -180,6 +205,11 @@ public:
         }
     }
 
+    QObject *object() const { return m_object; }
+    void setSubName(const QString &sn) {
+        m_object->setSubName(sn);
+    }
+
 signals:
     void nameChanged();
     void colorChanged();
@@ -187,6 +217,7 @@ signals:
 private:
     QString m_name;
     QString m_color;
+    DataSubObject *m_object;
 };
 
 class ItemRequester : public QObject
@@ -533,6 +564,14 @@ void tst_qquickvisualdatamodel::objectListModel()
     dataList[0]->setProperty("name", QLatin1String("Changed"));
     QCOMPARE(name->text(), QString("Changed"));
     QCOMPARE(name->property("modelName").toString(), QString("Changed"));
+
+    // Test resolving nested section property
+    DataObject *obj = static_cast<DataObject*>(dataList[0]);
+    obj->setSubName("SubItem 1");
+
+    QMetaObject::invokeMethod(listview, "changeSectionProperty");
+    section = findItem<QQuickText>(contentItem, "section", 0);
+    QCOMPARE(section->text(), QString("SubItem 1"));
 }
 
 void tst_qquickvisualdatamodel::singleRole()