From f622859bfc26e61b75178ed67a45f2de15ca6ac1 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 13 Mar 2018 15:40:53 -0700 Subject: [PATCH] Add support for insert/append of multiple objects at a time For much better performance --- src/QmlControls/QmlObjectListModel.cc | 31 +++++++++++++++++++++++++++ src/QmlControls/QmlObjectListModel.h | 14 ++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/QmlControls/QmlObjectListModel.cc b/src/QmlControls/QmlObjectListModel.cc index 1db22e6e8..f45a6e996 100644 --- a/src/QmlControls/QmlObjectListModel.cc +++ b/src/QmlControls/QmlObjectListModel.cc @@ -172,11 +172,42 @@ void QmlObjectListModel::insert(int i, QObject* object) setDirty(true); } +void QmlObjectListModel::insert(int i, QList objects) +{ + if (i < 0 || i > _objectList.count()) { + qWarning() << "Invalid index index:count" << i << _objectList.count(); + } + + int j = i; + foreach (QObject* object, objects) { + QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); + + // Look for a dirtyChanged signal on the object + if (object->metaObject()->indexOfSignal(QMetaObject::normalizedSignature("dirtyChanged(bool)")) != -1) { + if (!_skipDirtyFirstItem || j != 0) { + QObject::connect(object, SIGNAL(dirtyChanged(bool)), this, SLOT(_childDirtyChanged(bool))); + } + } + j++; + + _objectList.insert(i, object); + } + + insertRows(i, objects.count()); + + setDirty(true); +} + void QmlObjectListModel::append(QObject* object) { insert(_objectList.count(), object); } +void QmlObjectListModel::append(QList objects) +{ + insert(_objectList.count(), objects); +} + QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist) { QObjectList oldlist(_objectList); diff --git a/src/QmlControls/QmlObjectListModel.h b/src/QmlControls/QmlObjectListModel.h index 78a202dd0..976405ee5 100644 --- a/src/QmlControls/QmlObjectListModel.h +++ b/src/QmlControls/QmlObjectListModel.h @@ -37,11 +37,13 @@ public: void setDirty(bool dirty); void append(QObject* object); + void append(QList objects); QObjectList swapObjectList(const QObjectList& newlist); void clear(void); QObject* removeAt(int i); QObject* removeOne(QObject* object) { return removeAt(indexOf(object)); } void insert(int i, QObject* object); + void insert(int i, QList objects); QObject* operator[](int i); const QObject* operator[](int i) const; bool contains(QObject* object) { return _objectList.indexOf(object) != -1; } @@ -63,12 +65,12 @@ private slots: private: // Overrides from QAbstractListModel - virtual int rowCount(const QModelIndex & parent = QModelIndex()) const; - virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; - virtual QHash roleNames(void) const; - virtual bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()); - virtual bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()); - virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + int rowCount(const QModelIndex & parent = QModelIndex()) const override; + QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; + QHash roleNames(void) const override; + bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()) override; + bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()) override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; private: QList _objectList; -- 2.22.0