/*
* This file is part of TelepathyQt4Yell Models
*
* Copyright (C) 2010 Collabora Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include
#include "TelepathyQt4Yell/Models/_gen/flat-model-proxy.moc.hpp"
#include
namespace Tpy
{
struct TELEPATHY_QT4_YELL_MODELS_NO_EXPORT FlatModelProxy::Private
{
int offsetOf(const FlatModelProxy *model, int index) const;
};
int FlatModelProxy::Private::offsetOf(const FlatModelProxy *model, int index) const
{
int offset = 0;
for (int i = 0; i < index; i++) {
offset += model->sourceModel()->rowCount(model->sourceModel()->index(i, 0, QModelIndex()));
}
return offset;
}
FlatModelProxy::FlatModelProxy(QAbstractItemModel *source)
: QAbstractProxyModel(source),
mPriv(new Private())
{
setSourceModel(source);
connect(source,
SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
SLOT(onRowsAboutToBeInserted(QModelIndex,int,int)));
connect(source,
SIGNAL(rowsInserted(QModelIndex,int,int)),
SLOT(onRowsInserted(QModelIndex,int,int)));
connect(source,
SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int)));
connect(source,
SIGNAL(rowsRemoved(QModelIndex,int,int)),
SLOT(onRowsRemoved(QModelIndex,int,int)));
connect(source,
SIGNAL(rowsInserted(QModelIndex,int,int)),
SIGNAL(rowCountChanged()));
connect(source,
SIGNAL(rowsRemoved(QModelIndex,int,int)),
SIGNAL(rowCountChanged()));
connect(source,
SIGNAL(dataChanged(QModelIndex,QModelIndex)),
SLOT(onDataChanged(QModelIndex,QModelIndex)));
Tpy::AccountsModel *accountsModel = qobject_cast (source);
if (accountsModel) {
connect(accountsModel,
SIGNAL(hierarchicalDataChanged(QModelIndex,QModelIndex)),
SLOT(onHierarchicalDataChanged(QModelIndex,QModelIndex)));
}
}
FlatModelProxy::~FlatModelProxy()
{
delete mPriv;
}
QModelIndex FlatModelProxy::mapFromSource(const QModelIndex &index) const
{
if (!index.isValid()) {
return QModelIndex();
}
QModelIndex parent = index.parent();
if (!parent.isValid()) {
return QModelIndex();
}
return createIndex(mPriv->offsetOf(this, parent.row()) + index.row(), index.column(), parent.row());
}
QModelIndex FlatModelProxy::mapToSource(const QModelIndex &index) const
{
int parentRow = index.internalId();
QModelIndex parent = sourceModel()->index(parentRow, 0, QModelIndex());
int row = index.row() - mPriv->offsetOf(this, parent.row());
return sourceModel()->index(row, index.column(), parent);
}
QModelIndex FlatModelProxy::index(int row, int column, const QModelIndex &parent) const
{
int count = 0;
for (int i = 0; i < sourceModel()->rowCount(QModelIndex()); i++) {
QModelIndex sourceIndex = sourceModel()->index(i, 0, QModelIndex());
count += sourceModel()->rowCount(sourceIndex);
if (row < count) {
return createIndex(row, column, i);
}
}
return QModelIndex();
}
QModelIndex FlatModelProxy::parent(const QModelIndex &index) const
{
return QModelIndex();
}
int FlatModelProxy::columnCount(const QModelIndex &parent) const
{
return 1;
}
int FlatModelProxy::rowCount() const
{
return rowCount(QModelIndex());
}
int FlatModelProxy::rowCount(const QModelIndex &parent) const
{
return mPriv->offsetOf(this, sourceModel()->rowCount(QModelIndex()));
}
void FlatModelProxy::onRowsAboutToBeInserted(const QModelIndex &index, int first, int last)
{
if (index.isValid()) {
int offset = mPriv->offsetOf(this, index.row());
int firstIndex = offset + first;
int lastIndex = offset + last;
beginInsertRows(QModelIndex(), firstIndex, lastIndex);
}
}
void FlatModelProxy::onRowsAboutToBeRemoved(const QModelIndex &index, int first, int last)
{
if (index.isValid()) {
int offset = mPriv->offsetOf(this, index.row());
int firstIndex = offset + first;
int lastIndex = offset + last;
beginRemoveRows(QModelIndex(), firstIndex, lastIndex);
}
}
void FlatModelProxy::onRowsInserted(const QModelIndex &index, int first, int last)
{
if (index.isValid()) {
endInsertRows();
}
}
void FlatModelProxy::onRowsRemoved(const QModelIndex &index, int first, int last)
{
if (index.isValid()) {
endRemoveRows();
}
}
void FlatModelProxy::onDataChanged(const QModelIndex &first, const QModelIndex &last)
{
if (first.parent().isValid() && last.parent().isValid() && first.parent() == last.parent()) {
QModelIndex firstIndex = mapFromSource(first);
QModelIndex lastIndex = mapFromSource(last);
emit dataChanged(firstIndex, lastIndex);
}
}
void FlatModelProxy::onHierarchicalDataChanged(const QModelIndex &first, const QModelIndex &last)
{
if (!first.parent().isValid() && !last.parent().isValid()) {
int firstOffset = mPriv->offsetOf(this, first.row());
int lastOffset = mPriv->offsetOf(this, last.row() + 1) - 1;
QModelIndex firstIndex = createIndex(firstOffset, 0, first.row());
QModelIndex lastIndex = createIndex(lastOffset, 0, last.row());
emit dataChanged(firstIndex, lastIndex);
} else {
// do not do normal dataChanged, since dataChanged it was already triggered separately
//onDataChanged(first, last);
}
}
}