File indexing completed on 2024-06-09 05:30:57

0001 /*
0002     SPDX-FileCopyrightText: 2015 Eike Hein <hein@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "forwardingmodel.h"
0008 
0009 ForwardingModel::ForwardingModel(QObject *parent)
0010     : AbstractModel(parent)
0011 {
0012 }
0013 
0014 ForwardingModel::~ForwardingModel()
0015 {
0016 }
0017 
0018 QString ForwardingModel::description() const
0019 {
0020     if (!m_sourceModel) {
0021         return QString();
0022     }
0023 
0024     AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
0025 
0026     if (!abstractModel) {
0027         return QString();
0028     }
0029 
0030     return abstractModel->description();
0031 }
0032 
0033 QAbstractItemModel *ForwardingModel::sourceModel() const
0034 {
0035     return m_sourceModel;
0036 }
0037 
0038 void ForwardingModel::setSourceModel(QAbstractItemModel *sourceModel)
0039 {
0040     disconnectSignals();
0041 
0042     beginResetModel();
0043 
0044     m_sourceModel = sourceModel;
0045 
0046     connectSignals();
0047 
0048     endResetModel();
0049 
0050     Q_EMIT countChanged();
0051     Q_EMIT sourceModelChanged();
0052     Q_EMIT descriptionChanged();
0053 }
0054 
0055 bool ForwardingModel::canFetchMore(const QModelIndex &parent) const
0056 {
0057     if (!m_sourceModel) {
0058         return false;
0059     }
0060 
0061     return m_sourceModel->canFetchMore(indexToSourceIndex(parent));
0062 }
0063 
0064 void ForwardingModel::fetchMore(const QModelIndex &parent)
0065 {
0066     if (m_sourceModel) {
0067         m_sourceModel->fetchMore(indexToSourceIndex(parent));
0068     }
0069 }
0070 
0071 QModelIndex ForwardingModel::index(int row, int column, const QModelIndex &parent) const
0072 {
0073     Q_UNUSED(parent)
0074 
0075     if (!m_sourceModel) {
0076         return QModelIndex();
0077     }
0078 
0079     return createIndex(row, column);
0080 }
0081 
0082 QModelIndex ForwardingModel::parent(const QModelIndex &index) const
0083 {
0084     Q_UNUSED(index)
0085 
0086     return QModelIndex();
0087 }
0088 
0089 QVariant ForwardingModel::data(const QModelIndex &index, int role) const
0090 {
0091     if (!m_sourceModel) {
0092         return QVariant();
0093     }
0094 
0095     return m_sourceModel->data(indexToSourceIndex(index), role);
0096 }
0097 
0098 int ForwardingModel::rowCount(const QModelIndex &parent) const
0099 {
0100     if (!m_sourceModel) {
0101         return 0;
0102     }
0103 
0104     return m_sourceModel->rowCount(indexToSourceIndex(parent));
0105 }
0106 
0107 QModelIndex ForwardingModel::indexToSourceIndex(const QModelIndex &index) const
0108 {
0109     if (!m_sourceModel || !index.isValid()) {
0110         return QModelIndex();
0111     }
0112 
0113     return m_sourceModel->index(index.row(), index.column(), index.parent().isValid() ? indexToSourceIndex(index.parent()) : QModelIndex());
0114 }
0115 
0116 bool ForwardingModel::trigger(int row, const QString &actionId, const QVariant &argument)
0117 {
0118     if (!m_sourceModel) {
0119         return false;
0120     }
0121 
0122     AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
0123 
0124     if (!abstractModel) {
0125         return false;
0126     }
0127 
0128     return abstractModel->trigger(row, actionId, argument);
0129 }
0130 
0131 QString ForwardingModel::labelForRow(int row)
0132 {
0133     if (!m_sourceModel) {
0134         return QString();
0135     }
0136 
0137     AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
0138 
0139     if (!abstractModel) {
0140         return QString();
0141     }
0142 
0143     return abstractModel->labelForRow(row);
0144 }
0145 
0146 AbstractModel *ForwardingModel::modelForRow(int row)
0147 {
0148     if (!m_sourceModel) {
0149         return nullptr;
0150     }
0151 
0152     AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
0153 
0154     if (!abstractModel) {
0155         return nullptr;
0156     }
0157 
0158     return abstractModel->modelForRow(row);
0159 }
0160 
0161 AbstractModel *ForwardingModel::favoritesModel()
0162 {
0163     AbstractModel *sourceModel = qobject_cast<AbstractModel *>(m_sourceModel);
0164 
0165     if (sourceModel) {
0166         return sourceModel->favoritesModel();
0167     }
0168 
0169     return AbstractModel::favoritesModel();
0170 }
0171 
0172 int ForwardingModel::separatorCount() const
0173 {
0174     if (!m_sourceModel) {
0175         return 0;
0176     }
0177 
0178     AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
0179 
0180     if (!abstractModel) {
0181         return 0;
0182     }
0183 
0184     return abstractModel->separatorCount();
0185 }
0186 
0187 void ForwardingModel::reset()
0188 {
0189     beginResetModel();
0190     endResetModel();
0191 
0192     Q_EMIT countChanged();
0193     Q_EMIT separatorCountChanged();
0194 }
0195 
0196 void ForwardingModel::connectSignals()
0197 {
0198     if (!m_sourceModel) {
0199         return;
0200     }
0201 
0202     connect(m_sourceModel, SIGNAL(destroyed()), this, SLOT(reset()));
0203     connect(m_sourceModel.data(), &QAbstractItemModel::dataChanged, this, &QAbstractItemModel::dataChanged, Qt::UniqueConnection);
0204     connect(m_sourceModel.data(), &QAbstractItemModel::rowsAboutToBeInserted, this, &QAbstractItemModel::rowsAboutToBeInserted, Qt::UniqueConnection);
0205     connect(m_sourceModel.data(), &QAbstractItemModel::rowsAboutToBeMoved, this, &QAbstractItemModel::rowsAboutToBeMoved, Qt::UniqueConnection);
0206     connect(m_sourceModel.data(), &QAbstractItemModel::rowsAboutToBeRemoved, this, &QAbstractItemModel::rowsAboutToBeRemoved, Qt::UniqueConnection);
0207     connect(m_sourceModel.data(), &QAbstractItemModel::layoutAboutToBeChanged, this, &QAbstractItemModel::layoutAboutToBeChanged, Qt::UniqueConnection);
0208     connect(m_sourceModel.data(), &QAbstractItemModel::rowsInserted, this, &QAbstractItemModel::rowsInserted, Qt::UniqueConnection);
0209     connect(m_sourceModel.data(), &QAbstractItemModel::rowsInserted, this, &AbstractModel::countChanged, Qt::UniqueConnection);
0210     connect(m_sourceModel.data(), &QAbstractItemModel::rowsMoved, this, &QAbstractItemModel::rowsMoved, Qt::UniqueConnection);
0211     connect(m_sourceModel.data(), &QAbstractItemModel::rowsRemoved, this, &QAbstractItemModel::rowsRemoved, Qt::UniqueConnection);
0212     connect(m_sourceModel.data(), &QAbstractItemModel::rowsRemoved, this, &AbstractModel::countChanged, Qt::UniqueConnection);
0213     connect(m_sourceModel.data(), &QAbstractItemModel::modelAboutToBeReset, this, &QAbstractItemModel::modelAboutToBeReset, Qt::UniqueConnection);
0214     connect(m_sourceModel.data(), &QAbstractItemModel::modelReset, this, &QAbstractItemModel::modelReset, Qt::UniqueConnection);
0215     connect(m_sourceModel.data(), &QAbstractItemModel::modelReset, this, &AbstractModel::countChanged, Qt::UniqueConnection);
0216     connect(m_sourceModel.data(), &QAbstractItemModel::layoutChanged, this, &QAbstractItemModel::layoutChanged, Qt::UniqueConnection);
0217 }
0218 
0219 void ForwardingModel::disconnectSignals()
0220 {
0221     if (!m_sourceModel) {
0222         return;
0223     }
0224 
0225     disconnect(m_sourceModel, nullptr, this, nullptr);
0226 }