22
22
#include <QAbstractItemModel>
24
24
ExtraRowProxyModel::ExtraRowProxyModel(QObject* parent)
25
: QAbstractListModel(parent)
28
int ExtraRowProxyModel::appendRow()
32
return m_rows.count() - 1;
35
void ExtraRowProxyModel::setRowData(int id, int column, const QVariant& value, int role)
37
Q_ASSERT(id < m_rows.count());
38
m_rows[id][column][role] = value;
41
void ExtraRowProxyModel::setRowText(int id, int column, const QVariant& value)
43
setRowData(id, column, value, Qt::DisplayRole);
25
: QAbstractListModel(parent),
26
m_extraRowModel(new QStandardItemModel(this))
28
connect(m_extraRowModel, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(onExtraRowsInserted(QModelIndex,int,int)));
29
connect(m_extraRowModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(onExtraRowsRemoved(QModelIndex,int,int)));
30
connect(m_extraRowModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(onExtraDataChanged(QModelIndex,QModelIndex)));
46
33
void ExtraRowProxyModel::setSourceModel(QAbstractItemModel* model)
48
35
if (! m_model.isNull()) {
49
disconnect(m_model.data(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(onSourceRowsInserted(QModelIndex,int,int)));
50
disconnect(m_model.data(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(onSourceRowsRemoved(QModelIndex,int,int)));
51
disconnect(m_model.data(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(onSourceDataChanged(QModelIndex,QModelIndex)));
36
disconnect(m_model.data(), SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(onSourceRowsInserted(QModelIndex,int,int)));
37
disconnect(m_model.data(), SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(onSourceRowsRemoved(QModelIndex,int,int)));
38
disconnect(m_model.data(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onSourceDataChanged(QModelIndex,QModelIndex)));
54
41
m_model = QWeakPointer<QAbstractItemModel>(model);
56
43
setRoleNames(m_model.data()->roleNames());
58
connect(m_model.data(), SIGNAL(rowsInserted(QModelIndex, int, int)), SLOT(onSourceRowsInserted(QModelIndex,int,int)));
59
connect(m_model.data(), SIGNAL(rowsRemoved(QModelIndex, int, int)), SLOT(onSourceRowsRemoved(QModelIndex,int,int)));
60
connect(m_model.data(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), SLOT(onSourceDataChanged(QModelIndex,QModelIndex)));
45
connect(m_model.data(), SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(onSourceRowsInserted(QModelIndex,int,int)));
46
connect(m_model.data(), SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(onSourceRowsRemoved(QModelIndex,int,int)));
47
connect(m_model.data(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(onSourceDataChanged(QModelIndex,QModelIndex)));
50
QStandardItemModel *ExtraRowProxyModel::extraRowModel() const
52
return m_extraRowModel;
63
55
int ExtraRowProxyModel::rowCount(const QModelIndex &) const
65
if (m_model.isNull()) {
66
return m_rows.count();
68
return m_model.data()->rowCount() + m_rows.count();
57
return sourceRowCount() + m_extraRowModel->rowCount();
73
60
QVariant ExtraRowProxyModel::data(const QModelIndex &index, int role) const
76
if (!m_model.isNull()) {
77
count = m_model.data()->rowCount();
78
if (index.row() < count) {
79
return m_model.data()->data(index, role);
83
int extraRow = index.row() - count;
84
if (extraRow >= m_rows.count()) {
88
const Item& item = m_rows[extraRow][index.column()];
89
return item.value(role);
62
if (index.row() < sourceRowCount()) {
63
return m_model.data()->index(index.row(), 0).data(role);
66
int row = index.row() - sourceRowCount();
67
return m_extraRowModel->index(row, 0).data(role);
92
71
void ExtraRowProxyModel::onSourceRowsInserted(const QModelIndex &parent, int start, int end)
108
87
dataChanged(createIndex(topLeft.row(), 0) , createIndex(bottomRight.row(), 0));
90
void ExtraRowProxyModel::onExtraRowsInserted(const QModelIndex &parent, int start, int end)
93
beginInsertRows(QModelIndex(), sourceRowCount() + start, sourceRowCount() + end);
97
void ExtraRowProxyModel::onExtraRowsRemoved(const QModelIndex &parent, int start, int end)
100
beginRemoveRows(QModelIndex(), sourceRowCount() + start, sourceRowCount() + end);
104
void ExtraRowProxyModel::onExtraDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
106
dataChanged(createIndex(sourceRowCount() + topLeft.row(), 0), createIndex(sourceRowCount() + bottomRight.row(), 0));
109
int ExtraRowProxyModel::sourceRowCount() const
111
if (m_model.isNull()) {
114
return m_model.data()->rowCount();