aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2012-07-02 11:52:08 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-02 06:09:21 +0200
commit2d1c7f6348943b9adbab3b940d17896c15636156 (patch)
tree00ad9dde8e689f24626961507872059c3ceeda58
parent6ede3b0138bed45f91dfa6b84b662b7f342b45a3 (diff)
section.property cannot deal with nested properties
Handle nested property names in section.property. Task-number: QTBUG-24569 Change-Id: I0ea6003313108b8232bcd3a3015a4dbbd0753cec Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
-rw-r--r--src/quick/items/qquickvisualadaptormodel.cpp26
-rw-r--r--src/quick/items/qquickvisualadaptormodel_p.h8
-rw-r--r--src/quick/items/qquickvisualdatamodel.cpp15
-rw-r--r--tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml4
-rw-r--r--tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp41
5 files changed, 75 insertions, 19 deletions
diff --git a/src/quick/items/qquickvisualadaptormodel.cpp b/src/quick/items/qquickvisualadaptormodel.cpp
index b15513eed2..bc8c75933a 100644
--- a/src/quick/items/qquickvisualadaptormodel.cpp
+++ b/src/quick/items/qquickvisualadaptormodel.cpp
@@ -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(
diff --git a/src/quick/items/qquickvisualadaptormodel_p.h b/src/quick/items/qquickvisualadaptormodel_p.h
index dba65e197e..5176921a51 100644
--- a/src/quick/items/qquickvisualadaptormodel_p.h
+++ b/src/quick/items/qquickvisualadaptormodel_p.h
@@ -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 {
diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp
index ddd8e16ecf..e721391296 100644
--- a/src/quick/items/qquickvisualdatamodel.cpp
+++ b/src/quick/items/qquickvisualdatamodel.cpp
@@ -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();
}
diff --git a/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml b/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml
index 99151aa9e1..b0d5bd8032 100644
--- a/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml
+++ b/tests/auto/quick/qquickvisualdatamodel/data/objectlist.qml
@@ -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
}
diff --git a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
index 5da7dc7fba..4684df2cae 100644
--- a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
+++ b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
@@ -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()