diff options
-rw-r--r-- | src/qml/types/qqmldelegatemodel.cpp | 51 | ||||
-rw-r--r-- | src/qml/types/qqmldelegatemodel_p_p.h | 4 | ||||
-rw-r--r-- | src/qml/util/qqmladaptormodel.cpp | 40 | ||||
-rw-r--r-- | src/qml/util/qqmladaptormodel_p.h | 4 |
4 files changed, 55 insertions, 44 deletions
diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp index 0dbd9731c9..d62cc5d334 100644 --- a/src/qml/types/qqmldelegatemodel.cpp +++ b/src/qml/types/qqmldelegatemodel.cpp @@ -1312,8 +1312,12 @@ void QQmlDelegateModel::_q_itemsInserted(int index, int count) const QList<QQmlDelegateModelItem *> cache = d->m_cache; for (int i = 0, c = cache.count(); i < c; ++i) { QQmlDelegateModelItem *item = cache.at(i); - if (item->modelIndex() >= index) - item->setModelIndex(item->modelIndex() + count); + if (item->modelIndex() >= index) { + const int newIndex = item->modelIndex() + count; + const int row = newIndex; + const int column = 0; + item->setModelIndex(newIndex, row, column); + } } QVector<Compositor::Insert> inserts; @@ -1454,10 +1458,14 @@ void QQmlDelegateModel::_q_itemsRemoved(int index, int count) if (!d->m_cache.contains(item)) continue; - if (item->modelIndex() >= index + count) - item->setModelIndex(item->modelIndex() - count); - else if (item->modelIndex() >= index) - item->setModelIndex(-1); + if (item->modelIndex() >= index + count) { + const int newIndex = item->modelIndex() - count; + const int row = newIndex; + const int column = 0; + item->setModelIndex(newIndex, row, column); + } else if (item->modelIndex() >= index) { + item->setModelIndex(-1, -1, -1); + } } QVector<Compositor::Remove> removes; @@ -1502,10 +1510,17 @@ void QQmlDelegateModel::_q_itemsMoved(int from, int to, int count) const QList<QQmlDelegateModelItem *> cache = d->m_cache; for (int i = 0, c = cache.count(); i < c; ++i) { QQmlDelegateModelItem *item = cache.at(i); - if (item->modelIndex() >= from && item->modelIndex() < from + count) - item->setModelIndex(item->modelIndex() - from + to); - else if (item->modelIndex() >= minimum && item->modelIndex() < maximum) - item->setModelIndex(item->modelIndex() + difference); + if (item->modelIndex() >= from && item->modelIndex() < from + count) { + const int newIndex = item->modelIndex() - from + to; + const int row = newIndex; + const int column = 0; + item->setModelIndex(newIndex, row, column); + } else if (item->modelIndex() >= minimum && item->modelIndex() < maximum) { + const int newIndex = item->modelIndex() + difference; + const int row = newIndex; + const int column = 0; + item->setModelIndex(newIndex, row, column); + } } QVector<Compositor::Remove> removes; @@ -1562,7 +1577,7 @@ void QQmlDelegateModel::_q_modelReset() for (int i = 0, c = cache.count(); i < c; ++i) { QQmlDelegateModelItem *item = cache.at(i); if (item->modelIndex() != -1) - item->setModelIndex(-1); + item->setModelIndex(-1, -1, -1); } QVector<Compositor::Remove> removes; @@ -1959,8 +1974,7 @@ void QV4::Heap::QQmlDelegateModelItemObject::destroy() } -QQmlDelegateModelItem::QQmlDelegateModelItem( - QQmlDelegateModelItemMetaType *metaType, int modelIndex) +QQmlDelegateModelItem::QQmlDelegateModelItem(QQmlDelegateModelItemMetaType *metaType, int modelIndex, int row, int column) : v4(metaType->v4Engine) , metaType(metaType) , contextData(nullptr) @@ -1971,8 +1985,8 @@ QQmlDelegateModelItem::QQmlDelegateModelItem( , scriptRef(0) , groups(0) , index(modelIndex) - , row(QQmlDelegateModelPrivate::get(metaType->model)->m_adaptorModel.rowAt(modelIndex)) - , column(QQmlDelegateModelPrivate::get(metaType->model)->m_adaptorModel.columnAt(modelIndex)) + , row(row) + , column(column) { metaType->addref(); } @@ -2007,18 +2021,17 @@ void QQmlDelegateModelItem::Dispose() delete this; } -void QQmlDelegateModelItem::setModelIndex(int idx) +void QQmlDelegateModelItem::setModelIndex(int idx, int newRow, int newColumn) { if (idx == index) return; const int prevRow = row; const int prevColumn = column; - const QQmlAdaptorModel &adaptorModel = QQmlDelegateModelPrivate::get(metaType->model)->m_adaptorModel; index = idx; - row = adaptorModel.rowAt(idx); - column = adaptorModel.columnAt(idx); + row = newRow; + column = newColumn; Q_EMIT modelIndexChanged(); diff --git a/src/qml/types/qqmldelegatemodel_p_p.h b/src/qml/types/qqmldelegatemodel_p_p.h index a0c1f6aa12..0c24e79c1b 100644 --- a/src/qml/types/qqmldelegatemodel_p_p.h +++ b/src/qml/types/qqmldelegatemodel_p_p.h @@ -99,7 +99,7 @@ class QQmlDelegateModelItem : public QObject Q_PROPERTY(int column MEMBER column NOTIFY columnChanged) Q_PROPERTY(QObject *model READ modelObject CONSTANT) public: - QQmlDelegateModelItem(QQmlDelegateModelItemMetaType *metaType, int modelIndex); + QQmlDelegateModelItem(QQmlDelegateModelItemMetaType *metaType, int modelIndex, int row, int column); ~QQmlDelegateModelItem(); void referenceObject() { ++objectRef; } @@ -123,7 +123,7 @@ public: int groupIndex(Compositor::Group group); int modelIndex() const { return index; } - virtual void setModelIndex(int idx); + virtual void setModelIndex(int idx, int newRow, int newColumn); virtual QV4::ReturnedValue get() { return QV4::QObjectWrapper::wrap(v4, this); } diff --git a/src/qml/util/qqmladaptormodel.cpp b/src/qml/util/qqmladaptormodel.cpp index 4130eff33a..faae38abec 100644 --- a/src/qml/util/qqmladaptormodel.cpp +++ b/src/qml/util/qqmladaptormodel.cpp @@ -96,7 +96,7 @@ public: QQmlDMCachedModelData( QQmlDelegateModelItemMetaType *metaType, VDMModelDelegateDataType *dataType, - int index); + int index, int row, int column); int metaCall(QMetaObject::Call call, int id, void **arguments); @@ -262,9 +262,8 @@ public: bool hasModelData; }; -QQmlDMCachedModelData::QQmlDMCachedModelData( - QQmlDelegateModelItemMetaType *metaType, VDMModelDelegateDataType *dataType, int index) - : QQmlDelegateModelItem(metaType, index) +QQmlDMCachedModelData::QQmlDMCachedModelData(QQmlDelegateModelItemMetaType *metaType, VDMModelDelegateDataType *dataType, int index, int row, int column) + : QQmlDelegateModelItem(metaType, index, row, column) , type(dataType) { if (index == -1) @@ -326,12 +325,12 @@ void QQmlDMCachedModelData::setValue(const QString &role, const QVariant &value) } } -bool QQmlDMCachedModelData::resolveIndex(const QQmlAdaptorModel &, int idx) +bool QQmlDMCachedModelData::resolveIndex(const QQmlAdaptorModel &adaptorModel, int idx) { if (index == -1) { Q_ASSERT(idx >= 0); cachedData.clear(); - setModelIndex(idx); + setModelIndex(idx, adaptorModel.rowAt(idx), adaptorModel.columnAt(idx)); const QMetaObject *meta = metaObject(); const int propertyCount = type->propertyRoles.count(); for (int i = 0; i < propertyCount; ++i) @@ -404,8 +403,8 @@ public: QQmlDMAbstractItemModelData( QQmlDelegateModelItemMetaType *metaType, VDMModelDelegateDataType *dataType, - int index) - : QQmlDMCachedModelData(metaType, dataType, index) + int index, int row, int column) + : QQmlDMCachedModelData(metaType, dataType, index, row, column) { } @@ -526,12 +525,12 @@ public: QQmlDelegateModelItem *createItem( QQmlAdaptorModel &model, QQmlDelegateModelItemMetaType *metaType, - int index) const override + int index, int row, int column) const override { VDMAbstractItemModelDataType *dataType = const_cast<VDMAbstractItemModelDataType *>(this); if (!metaObject) dataType->initializeMetaType(model); - return new QQmlDMAbstractItemModelData(metaType, dataType, index); + return new QQmlDMAbstractItemModelData(metaType, dataType, index, row, column); } void initializeMetaType(QQmlAdaptorModel &model) @@ -572,8 +571,8 @@ class QQmlDMListAccessorData : public QQmlDelegateModelItem Q_OBJECT Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged) public: - QQmlDMListAccessorData(QQmlDelegateModelItemMetaType *metaType, int index, const QVariant &value) - : QQmlDelegateModelItem(metaType, index) + QQmlDMListAccessorData(QQmlDelegateModelItemMetaType *metaType, int index, int row, int column, const QVariant &value) + : QQmlDelegateModelItem(metaType, index, row, column) , cachedData(value) { } @@ -678,11 +677,11 @@ public: QQmlDelegateModelItem *createItem( QQmlAdaptorModel &model, QQmlDelegateModelItemMetaType *metaType, - int index) const override + int index, int row, int column) const override { return new QQmlDMListAccessorData( metaType, - index, + index, row, column, index >= 0 && index < model.list.count() ? model.list.at(index) : QVariant()); } }; @@ -701,7 +700,7 @@ public: QQmlDMObjectData( QQmlDelegateModelItemMetaType *metaType, VDMObjectDelegateDataType *dataType, - int index, + int index, int row, int column, QObject *object); QObject *modelData() const { return object; } @@ -767,13 +766,13 @@ public: QQmlDelegateModelItem *createItem( QQmlAdaptorModel &model, QQmlDelegateModelItemMetaType *metaType, - int index) const override + int index, int row, int column) const override { VDMObjectDelegateDataType *dataType = const_cast<VDMObjectDelegateDataType *>(this); if (!metaObject) dataType->initializeMetaType(model); return index >= 0 && index < model.list.count() - ? new QQmlDMObjectData(metaType, dataType, index, qvariant_cast<QObject *>(model.list.at(index))) + ? new QQmlDMObjectData(metaType, dataType, index, row, column, qvariant_cast<QObject *>(model.list.at(index))) : nullptr; } @@ -887,12 +886,11 @@ public: VDMObjectDelegateDataType *m_type; }; -QQmlDMObjectData::QQmlDMObjectData( - QQmlDelegateModelItemMetaType *metaType, +QQmlDMObjectData::QQmlDMObjectData(QQmlDelegateModelItemMetaType *metaType, VDMObjectDelegateDataType *dataType, - int index, + int index, int row, int column, QObject *object) - : QQmlDelegateModelItem(metaType, index) + : QQmlDelegateModelItem(metaType, index, row, column) , object(object) { new QQmlDMObjectDataMetaObject(this, dataType); diff --git a/src/qml/util/qqmladaptormodel_p.h b/src/qml/util/qqmladaptormodel_p.h index 3b2d180ca7..af0917cf3b 100644 --- a/src/qml/util/qqmladaptormodel_p.h +++ b/src/qml/util/qqmladaptormodel_p.h @@ -86,7 +86,7 @@ public: virtual QQmlDelegateModelItem *createItem( QQmlAdaptorModel &, QQmlDelegateModelItemMetaType *, - int) const { return nullptr; } + int, int, int) const { return nullptr; } virtual bool notify( const QQmlAdaptorModel &, @@ -131,7 +131,7 @@ public: inline QVariant value(int index, const QString &role) const { return accessors->value(*this, index, role); } inline QQmlDelegateModelItem *createItem(QQmlDelegateModelItemMetaType *metaType, int index) { - return accessors->createItem(*this, metaType, index); } + return accessors->createItem(*this, metaType, index, rowAt(index), columnAt(index)); } inline bool hasProxyObject() const { return list.type() == QQmlListAccessor::Instance || list.type() == QQmlListAccessor::ListProperty; } |