/*
* Copyright (C) 2014 Canonical, Ltd.
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
* SATISFACTORY QUALITY, 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 program. If not, see .
*/
#ifndef OBJECTLISTMODEL_H
#define OBJECTLISTMODEL_H
// Qt
#include
template
class ObjectListModel : public QAbstractListModel
{
public:
ObjectListModel(QObject *parent = 0)
: QAbstractListModel(parent)
{}
enum Roles {
RoleModelData = Qt::UserRole,
};
const QList& list() const { return m_items; }
bool contains(TYPE* item) const { return m_items.contains(item); }
void insert(uint index, TYPE* item)
{
index = qMin(index, (uint)m_items.count());
int existingIndex = m_items.indexOf(item);
if (existingIndex != -1) {
move(existingIndex, qMin(index, (uint)(m_items.count()-1)));
} else {
beginInsertRows(QModelIndex(), index, index);
m_items.insert(index, item);
endInsertRows();
}
}
void remove(TYPE* item)
{
int existingIndex = m_items.indexOf(item);
if (existingIndex != -1) {
beginRemoveRows(QModelIndex(), existingIndex, existingIndex);
m_items.removeAt(existingIndex);
endRemoveRows();
}
}
// from QAbstractItemModel
int rowCount(const QModelIndex& = QModelIndex()) const override
{
return m_items.count();
}
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override
{
if (index.row() >= 0 && index.row() < m_items.count()) {
if (role == RoleModelData) {
TYPE *item = m_items.at(index.row());
return QVariant::fromValue(item);
}
}
return QVariant();
}
QHash roleNames() const
{
QHash roleNames;
roleNames.insert(RoleModelData, "modelData");
return roleNames;
}
protected:
void move(int from, int to)
{
if (from == to) return;
if (from >= 0 && from < m_items.size() && to >= 0 && to < m_items.size()) {
QModelIndex parent;
/* When moving an item down, the destination index needs to be incremented
by one, as explained in the documentation:
http://qt-project.org/doc/qt-5.0/qtcore/qabstractitemmodel.html#beginMoveRows */
beginMoveRows(parent, from, from, parent, to + (to > from ? 1 : 0));
m_items.move(from, to);
endMoveRows();
}
}
QList m_items;
};
#endif // OBJECTLISTMODEL_H