put the model into a QSortFilterProxyModel to mke possible to sort and filter trough a regular expression

svn path=/trunk/KDE/kdebase/runtime/; revision=1190082
This commit is contained in:
Marco Martin 2010-10-26 21:19:04 +00:00
parent a780189547
commit ab064bedfa
3 changed files with 148 additions and 18 deletions

View File

@ -49,8 +49,8 @@ void CoreBindingsPlugin::registerTypes(const char *uri)
qmlRegisterInterface<Plasma::Service>("Service"); qmlRegisterInterface<Plasma::Service>("Service");
qRegisterMetaType<Plasma::Service*>("Service"); qRegisterMetaType<Plasma::Service*>("Service");
qmlRegisterInterface<Plasma::DataSource>("DataSource"); /*qmlRegisterInterface<Plasma::DataSource>("DataSource");
qRegisterMetaType<Plasma::DataSource*>("DataSource"); qRegisterMetaType<Plasma::DataSource*>("DataSource");*/
} }

View File

@ -26,17 +26,84 @@ namespace Plasma
{ {
DataModel::DataModel(QObject* parent) DataModel::DataModel(QObject* parent)
: QAbstractItemModel(parent), : QSortFilterProxyModel(parent)
m_dataSource(0)
{ {
setObjectName("DataModel"); setObjectName("DataModel");
setDynamicSortFilter(true);
m_internalDataModel = new InternalDataModel(this);
setSourceModel(m_internalDataModel);
} }
DataModel::~DataModel() DataModel::~DataModel()
{ {
} }
void DataModel::dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data) void DataModel::setDataSource(QObject *source)
{
m_internalDataModel->setDataSource(source);
}
QObject *DataModel::dataSource() const
{
return m_internalDataModel->dataSource();
}
void DataModel::setKey(const QString key)
{
m_internalDataModel->setKey(key);
}
QString DataModel::key() const
{
return m_internalDataModel->key();
}
void DataModel::setFilterRegExp(const QString &exp)
{
QSortFilterProxyModel::setFilterRegExp(QRegExp(exp));
}
QString DataModel::filterRegExp() const
{
return QSortFilterProxyModel::filterRegExp().pattern();
}
void DataModel::setFilterRole(const QString &role)
{
QSortFilterProxyModel::setFilterRole(m_internalDataModel->roleNameToId(role));
m_filterRole = role;
}
QString DataModel::filterRole() const
{
return m_filterRole;
}
void DataModel::setSortRole(const QString &role)
{
QSortFilterProxyModel::setSortRole(m_internalDataModel->roleNameToId(role));
m_sortRole = role;
}
QString DataModel::sortRole() const
{
return m_sortRole;
}
InternalDataModel::InternalDataModel(DataModel* parent)
: QAbstractItemModel(parent),
m_dataModel(parent),
m_dataSource(0)
{
}
InternalDataModel::~InternalDataModel()
{
}
void InternalDataModel::dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data)
{ {
Q_UNUSED(sourceName); Q_UNUSED(sourceName);
@ -59,7 +126,7 @@ void DataModel::dataUpdated(const QString &sourceName, const Plasma::DataEngine:
} }
} }
void DataModel::setDataSource(QObject *object) void InternalDataModel::setDataSource(QObject *object)
{ {
DataSource *source = qobject_cast<DataSource *>(object); DataSource *source = qobject_cast<DataSource *>(object);
if (!source) { if (!source) {
@ -76,12 +143,12 @@ void DataModel::setDataSource(QObject *object)
this, SLOT(dataUpdated(const QString &, const Plasma::DataEngine::Data &))); this, SLOT(dataUpdated(const QString &, const Plasma::DataEngine::Data &)));
} }
QObject *DataModel::dataSource() const QObject *InternalDataModel::dataSource() const
{ {
return m_dataSource; return m_dataSource;
} }
void DataModel::setKey(const QString key) void InternalDataModel::setKey(const QString key)
{ {
if (m_key == key) { if (m_key == key) {
return; return;
@ -90,12 +157,12 @@ void DataModel::setKey(const QString key)
m_key = key; m_key = key;
} }
QString DataModel::key() const QString InternalDataModel::key() const
{ {
return m_key; return m_key;
} }
void DataModel::setItems(const QVariantList &list) void InternalDataModel::setItems(const QVariantList &list)
{ {
emit modelAboutToBeReset(); emit modelAboutToBeReset();
@ -105,19 +172,31 @@ void DataModel::setItems(const QVariantList &list)
if (!list.isEmpty()) { if (!list.isEmpty()) {
int role = Qt::UserRole; int role = Qt::UserRole;
m_roleNames.clear(); m_roleNames.clear();
m_roleIds.clear();
if (list.first().canConvert<QVariantHash>()) { if (list.first().canConvert<QVariantHash>()) {
foreach (QString roleName, list.first().value<QVariantHash>().keys()) { foreach (QString roleName, list.first().value<QVariantHash>().keys()) {
++role; ++role;
m_roleNames[role] = roleName.toLatin1(); m_roleNames[role] = roleName.toLatin1();
m_roleIds[roleName] = role;
} }
} else { } else {
foreach (QString roleName, list.first().value<QVariantMap>().keys()) { foreach (QString roleName, list.first().value<QVariantMap>().keys()) {
++role; ++role;
m_roleNames[role] = roleName.toLatin1(); m_roleNames[role] = roleName.toLatin1();
m_roleIds[roleName] = role;
} }
} }
setRoleNames(m_roleNames); setRoleNames(m_roleNames);
if (m_dataModel) {
m_dataModel->setRoleNames(m_roleNames);
//FIXME: ugly, but since the filter role can be set before population it can be re setted afterwards
m_dataModel->setFilterRole(m_dataModel->filterRole());
m_dataModel->setSortRole(m_dataModel->sortRole());
}
} }
//make the declarative view reload everything, //make the declarative view reload everything,
@ -125,7 +204,7 @@ void DataModel::setItems(const QVariantList &list)
emit modelReset(); emit modelReset();
} }
QVariant DataModel::data(const QModelIndex &index, int role) const QVariant InternalDataModel::data(const QModelIndex &index, int role) const
{ {
if (!index.isValid() || index.column() > 0 || if (!index.isValid() || index.column() > 0 ||
index.row() < 0 || index.row() >= m_items.count()){ index.row() < 0 || index.row() >= m_items.count()){
@ -139,7 +218,7 @@ QVariant DataModel::data(const QModelIndex &index, int role) const
} }
} }
QVariant DataModel::headerData(int section, Qt::Orientation orientation, int role) const QVariant InternalDataModel::headerData(int section, Qt::Orientation orientation, int role) const
{ {
Q_UNUSED(section) Q_UNUSED(section)
Q_UNUSED(orientation) Q_UNUSED(orientation)
@ -148,7 +227,7 @@ QVariant DataModel::headerData(int section, Qt::Orientation orientation, int rol
return QVariant(); return QVariant();
} }
QModelIndex DataModel::index(int row, int column, const QModelIndex &parent) const QModelIndex InternalDataModel::index(int row, int column, const QModelIndex &parent) const
{ {
if (parent.isValid() || column > 0 || row < 0 || row >= m_items.count()) { if (parent.isValid() || column > 0 || row < 0 || row >= m_items.count()) {
return QModelIndex(); return QModelIndex();
@ -157,14 +236,14 @@ QModelIndex DataModel::index(int row, int column, const QModelIndex &parent) con
return createIndex(row, column, 0); return createIndex(row, column, 0);
} }
QModelIndex DataModel::parent(const QModelIndex &child) const QModelIndex InternalDataModel::parent(const QModelIndex &child) const
{ {
Q_UNUSED(child) Q_UNUSED(child)
return QModelIndex(); return QModelIndex();
} }
int DataModel::rowCount(const QModelIndex &parent) const int InternalDataModel::rowCount(const QModelIndex &parent) const
{ {
//this is not a tree //this is not a tree
//TODO: make it possible some day? //TODO: make it possible some day?
@ -175,7 +254,7 @@ int DataModel::rowCount(const QModelIndex &parent) const
return m_items.count(); return m_items.count();
} }
int DataModel::columnCount(const QModelIndex &parent) const int InternalDataModel::columnCount(const QModelIndex &parent) const
{ {
if (parent.isValid()) { if (parent.isValid()) {
return 0; return 0;
@ -184,5 +263,13 @@ int DataModel::columnCount(const QModelIndex &parent) const
return 1; return 1;
} }
int InternalDataModel::roleNameToId(const QString &name)
{
if (!m_roleIds.contains(name)) {
return -1;
}
return m_roleIds.value(name);
}
} }
#include "datamodel.moc" #include "datamodel.moc"

View File

@ -21,6 +21,7 @@
#define DATAMODEL_H #define DATAMODEL_H
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include <QSortFilterProxyModel>
#include <QVector> #include <QVector>
#include <Plasma/DataEngine> #include <Plasma/DataEngine>
@ -29,13 +30,20 @@ namespace Plasma
{ {
class DataSource; class DataSource;
class InternalDataModel;
class DataModel : public QAbstractItemModel class DataModel : public QSortFilterProxyModel
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QObject *dataSource READ dataSource WRITE setDataSource) Q_PROPERTY(QObject *dataSource READ dataSource WRITE setDataSource)
Q_PROPERTY(QString key READ key WRITE setKey) Q_PROPERTY(QString key READ key WRITE setKey)
Q_PROPERTY(QString filterRegExp READ filterRegExp WRITE setFilterRegExp)
Q_PROPERTY(QString filterRole READ filterRole WRITE setFilterRole)
Q_PROPERTY(QString sortRole READ sortRole WRITE setSortRole)
friend class InternalDataModel;
public: public:
DataModel(QObject* parent=0); DataModel(QObject* parent=0);
~DataModel(); ~DataModel();
@ -46,14 +54,47 @@ public:
void setKey(const QString key); void setKey(const QString key);
QString key() const; QString key() const;
void setFilterRegExp(const QString &exp);
QString filterRegExp() const;
void setFilterRole(const QString &role);
QString filterRole() const;
void setSortRole(const QString &role);
QString sortRole() const;
private:
InternalDataModel *m_internalDataModel;
QString m_filterRole;
QString m_sortRole;
};
class InternalDataModel : public QAbstractItemModel
{
Q_OBJECT
Q_PROPERTY(QObject *dataSource READ dataSource WRITE setDataSource)
Q_PROPERTY(QString key READ key WRITE setKey)
public:
InternalDataModel(DataModel* parent=0);
~InternalDataModel();
void setDataSource(QObject *source);
QObject *dataSource() const;
void setKey(const QString key);
QString key() const;
void setItems(const QVariantList &list); void setItems(const QVariantList &list);
int roleNameToId(const QString &name);
//Reimplemented //Reimplemented
QVariant data(const QModelIndex &index, int role) const; QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const; int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column, QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const; const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const; QModelIndex parent(const QModelIndex &child) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const; int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const;
@ -66,10 +107,12 @@ private Q_SLOTS:
void dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data); void dataUpdated(const QString &sourceName, const Plasma::DataEngine::Data &data);
private: private:
DataModel *m_dataModel;
DataSource *m_dataSource; DataSource *m_dataSource;
QString m_key; QString m_key;
QVector<QVariant> m_items; QVector<QVariant> m_items;
QHash<int, QByteArray> m_roleNames; QHash<int, QByteArray> m_roleNames;
QHash<QString, int> m_roleIds;
}; };
} }