From 36f9c93e08a02945243299eecdea7af5f37586f6 Mon Sep 17 00:00:00 2001 From: Josef Rokos Date: Fri, 6 Nov 2015 14:19:52 +0100 Subject: [PATCH] Added support for automatic sorting. --- core/autotablemodel.h | 96 ++++++++++++++++++++++++++++++++----------- 1 file changed, 71 insertions(+), 25 deletions(-) diff --git a/core/autotablemodel.h b/core/autotablemodel.h index 3586d7c..9293e59 100644 --- a/core/autotablemodel.h +++ b/core/autotablemodel.h @@ -6,6 +6,8 @@ #include #include +#include "core_global.h" + template class AutoTableModel : public QAbstractTableModel { @@ -18,15 +20,46 @@ public: virtual ~AutoTableModel() {} +private: + class Comparator + { + public: + Comparator(const QString &property, Qt::SortOrder order) + { + m_property = property; + m_order = order; + } + + bool operator()(QSharedPointer entA, QSharedPointer 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 public: int rowCount(const QModelIndex &parent = QModelIndex()) const { + Q_UNUSED(parent) + return m_list.size(); } int columnCount(const QModelIndex &parent = QModelIndex()) const { + Q_UNUSED(parent) + if (m_list.isEmpty()) { return 0; @@ -56,8 +89,43 @@ public: return 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); + } + + 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 itemFromIndex(const QModelIndex &index) const { return m_list.at(index.row()); @@ -93,32 +161,10 @@ public: } private: + friend class Comparator; QList > 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