File indexing completed on 2024-04-21 05:45:46

0001 /***************************************************************************
0002  *   Copyright (C) 2008 by Pino Toscano <pino@kde.org>                     *
0003  *                                                                         *
0004  *   This program is free software; you can redistribute it and/or modify  *
0005  *   it under the terms of the GNU General Public License as published by  *
0006  *   the Free Software Foundation; either version 2 of the License, or     *
0007  *   (at your option) any later version.                                   *
0008  ***************************************************************************/
0009 
0010 #ifndef _ALTERNATIVEMODELS_H_
0011 #define _ALTERNATIVEMODELS_H_
0012 
0013 #include <QSortFilterProxyModel>
0014 #include <QVariant>
0015 
0016 class Alternative;
0017 class AltFilesManager;
0018 class Item;
0019 class AlternativesBaseModelPrivate;
0020 class AlternativeItemsModelPrivate;
0021 class AlternativeAltModelPrivate;
0022 
0023 enum
0024 {
0025     AltItemRole = 0x00ff0001,
0026     AltAlternativeRole = 0x00ff0002
0027 };
0028 
0029 class AlternativesBaseModel : public QAbstractItemModel
0030 {
0031     Q_OBJECT
0032 public:
0033     ~AlternativesBaseModel() Q_DECL_OVERRIDE;
0034 
0035     // QAbstractItemModel interface
0036     bool hasChildren(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0037     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0038     QModelIndex parent(const QModelIndex &index) const Q_DECL_OVERRIDE;
0039     int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0040 
0041 protected:
0042     AlternativesBaseModel(AlternativesBaseModelPrivate &dd, QObject *parent);
0043     Q_DECLARE_PRIVATE(AlternativesBaseModel)
0044     AlternativesBaseModelPrivate *d_ptr;
0045 };
0046 
0047 
0048 class AlternativeItemsModel : public AlternativesBaseModel
0049 {
0050     Q_OBJECT
0051 
0052     friend class AlternativeAltModelPrivate;
0053 public:
0054     AlternativeItemsModel(const QString &appName, QObject *parent = Q_NULLPTR);
0055     ~AlternativeItemsModel() Q_DECL_OVERRIDE;
0056 
0057     // QAbstractItemModel interface
0058     int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0059     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
0060     Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
0061     bool hasChildren(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0062     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
0063     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0064     int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0065 
0066     void save();
0067     bool isSupported() const;
0068 
0069 private:
0070     Q_DECLARE_PRIVATE(AlternativeItemsModel)
0071 };
0072 
0073 
0074 class AlternativeAltModel : public AlternativesBaseModel
0075 {
0076     Q_OBJECT
0077 public:
0078     AlternativeAltModel(AlternativeItemsModel *itemModel, bool readOnly, QObject *parent = Q_NULLPTR);
0079     ~AlternativeAltModel() Q_DECL_OVERRIDE;
0080 
0081     // QAbstractItemModel interface
0082     int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
0083     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
0084     Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
0085     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
0086     QModelIndex parent(const QModelIndex &index) const Q_DECL_OVERRIDE;
0087     bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
0088 
0089     void setItem(Item *item);
0090     void addAlternative(Alternative *alt);
0091     void removeAlternative(Alternative *alt);
0092 
0093 private:
0094     Q_DECLARE_PRIVATE(AlternativeAltModel)
0095     Q_PRIVATE_SLOT(d_func(), void statusChanged(int))
0096 };
0097 
0098 
0099 class AlternativeItemProxyModel : public QSortFilterProxyModel
0100 {
0101     Q_OBJECT
0102 public:
0103     AlternativeItemProxyModel(QObject *parent = Q_NULLPTR);
0104     ~AlternativeItemProxyModel() Q_DECL_OVERRIDE;
0105 
0106     void setShowSingleAlternative(bool show);
0107 
0108 protected:
0109     bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const Q_DECL_OVERRIDE;
0110 
0111 private:
0112     bool m_showSingle;
0113 };
0114 
0115 Q_DECLARE_METATYPE(Alternative*)
0116 Q_DECLARE_METATYPE(Item*)
0117 
0118 #endif