aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/types/qqmltablemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/types/qqmltablemodel.cpp')
-rw-r--r--src/qml/types/qqmltablemodel.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/qml/types/qqmltablemodel.cpp b/src/qml/types/qqmltablemodel.cpp
index cf3fc0298a..9bf8c7f562 100644
--- a/src/qml/types/qqmltablemodel.cpp
+++ b/src/qml/types/qqmltablemodel.cpp
@@ -548,6 +548,38 @@ void QQmlTableModel::setRow(int rowIndex, const QVariant &row)
}
}
+/*!
+ \qmlproperty var TableModel::roleDataProvider
+
+ This property can hold a function that will map roles to values.
+
+ When assigned, it will be called each time data() is called, to enable
+ extracting arbitrary values, converting the data in arbitrary ways, or even
+ doing calculations. It takes 4 arguments: \c row, \c column, \c role (as a
+ string), and \c cellData, which is the complete data that is stored in the
+ given cell. (If the cell contains a JS object with multiple named values,
+ the entire object will be given in cellData.) The function that you define
+ must return the value to be used; for example a typical delegate will
+ display the value returned for the \c display role, so you can check
+ whether that is the role and return data in a form that is suitable for the
+ delegate to show:
+
+ \snippet qml/tablemodel/roleDataProvider.qml 0
+*/
+QJSValue QQmlTableModel::roleDataProvider() const
+{
+ return mRoleDataProvider;
+}
+
+void QQmlTableModel::setRoleDataProvider(QJSValue roleDataProvider)
+{
+ if (roleDataProvider.strictlyEquals(mRoleDataProvider))
+ return;
+
+ mRoleDataProvider = roleDataProvider;
+ emit roleDataProviderChanged();
+}
+
QModelIndex QQmlTableModel::index(int row, int column, const QModelIndex &parent) const
{
return row >= 0 && row < rowCount() && column >= 0 && column < columnCount() && !parent.isValid()
@@ -603,6 +635,14 @@ QVariant QQmlTableModel::data(const QModelIndex &index, int role) const
return QVariant();
const QVariantList rowData = mRows.at(row).toList();
+
+ if (mRoleDataProvider.isCallable()) {
+ const auto args = QJSValueList() << row << column <<
+ QString::fromUtf8(mRoleNames.value(role)) <<
+ qmlEngine(this)->toScriptValue(rowData.at(column));
+ return const_cast<QQmlTableModel*>(this)->mRoleDataProvider.call(args).toVariant();
+ }
+
const QVariantMap columnData = rowData.at(column).toMap();
int effectiveRole = role;