diff options
Diffstat (limited to 'src/qml/util')
-rw-r--r-- | src/qml/util/qqmladaptormodel.cpp | 100 | ||||
-rw-r--r-- | src/qml/util/qqmladaptormodel_p.h | 12 |
2 files changed, 98 insertions, 14 deletions
diff --git a/src/qml/util/qqmladaptormodel.cpp b/src/qml/util/qqmladaptormodel.cpp index b4bebb9d5d..1cc347d6bc 100644 --- a/src/qml/util/qqmladaptormodel.cpp +++ b/src/qml/util/qqmladaptormodel.cpp @@ -330,9 +330,8 @@ bool QQmlDMCachedModelData::resolveIndex(const QQmlAdaptorModel &, int idx) { if (index == -1) { Q_ASSERT(idx >= 0); - index = idx; cachedData.clear(); - emit modelIndexChanged(); + setModelIndex(idx); const QMetaObject *meta = metaObject(); const int propertyCount = type->propertyRoles.count(); for (int i = 0; i < propertyCount; ++i) @@ -399,13 +398,18 @@ QV4::ReturnedValue QQmlDMCachedModelData::set_property(const QV4::FunctionObject class QQmlDMAbstractItemModelData : public QQmlDMCachedModelData { Q_OBJECT + Q_PROPERTY(int row MEMBER row NOTIFY rowChanged) + Q_PROPERTY(int column MEMBER column NOTIFY columnChanged) Q_PROPERTY(bool hasModelChildren READ hasModelChildren CONSTANT) + public: QQmlDMAbstractItemModelData( QQmlDelegateModelItemMetaType *metaType, VDMModelDelegateDataType *dataType, int index) : QQmlDMCachedModelData(metaType, dataType, index) + , row(type->model->rowAt(index)) + , column(type->model->columnAt(index)) { } @@ -413,7 +417,7 @@ public: { if (index >= 0 && *type->model) { const QAbstractItemModel * const model = type->model->aim(); - return model->hasChildren(model->index(index, 0, type->model->rootIndex)); + return model->hasChildren(model->index(row, column, type->model->rootIndex)); } else { return false; } @@ -421,13 +425,13 @@ public: QVariant value(int role) const override { - return type->model->aim()->index(index, 0, type->model->rootIndex).data(role); + return type->model->aim()->index(row, column, type->model->rootIndex).data(role); } void setValue(int role, const QVariant &value) override { type->model->aim()->setData( - type->model->aim()->index(index, 0, type->model->rootIndex), value, role); + type->model->aim()->index(row, column, type->model->rootIndex), value, role); } QV4::ReturnedValue get() override @@ -443,6 +447,16 @@ public: ++scriptRef; return o.asReturnedValue(); } + + void setModelIndex(int idx) override; + +Q_SIGNALS: + void rowChanged(); + void columnChanged(); + +private: + int row; + int column; }; class VDMAbstractItemModelDataType : public VDMModelDelegateDataType @@ -453,11 +467,16 @@ public: { } - int count(const QQmlAdaptorModel &model) const override + int rowCount(const QQmlAdaptorModel &model) const override { return model.aim()->rowCount(model.rootIndex); } + int columnCount(const QQmlAdaptorModel &model) const override + { + return model.aim()->columnCount(model.rootIndex); + } + void cleanup(QQmlAdaptorModel &model, QQmlDelegateModel *vdm) const override { QAbstractItemModel * const aim = model.aim(); @@ -485,9 +504,9 @@ public: { QHash<QByteArray, int>::const_iterator it = roleNames.find(role.toUtf8()); if (it != roleNames.end()) { - return model.aim()->index(index, 0, model.rootIndex).data(*it); + return model.aim()->index(model.rowAt(index), model.columnAt(index), model.rootIndex).data(*it); } else if (role == QLatin1String("hasModelChildren")) { - return QVariant(model.aim()->hasChildren(model.aim()->index(index, 0, model.rootIndex))); + return QVariant(model.aim()->hasChildren(model.aim()->index(model.rowAt(index), model.columnAt(index), model.rootIndex))); } else { return QVariant(); } @@ -503,7 +522,7 @@ public: QVariant modelIndex(const QQmlAdaptorModel &model, int index) const override { return model - ? QVariant::fromValue(model.aim()->index(index, 0, model.rootIndex)) + ? QVariant::fromValue(model.aim()->index(model.rowAt(index), model.columnAt(index), model.rootIndex)) : QVariant(); } @@ -558,6 +577,22 @@ public: } }; +void QQmlDMAbstractItemModelData::setModelIndex(int idx) +{ + QQmlDMCachedModelData::setModelIndex(idx); + + int prevRow = row; + int prevColumn = column; + + row = type->model->rowAt(idx); + column = type->model->columnAt(idx); + + if (row != prevRow) + emit rowChanged(); + if (column != prevColumn) + emit columnChanged(); +} + //----------------------------------------------------------------- // QQmlListAccessor //----------------------------------------------------------------- @@ -653,11 +688,16 @@ class VDMListDelegateDataType : public QQmlAdaptorModel::Accessors public: inline VDMListDelegateDataType() {} - int count(const QQmlAdaptorModel &model) const override + int rowCount(const QQmlAdaptorModel &model) const override { return model.list.count(); } + int columnCount(const QQmlAdaptorModel &) const override + { + return 1; + } + QVariant value(const QQmlAdaptorModel &model, int index, const QString &role) const override { return role == QLatin1String("modelData") @@ -737,11 +777,16 @@ public: free(metaObject); } - int count(const QQmlAdaptorModel &model) const override + int rowCount(const QQmlAdaptorModel &model) const override { return model.list.count(); } + int columnCount(const QQmlAdaptorModel &) const override + { + return 1; + } + QVariant value(const QQmlAdaptorModel &model, int index, const QString &role) const override { if (QObject *object = model.list.at(index).value<QObject *>()) @@ -955,7 +1000,38 @@ void QQmlAdaptorModel::invalidateModel(QQmlDelegateModel *vdm) bool QQmlAdaptorModel::isValid() const { - return accessors != &qt_vdm_null_accessors; + return accessors != &qt_vdm_null_accessors || rows.isValid(); +} + +int QQmlAdaptorModel::count() const +{ + return rowCount() * columnCount(); +} + +int QQmlAdaptorModel::rowCount() const +{ + if (rows.isValid()) + return rows.value; + return qMax(0, accessors->rowCount(*this)); +} + +int QQmlAdaptorModel::columnCount() const +{ + if (columns.isValid()) + return columns.value; + return qMax(isValid() ? 1 : 0, accessors->columnCount(*this)); +} + +int QQmlAdaptorModel::rowAt(int index) const +{ + int count = rowCount(); + return count <= 0 ? -1 : index % count; +} + +int QQmlAdaptorModel::columnAt(int index) const +{ + int count = rowCount(); + return count <= 0 ? -1 : index / count; } void QQmlAdaptorModel::objectDestroyed(QObject *) diff --git a/src/qml/util/qqmladaptormodel_p.h b/src/qml/util/qqmladaptormodel_p.h index 8f773efa20..f0d3bcd186 100644 --- a/src/qml/util/qqmladaptormodel_p.h +++ b/src/qml/util/qqmladaptormodel_p.h @@ -56,6 +56,7 @@ #include "private/qqmllistaccessor_p.h" #include <private/qqmlguard_p.h> +#include <private/qqmlnullablevalue_p.h> QT_BEGIN_NAMESPACE @@ -73,7 +74,8 @@ public: public: inline Accessors() {} virtual ~Accessors(); - virtual int count(const QQmlAdaptorModel &) const { return 0; } + virtual int rowCount(const QQmlAdaptorModel &) const { return 0; } + virtual int columnCount(const QQmlAdaptorModel &) const { return 0; } virtual void cleanup(QQmlAdaptorModel &, QQmlDelegateModel * = nullptr) const {} virtual QVariant value(const QQmlAdaptorModel &, int, const QString &) const { @@ -102,6 +104,8 @@ public: virtual void fetchMore(QQmlAdaptorModel &) const {} }; + QQmlNullableValue<int> rows; + QQmlNullableValue<int> columns; const Accessors *accessors; QPersistentModelIndex rootIndex; QQmlListAccessor list; @@ -114,11 +118,15 @@ public: void invalidateModel(QQmlDelegateModel *vdm); bool isValid() const; + int count() const; + int rowCount() const; + int columnCount() const; + int rowAt(int index) const; + int columnAt(int index) const; inline QAbstractItemModel *aim() { return static_cast<QAbstractItemModel *>(object()); } inline const QAbstractItemModel *aim() const { return static_cast<const QAbstractItemModel *>(object()); } - inline int count() const { return qMax(0, accessors->count(*this)); } inline QVariant value(int index, const QString &role) const { return accessors->value(*this, index, role); } inline QQmlDelegateModelItem *createItem(QQmlDelegateModelItemMetaType *metaType, int index) { |