#pragma once #include class QmlObjectVectorModel : public QAbstractListModel { Q_OBJECT public: QmlObjectVectorModel(QObject* parent = nullptr); Q_PROPERTY(int count READ count NOTIFY countChanged) /// Returns true if any of the items in the list are dirty. Requires each object to have /// a dirty property and dirtyChanged signal. Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) Q_INVOKABLE QObject* get(int index) { return _objectList[index]; } // Property accessors int count () const; bool dirty () const { return _dirty; } void setDirty (bool dirty); void append (QObject* object); void append (QVector objects); QVector swapObjectList (const QVector& newlist); void clear (); QObject* removeAt (int i); QObject* removeOne (QObject* object) { return removeAt(indexOf(object)); } void insert (int i, QObject* object); void insert (int i, QVector objects); bool contains (QObject* object) { return _objectList.indexOf(object) != -1; } int indexOf (QObject* object) { return _objectList.indexOf(object); } QObject* operator[] (int i); const QObject* operator[] (int i) const; template T value (int index) { return qobject_cast(_objectList[index]); } QVector* objectList () { return &_objectList; } /// Calls deleteLater on all items and this itself. void deleteListAndContents (); /// Clears the list and calls deleteLater on each entry void clearAndDeleteContents (); void beginReset () { beginResetModel(); } void endReset () { endResetModel(); } // Friends friend void swap(QmlObjectVectorModel& list1, QmlObjectVectorModel& list2); signals: void countChanged (int count); void dirtyChanged (bool dirtyChanged); private slots: void _childDirtyChanged (bool dirty); private: // Overrides from QAbstractListModel int rowCount (const QModelIndex & parent = QModelIndex()) const override; QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) 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; QHash roleNames(void) const override; private: QVector _objectList; bool _dirty; bool _skipDirtyFirstItem; static const int ObjectRole; static const int TextRole; };