Added support for automatic sorting.

print
Josef Rokos 9 years ago
parent 49b2e231c0
commit 36f9c93e08

@ -6,6 +6,8 @@
#include <QMetaProperty> #include <QMetaProperty>
#include <QModelIndex> #include <QModelIndex>
#include "core_global.h"
template<class T> template<class T>
class AutoTableModel : public QAbstractTableModel class AutoTableModel : public QAbstractTableModel
{ {
@ -18,15 +20,46 @@ public:
virtual ~AutoTableModel() {} virtual ~AutoTableModel() {}
private:
class Comparator
{
public:
Comparator(const QString &property, Qt::SortOrder order)
{
m_property = property;
m_order = order;
}
bool operator()(QSharedPointer<T> entA, QSharedPointer<T> entB) {
QObject *rawEntityA = (QObject*)entA.data();
QObject *rawEntityB = (QObject*)entB.data();
if (m_order == Qt::AscendingOrder) {
return rawEntityA->property(m_property.toStdString().c_str()) < rawEntityB->property(m_property.toStdString().c_str());
} else {
return rawEntityB->property(m_property.toStdString().c_str()) < rawEntityA->property(m_property.toStdString().c_str());
}
}
private:
QString m_property;
Qt::SortOrder m_order;
};
// QAbstractItemModel interface // QAbstractItemModel interface
public: public:
int rowCount(const QModelIndex &parent = QModelIndex()) const int rowCount(const QModelIndex &parent = QModelIndex()) const
{ {
Q_UNUSED(parent)
return m_list.size(); return m_list.size();
} }
int columnCount(const QModelIndex &parent = QModelIndex()) const int columnCount(const QModelIndex &parent = QModelIndex()) const
{ {
Q_UNUSED(parent)
if (m_list.isEmpty()) if (m_list.isEmpty())
{ {
return 0; return 0;
@ -56,8 +89,43 @@ public:
return m_list; return m_list;
} }
// QAbstractItemModel interface QVariant headerData(int section, Qt::Orientation orientation, int role) const
public: {
if (role != Qt::DisplayRole) {
return QVariant();
}
if (orientation == Qt::Horizontal) {
QObject *entity = (QObject*)new T();
for (int i = 0; i < entity->metaObject()->propertyCount(); i++) {
if (i == section) {
QString colName(entity->metaObject()->property(i + 1).name());
return tr(colName.toStdString().c_str());
}
}
delete entity;
}
return QVariant(section + 1);
}
virtual void sort(int column, Qt::SortOrder order) {
if (m_list.isEmpty()) {
return;
}
beginResetModel();
QObject *rawEntity = (QObject*)m_list.at(0).data();
Comparator c(rawEntity->metaObject()->property(column + 1).name(), order);
std::sort(m_list.begin(), m_list.end(), c);
endResetModel();
}
/*///////////////////////*/
QSharedPointer<T> itemFromIndex(const QModelIndex &index) const QSharedPointer<T> itemFromIndex(const QModelIndex &index) const
{ {
return m_list.at(index.row()); return m_list.at(index.row());
@ -93,32 +161,10 @@ public:
} }
private: private:
friend class Comparator;
QList<QSharedPointer<T> > m_list; QList<QSharedPointer<T> > m_list;
// QAbstractItemModel interface
public:
QVariant headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole) {
return QVariant();
}
if (orientation == Qt::Horizontal) {
QObject *entity = (QObject*)new T();
for (int i = 0; i < entity->metaObject()->propertyCount(); i++) {
if (i == section) {
QString colName(entity->metaObject()->property(i + 1).name());
return tr(colName.toStdString().c_str());
}
}
delete entity;
}
return QVariant(section + 1);
}
}; };
#endif // ODBTABLEMODEL_H #endif // ODBTABLEMODEL_H

Loading…
Cancel
Save