File indexing completed on 2024-05-12 03:48:21

0001 /*
0002     File                 : TreeModel.h
0003     Project              : LabPlot
0004     Description          : This is an abstract treemodel which can be used by a treeview
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2019 Martin Marmsoler <martin.marmsoler@gmail.com>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #ifndef TREEMODEL_H
0012 #define TREEMODEL_H
0013 
0014 #include <QAbstractItemModel>
0015 #include <QColor>
0016 
0017 /*!
0018  * \brief The TreeItem class
0019  * Item in the treemodel
0020  */
0021 class TreeItem {
0022 public:
0023     explicit TreeItem(const QVector<QVariant>& data, TreeItem* parent = nullptr);
0024     ~TreeItem();
0025 
0026     TreeItem* child(int number);
0027     int childCount() const;
0028     int columnCount() const;
0029     QVariant data(int column) const;
0030     QVariant backgroundColor() const;
0031     bool insertChildren(int position, int count, int columns);
0032     bool insertColumns(int position, int columns);
0033     TreeItem* parent();
0034     bool removeChildren(int position, int count);
0035     bool removeColumns(int position, int columns);
0036     int childNumber() const;
0037     bool setData(int column, const QVariant& value);
0038     bool setBackgroundColor(int column, const QVariant& value);
0039 
0040 private:
0041     QList<TreeItem*> childItems;
0042     QVector<QVariant> itemData;
0043     QColor m_backgroundColor{QColor(0, 0, 0, 0)};
0044     TreeItem* parentItem{nullptr};
0045 };
0046 /*!
0047  * \brief The TreeModel class
0048  * This is an abstract treemodel which can be used by a treeview
0049  */
0050 class TreeModel : public QAbstractItemModel {
0051     Q_OBJECT
0052 
0053 public:
0054     explicit TreeModel(const QStringList& headers, QObject* parent = nullptr);
0055     ~TreeModel();
0056     QVariant treeData(const int row, const int column, const QModelIndex& parent = QModelIndex(), const int role = Qt::EditRole);
0057     QVariant data(const QModelIndex&, int role) const override;
0058     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
0059 
0060     QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override;
0061     QModelIndex parent(const QModelIndex&) const override;
0062 
0063     int rowCount(const QModelIndex& parent = QModelIndex()) const override;
0064     int columnCount(const QModelIndex& parent = QModelIndex()) const override;
0065 
0066     Qt::ItemFlags flags(const QModelIndex&) const override;
0067     bool setTreeData(const QVariant& data, const int row, const int column, const QModelIndex& parent = QModelIndex(), int role = Qt::EditRole);
0068     bool setData(const QModelIndex&, const QVariant& value, int role = Qt::EditRole) override;
0069     int compareStrings(const QString& value, const int row, const int column, const QModelIndex& parent = QModelIndex());
0070     bool setHeaderData(int section, Qt::Orientation orientation, const QVariant& value, int role = Qt::EditRole) override;
0071 
0072     bool insertColumns(int position, int columns, const QModelIndex& parent = QModelIndex()) override;
0073     bool removeColumns(int position, int columns, const QModelIndex& parent = QModelIndex()) override;
0074     bool insertRows(int position, int rows, const QModelIndex& parent = QModelIndex()) override;
0075     bool removeRows(int position, int rows, const QModelIndex& parent = QModelIndex()) override;
0076 
0077 private:
0078     TreeItem* getItem(const QModelIndex&) const;
0079     TreeItem* rootItem{nullptr};
0080 };
0081 
0082 #endif // TREEMODEL_H