From 98a057260f51b8af2cf3f933119e08590cc0639b Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 21 Oct 2015 09:57:33 +0200 Subject: Moved the ListModelResult to a separate file --- common/listmodelresult.cpp | 21 +++++++++ common/listmodelresult.h | 104 +++++++++++++++++++++++++++++++++++++++++++++ examples/client/main.cpp | 84 +----------------------------------- 3 files changed, 127 insertions(+), 82 deletions(-) create mode 100644 common/listmodelresult.cpp create mode 100644 common/listmodelresult.h diff --git a/common/listmodelresult.cpp b/common/listmodelresult.cpp new file mode 100644 index 0000000..6ef1c5f --- /dev/null +++ b/common/listmodelresult.cpp @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2014 Christian Mollekopf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY 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 library. If not, see . + */ + +#include "listmodelresult.h" diff --git a/common/listmodelresult.h b/common/listmodelresult.h new file mode 100644 index 0000000..a893fee --- /dev/null +++ b/common/listmodelresult.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2014 Christian Mollekopf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY 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 library. If not, see . + */ + +#pragma once +#include + +#include "common/resultprovider.h" + +enum Roles { + DomainObjectRole = Qt::UserRole + 1 +}; + +template +class ListModelResult : public QAbstractListModel +{ +public: + + ListModelResult(const QSharedPointer > &emitter, const QByteArray &property) + :QAbstractListModel(), + mEmitter(emitter), + mProperty(property) + { + emitter->onAdded([this, property](const T &value) { + const auto keys = mEntities.keys(); + int index = 0; + for (; index < keys.size(); index++) { + if (value->identifier() < keys.at(index)) { + break; + } + } + beginInsertRows(QModelIndex(), index, index); + mEntities.insert(value->identifier(), value); + endInsertRows(); + }); + emitter->onModified([this, property](const T &value) { + mEntities.remove(value->identifier()); + mEntities.insert(value->identifier(), value); + //FIXME + // emit dataChanged(); + }); + emitter->onRemoved([this, property](const T &value) { + auto index = mEntities.keys().indexOf(value->identifier()); + beginRemoveRows(QModelIndex(), index, index); + mEntities.remove(value->identifier()); + endRemoveRows(); + }); + emitter->onInitialResultSetComplete([this]() { + }); + emitter->onComplete([this]() { + // qDebug() << "COMPLETE"; + mEmitter.clear(); + }); + emitter->onClear([this]() { + // qDebug() << "CLEAR"; + beginResetModel(); + mEntities.clear(); + endResetModel(); + }); + } + + int rowCount(const QModelIndex &parent = QModelIndex()) const + { + return mEntities.size(); + } + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const + { + if (index.row() >= mEntities.size()) { + qWarning() << "Out of bounds access"; + return QVariant(); + } + if (role == Qt::DisplayRole) { + auto entity = mEntities.value(mEntities.keys().at(index.row())); + return entity->getProperty(mProperty).toString() + entity->identifier(); + } + if (role == DomainObjectRole) { + return QVariant::fromValue(mEntities.value(mEntities.keys().at(index.row()))); + } + return QVariant(); + } + +private: + QSharedPointer > mEmitter; + QMap mEntities; + QByteArray mProperty; +}; + diff --git a/examples/client/main.cpp b/examples/client/main.cpp index e96ddb6..269f1aa 100644 --- a/examples/client/main.cpp +++ b/examples/client/main.cpp @@ -20,12 +20,10 @@ #include #include #include -#include #include "common/clientapi.h" -#include "common/resultprovider.h" #include "common/resource.h" -#include "common/synclistresult.h" +#include "common/listmodelresult.h" #include "common/storage.h" #include "common/domain/event.h" #include "console.h" @@ -37,10 +35,6 @@ #include #include -enum Roles { - DomainObjectRole = Qt::UserRole + 1 -}; - template class View : public QWidget { @@ -85,80 +79,6 @@ public: }; -template -class AkonadiListModel : public QAbstractListModel -{ -public: - AkonadiListModel(const QSharedPointer > &emitter, const QByteArray &property) - :QAbstractListModel(), - mEmitter(emitter), - mProperty(property) - { - emitter->onAdded([this, property](const T &value) { - const auto keys = mEntities.keys(); - int index = 0; - for (; index < keys.size(); index++) { - if (value->identifier() < keys.at(index)) { - break; - } - } - beginInsertRows(QModelIndex(), index, index); - mEntities.insert(value->identifier(), value); - endInsertRows(); - }); - emitter->onModified([this, property](const T &value) { - mEntities.remove(value->identifier()); - mEntities.insert(value->identifier(), value); - //FIXME - // emit dataChanged(); - }); - emitter->onRemoved([this, property](const T &value) { - auto index = mEntities.keys().indexOf(value->identifier()); - beginRemoveRows(QModelIndex(), index, index); - mEntities.remove(value->identifier()); - endRemoveRows(); - }); - emitter->onInitialResultSetComplete([this]() { - }); - emitter->onComplete([this]() { - // qDebug() << "COMPLETE"; - mEmitter.clear(); - }); - emitter->onClear([this]() { - // qDebug() << "CLEAR"; - beginResetModel(); - mEntities.clear(); - endResetModel(); - }); - } - - int rowCount(const QModelIndex &parent = QModelIndex()) const - { - return mEntities.size(); - } - - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const - { - if (index.row() >= mEntities.size()) { - qWarning() << "Out of bounds access"; - return QVariant(); - } - if (role == Qt::DisplayRole) { - auto entity = mEntities.value(mEntities.keys().at(index.row())); - return entity->getProperty(mProperty).toString() + entity->identifier(); - } - if (role == DomainObjectRole) { - return QVariant::fromValue(mEntities.value(mEntities.keys().at(index.row()))); - } - return QVariant(); - } - -private: - QSharedPointer > mEmitter; - QMap mEntities; - QByteArray mProperty; -}; - int main(int argc, char *argv[]) { QApplication app(argc, argv); @@ -201,7 +121,7 @@ int main(int argc, char *argv[]) query.processAll = false; query.liveQuery = true; - auto model = QSharedPointer >::create(Akonadi2::Store::load(query), "summary"); + auto model = QSharedPointer >::create(Akonadi2::Store::load(query), "summary"); auto view = QSharedPointer >::create(model.data()); return app.exec(); -- cgit v1.2.3