| /**************************************************************************** |
| ** |
| ** Copyright (C) 2009 Stephen Kelly <steveire@gmail.com> |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the test suite of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #ifndef DYNAMICTREEMODEL_H |
| #define DYNAMICTREEMODEL_H |
| |
| #include <QtCore/QAbstractItemModel> |
| |
| #include <QtCore/QHash> |
| #include <QtCore/QList> |
| |
| class DynamicTreeModel : public QAbstractItemModel |
| { |
| Q_OBJECT |
| |
| public: |
| DynamicTreeModel(QObject *parent = 0); |
| |
| QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; |
| QModelIndex parent(const QModelIndex &index) const; |
| int rowCount(const QModelIndex &index = QModelIndex()) const; |
| int columnCount(const QModelIndex &index = QModelIndex()) const; |
| |
| QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; |
| |
| void clear(); |
| |
| protected slots: |
| |
| /** |
| Finds the parent id of the string with id @p searchId. |
| |
| Returns -1 if not found. |
| */ |
| qint64 findParentId(qint64 searchId) const; |
| |
| private: |
| QHash<qint64, QString> m_items; |
| QHash<qint64, QList<QList<qint64> > > m_childItems; |
| qint64 nextId; |
| qint64 newId() |
| { |
| return nextId++; |
| } |
| |
| QModelIndex m_nextParentIndex; |
| int m_nextRow; |
| |
| int m_depth; |
| int maxDepth; |
| |
| friend class ModelInsertCommand; |
| friend class ModelMoveCommand; |
| friend class ModelResetCommand; |
| friend class ModelResetCommandFixed; |
| friend class ModelChangeChildrenLayoutsCommand; |
| }; |
| |
| class ModelChangeCommand : public QObject |
| { |
| Q_OBJECT |
| public: |
| |
| ModelChangeCommand(DynamicTreeModel *model, QObject *parent = 0); |
| |
| virtual ~ModelChangeCommand() |
| { |
| } |
| |
| void setAncestorRowNumbers(QList<int> rowNumbers) |
| { |
| m_rowNumbers = rowNumbers; |
| } |
| |
| QModelIndex findIndex(const QList<int> &rows) const; |
| |
| void setStartRow(int row) |
| { |
| m_startRow = row; |
| } |
| |
| void setEndRow(int row) |
| { |
| m_endRow = row; |
| } |
| |
| void setNumCols(int cols) |
| { |
| m_numCols = cols; |
| } |
| |
| virtual void doCommand() = 0; |
| |
| protected: |
| DynamicTreeModel *m_model; |
| QList<int> m_rowNumbers; |
| int m_numCols; |
| int m_startRow; |
| int m_endRow; |
| }; |
| |
| typedef QList<ModelChangeCommand *> ModelChangeCommandList; |
| |
| class ModelInsertCommand : public ModelChangeCommand |
| { |
| Q_OBJECT |
| |
| public: |
| |
| ModelInsertCommand(DynamicTreeModel *model, QObject *parent = 0); |
| virtual ~ModelInsertCommand() |
| { |
| } |
| |
| virtual void doCommand(); |
| }; |
| |
| class ModelMoveCommand : public ModelChangeCommand |
| { |
| Q_OBJECT |
| public: |
| ModelMoveCommand(DynamicTreeModel *model, QObject *parent); |
| |
| virtual ~ModelMoveCommand() |
| { |
| } |
| |
| virtual bool emitPreSignal(const QModelIndex &srcParent, int srcStart, int srcEnd, |
| const QModelIndex &destParent, int destRow); |
| |
| virtual void doCommand(); |
| |
| virtual void emitPostSignal(); |
| |
| void setDestAncestors(QList<int> rows) |
| { |
| m_destRowNumbers = rows; |
| } |
| |
| void setDestRow(int row) |
| { |
| m_destRow = row; |
| } |
| |
| protected: |
| QList<int> m_destRowNumbers; |
| int m_destRow; |
| }; |
| |
| /** |
| A command which does a move and emits a reset signal. |
| */ |
| class ModelResetCommand : public ModelMoveCommand |
| { |
| Q_OBJECT |
| public: |
| ModelResetCommand(DynamicTreeModel *model, QObject *parent = 0); |
| |
| virtual ~ModelResetCommand(); |
| |
| virtual bool emitPreSignal(const QModelIndex &srcParent, int srcStart, int srcEnd, |
| const QModelIndex &destParent, int destRow); |
| virtual void emitPostSignal(); |
| }; |
| |
| /** |
| A command which does a move and emits a beginResetModel and endResetModel signals. |
| */ |
| class ModelResetCommandFixed : public ModelMoveCommand |
| { |
| Q_OBJECT |
| public: |
| ModelResetCommandFixed(DynamicTreeModel *model, QObject *parent = 0); |
| |
| virtual ~ModelResetCommandFixed(); |
| |
| virtual bool emitPreSignal(const QModelIndex &srcParent, int srcStart, int srcEnd, |
| const QModelIndex &destParent, int destRow); |
| virtual void emitPostSignal(); |
| }; |
| |
| class ModelChangeChildrenLayoutsCommand : public ModelChangeCommand |
| { |
| Q_OBJECT |
| public: |
| ModelChangeChildrenLayoutsCommand(DynamicTreeModel *model, QObject *parent); |
| |
| virtual ~ModelChangeChildrenLayoutsCommand() |
| { |
| } |
| |
| virtual void doCommand(); |
| |
| void setSecondAncestorRowNumbers(QList<int> rows) |
| { |
| m_secondRowNumbers = rows; |
| } |
| |
| protected: |
| QList<int> m_secondRowNumbers; |
| int m_destRow; |
| }; |
| |
| #endif |