You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

239 lines
7.3 KiB

/***************************************************************************
* Copyright (C) 2015 by Eike Hein <hein@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#include "forwardingmodel.h"
ForwardingModel::ForwardingModel(QObject *parent)
: AbstractModel(parent)
{
}
ForwardingModel::~ForwardingModel()
{
}
QString ForwardingModel::description() const
{
if (!m_sourceModel) {
return QString();
}
AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
if (!abstractModel) {
return QString();
}
return abstractModel->description();
}
QAbstractItemModel *ForwardingModel::sourceModel() const
{
return m_sourceModel;
}
void ForwardingModel::setSourceModel(QAbstractItemModel *sourceModel)
{
disconnectSignals();
beginResetModel();
m_sourceModel = sourceModel;
connectSignals();
endResetModel();
emit countChanged();
emit sourceModelChanged();
emit descriptionChanged();
}
bool ForwardingModel::canFetchMore(const QModelIndex &parent) const
{
if (!m_sourceModel) {
return false;
}
return m_sourceModel->canFetchMore(indexToSourceIndex(parent));
}
void ForwardingModel::fetchMore(const QModelIndex &parent)
{
if (m_sourceModel) {
m_sourceModel->fetchMore(indexToSourceIndex(parent));
}
}
QModelIndex ForwardingModel::index(int row, int column, const QModelIndex &parent) const
{
Q_UNUSED(parent)
if (!m_sourceModel) {
return QModelIndex();
}
return createIndex(row, column);
}
QModelIndex ForwardingModel::parent(const QModelIndex &index) const
{
Q_UNUSED(index)
return QModelIndex();
}
QVariant ForwardingModel::data(const QModelIndex &index, int role) const
{
if (!m_sourceModel) {
return QVariant();
}
return m_sourceModel->data(indexToSourceIndex(index), role);
}
int ForwardingModel::rowCount(const QModelIndex &parent) const
{
if (!m_sourceModel) {
return 0;
}
return m_sourceModel->rowCount(indexToSourceIndex(parent));
}
QModelIndex ForwardingModel::indexToSourceIndex(const QModelIndex &index) const
{
if (!m_sourceModel || !index.isValid()) {
return QModelIndex();
}
return m_sourceModel->index(index.row(), index.column(), index.parent().isValid() ? indexToSourceIndex(index.parent()) : QModelIndex());
}
bool ForwardingModel::trigger(int row, const QString &actionId, const QVariant &argument)
{
if (!m_sourceModel) {
return false;
}
AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
if (!abstractModel) {
return false;
}
return abstractModel->trigger(row, actionId, argument);
}
QString ForwardingModel::labelForRow(int row)
{
if (!m_sourceModel) {
return QString();
}
AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
if (!abstractModel) {
return QString();
}
return abstractModel->labelForRow(row);
}
AbstractModel *ForwardingModel::modelForRow(int row)
{
if (!m_sourceModel) {
return nullptr;
}
AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
if (!abstractModel) {
return nullptr;
}
return abstractModel->modelForRow(row);
}
AbstractModel *ForwardingModel::favoritesModel()
{
AbstractModel *sourceModel = qobject_cast<AbstractModel *>(m_sourceModel);
if (sourceModel) {
return sourceModel->favoritesModel();
}
return AbstractModel::favoritesModel();
}
int ForwardingModel::separatorCount() const
{
if (!m_sourceModel) {
return 0;
}
AbstractModel *abstractModel = qobject_cast<AbstractModel *>(m_sourceModel);
if (!abstractModel) {
return 0;
}
return abstractModel->separatorCount();
}
void ForwardingModel::reset()
{
beginResetModel();
endResetModel();
emit countChanged();
emit separatorCountChanged();
}
void ForwardingModel::connectSignals()
{
if (!m_sourceModel) {
return;
}
connect(m_sourceModel, SIGNAL(destroyed()), this, SLOT(reset()));
connect(m_sourceModel.data(), &QAbstractItemModel::dataChanged, this, &QAbstractItemModel::dataChanged, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsAboutToBeInserted, this, &QAbstractItemModel::rowsAboutToBeInserted, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsAboutToBeMoved, this, &QAbstractItemModel::rowsAboutToBeMoved, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsAboutToBeRemoved, this, &QAbstractItemModel::rowsAboutToBeRemoved, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::layoutAboutToBeChanged, this, &QAbstractItemModel::layoutAboutToBeChanged, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsInserted, this, &QAbstractItemModel::rowsInserted, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsInserted, this, &AbstractModel::countChanged, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsMoved, this, &QAbstractItemModel::rowsMoved, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsRemoved, this, &QAbstractItemModel::rowsRemoved, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::rowsRemoved, this, &AbstractModel::countChanged, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::modelAboutToBeReset, this, &QAbstractItemModel::modelAboutToBeReset, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::modelReset, this, &QAbstractItemModel::modelReset, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::modelReset, this, &AbstractModel::countChanged, Qt::UniqueConnection);
connect(m_sourceModel.data(), &QAbstractItemModel::layoutChanged, this, &QAbstractItemModel::layoutChanged, Qt::UniqueConnection);
}
void ForwardingModel::disconnectSignals()
{
if (!m_sourceModel) {
return;
}
disconnect(m_sourceModel, nullptr, this, nullptr);
}