diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-25 17:06:30 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-26 08:21:02 +0000 |
commit | 3242a3be7c7cc84e6fcda3e90a7713d9fda16915 (patch) | |
tree | d2cfdbb78ecddfe971aa8c8e8b271c20e6f596e9 | |
parent | 08cbefe5bb7e65ff14f8663eae53d614616f2037 (diff) |
ComboBox: add support for object array
Change-Id: Ia43ba18cfd7ce9f5c4c28e239645320af5ba41e7
Task-number: QTBUG-50141
Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r-- | src/imports/controls/ComboBox.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/material/ComboBox.qml | 2 | ||||
-rw-r--r-- | src/imports/controls/universal/ComboBox.qml | 2 | ||||
-rw-r--r-- | src/templates/qquickcombobox.cpp | 32 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_combobox.qml | 47 |
5 files changed, 79 insertions, 6 deletions
diff --git a/src/imports/controls/ComboBox.qml b/src/imports/controls/ComboBox.qml index 5941bcf4..369cbfec 100644 --- a/src/imports/controls/ComboBox.qml +++ b/src/imports/controls/ComboBox.qml @@ -55,7 +55,7 @@ T.ComboBox { //! [delegate] delegate: ItemDelegate { width: control.width - text: control.textRole ? model[control.textRole] : modelData + text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData checkable: true autoExclusive: true checked: control.currentIndex === index diff --git a/src/imports/controls/material/ComboBox.qml b/src/imports/controls/material/ComboBox.qml index 634b5ed4..b0e11dcf 100644 --- a/src/imports/controls/material/ComboBox.qml +++ b/src/imports/controls/material/ComboBox.qml @@ -55,7 +55,7 @@ T.ComboBox { //! [delegate] delegate: ItemDelegate { width: control.width - text: control.textRole ? model[control.textRole] : modelData + text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData highlighted: control.highlightedIndex === index pressed: highlighted && control.pressed } diff --git a/src/imports/controls/universal/ComboBox.qml b/src/imports/controls/universal/ComboBox.qml index d4e687d0..10939796 100644 --- a/src/imports/controls/universal/ComboBox.qml +++ b/src/imports/controls/universal/ComboBox.qml @@ -57,7 +57,7 @@ T.ComboBox { //! [delegate] delegate: ItemDelegate { width: control.width - text: control.textRole ? model[control.textRole] : modelData + text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData highlighted: control.highlightedIndex === index pressed: highlighted && control.pressed } diff --git a/src/templates/qquickcombobox.cpp b/src/templates/qquickcombobox.cpp index e3e02212..cee384e3 100644 --- a/src/templates/qquickcombobox.cpp +++ b/src/templates/qquickcombobox.cpp @@ -119,6 +119,36 @@ QT_BEGIN_NAMESPACE \sa highlightedIndex */ +class QQuickComboBoxDelegateModel : public QQmlDelegateModel +{ +public: + explicit QQuickComboBoxDelegateModel(QQuickComboBox *combo); + QString stringValue(int index, const QString &role) Q_DECL_OVERRIDE; + +private: + QQuickComboBox *combo; +}; + +QQuickComboBoxDelegateModel::QQuickComboBoxDelegateModel(QQuickComboBox *combo) : + QQmlDelegateModel(qmlContext(combo), combo), combo(combo) +{ +} + +QString QQuickComboBoxDelegateModel::stringValue(int index, const QString &role) +{ + QVariant model = combo->model(); + if (model.userType() == QMetaType::QVariantList) { + QVariant object = model.toList().value(index); + if (object.userType() == QMetaType::QVariantMap) { + QVariantMap data = object.toMap(); + if (data.count() == 1 && role == QLatin1String("modelData")) + return data.first().toString(); + return data.value(role).toString(); + } + } + return QQmlDelegateModel::stringValue(index, role); +} + class QQuickComboBoxPrivate : public QQuickControlPrivate { Q_DECLARE_PUBLIC(QQuickComboBox) @@ -302,7 +332,7 @@ void QQuickComboBoxPrivate::createDelegateModel() delegateModel = model.value<QQmlInstanceModel *>(); if (!delegateModel && model.isValid()) { - QQmlDelegateModel *dataModel = new QQmlDelegateModel(qmlContext(q), q); + QQmlDelegateModel *dataModel = new QQuickComboBoxDelegateModel(q); dataModel->setModel(model); dataModel->setDelegate(delegate); if (q->isComponentComplete()) diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml index d74c52aa..d4b36b17 100644 --- a/tests/auto/controls/data/tst_combobox.qml +++ b/tests/auto/controls/data/tst_combobox.qml @@ -137,6 +137,36 @@ TestCase { control.destroy() } + function test_objects() { + var control = comboBox.createObject(window.contentItem) + verify(control) + + var items = [ + { text: "Apple" }, + { text: "Orange" }, + { text: "Banana" } + ] + + control.model = items + compare(control.model, items) + + compare(control.count, 3) + compare(control.currentIndex, 0) + compare(control.currentText, "Apple") + + control.currentIndex = 2 + compare(control.currentIndex, 2) + compare(control.currentText, "Banana") + + control.model = null + compare(control.model, null) + compare(control.count, 0) + compare(control.currentIndex, -1) + compare(control.currentText, "") + + control.destroy() + } + function test_number() { var control = comboBox.createObject(window.contentItem) verify(control) @@ -201,11 +231,24 @@ TestCase { ListElement { name: "Banana"; color: "yellow" } } - function test_textRole() { + property var fruitarray: [ + { name: "Apple", color: "red" }, + { name: "Orange", color: "orange" }, + { name: "Banana", color: "yellow" } + ] + + function test_textRole_data() { + return [ + { tag: "ListModel", model: fruitmodel }, + { tag: "ObjectArray", model: fruitarray } + ] + } + + function test_textRole(data) { var control = comboBox.createObject(window.contentItem) verify(control) - control.model = fruitmodel + control.model = data.model compare(control.count, 3) compare(control.currentIndex, 0) compare(control.currentText, "") |