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 }