From e52a02bb77c5292a016d2c14e0730d44d25d4000 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 10 Mar 2017 21:50:08 +0100 Subject: Simple peoplemodel for addressbook Currently just queries for a flat list of contacts. Read-only. --- framework/domain/CMakeLists.txt | 1 + framework/domain/contactcontroller.cpp | 33 +++++++---- framework/domain/contactcontroller.h | 12 ++-- framework/domain/mailplugin.cpp | 2 + framework/domain/peoplemodel.cpp | 101 +++++++++++++++++++++++++++++++++ framework/domain/peoplemodel.h | 63 ++++++++++++++++++++ 6 files changed, 192 insertions(+), 20 deletions(-) create mode 100644 framework/domain/peoplemodel.cpp create mode 100644 framework/domain/peoplemodel.h (limited to 'framework') diff --git a/framework/domain/CMakeLists.txt b/framework/domain/CMakeLists.txt index 9abc54b0..b3f7acc5 100644 --- a/framework/domain/CMakeLists.txt +++ b/framework/domain/CMakeLists.txt @@ -25,6 +25,7 @@ set(mailplugin_SRCS foldercontroller.cpp mouseproxy.cpp contactcontroller.cpp + peoplemodel.cpp ) find_package(KF5 REQUIRED COMPONENTS Package) diff --git a/framework/domain/contactcontroller.cpp b/framework/domain/contactcontroller.cpp index 0be90e77..a1a805c9 100644 --- a/framework/domain/contactcontroller.cpp +++ b/framework/domain/contactcontroller.cpp @@ -18,16 +18,17 @@ #include "contactcontroller.h" +#include + ContactController::ContactController() : Kube::Controller(), action_save{new Kube::ControllerAction{this, &ContactController::save}} { - loadContact("test"); updateSaveAction(); } void ContactController::save() { - //TODO + qWarning() << "Saving is not implemented"; } void ContactController::updateSaveAction() @@ -37,23 +38,31 @@ void ContactController::updateSaveAction() void ContactController::loadContact(const QVariant &contact) { - setName("Anita Rosenzweig"); - m_emails << "rosenzweig@kolabnow.com" << "wolfi@kolabnow.com"; + if (auto c = contact.value()) { + setName(c->getFn()); + QStringList emails; + for (const auto &e : c->getEmails()) { + emails << e; + } + setEmails(emails); + } } -void ContactController::removeEmail(const QString &email) +QVariant ContactController::contact() const { - m_emails.removeOne(email); - emit emailsChanged(); + return QVariant{}; } -void ContactController::addEmail(const QString &email) +void ContactController::removeEmail(const QString &email) { - m_emails << email; - emit emailsChanged(); + auto emails = getEmails(); + emails.removeAll(email); + setEmails(emails); } -QStringList ContactController::emails() const +void ContactController::addEmail(const QString &email) { - return m_emails; + auto emails = getEmails(); + emails.append(email); + setEmails(emails); } diff --git a/framework/domain/contactcontroller.h b/framework/domain/contactcontroller.h index d9bca563..d1973d9c 100644 --- a/framework/domain/contactcontroller.h +++ b/framework/domain/contactcontroller.h @@ -29,28 +29,24 @@ class ContactController : public Kube::Controller { Q_OBJECT - Q_PROPERTY(QStringList emails READ emails NOTIFY emailsChanged) + // Input properties + Q_PROPERTY(QVariant contact READ contact WRITE loadContact) //Interface properties KUBE_CONTROLLER_PROPERTY(QString, Name, name) + KUBE_CONTROLLER_PROPERTY(QStringList, Emails, emails) KUBE_CONTROLLER_ACTION(save) public: explicit ContactController(); - QStringList emails() const; - Q_INVOKABLE void loadContact(const QVariant &contact); Q_INVOKABLE void removeEmail(const QString &email); Q_INVOKABLE void addEmail(const QString &email); -signals: - void emailsChanged(); + QVariant contact() const; private slots: void updateSaveAction(); - -private: - QStringList m_emails; }; diff --git a/framework/domain/mailplugin.cpp b/framework/domain/mailplugin.cpp index fba6c458..12b9a7ce 100644 --- a/framework/domain/mailplugin.cpp +++ b/framework/domain/mailplugin.cpp @@ -31,6 +31,7 @@ #include "foldercontroller.h" #include "mouseproxy.h" #include "contactcontroller.h" +#include "peoplemodel.h" #include @@ -49,4 +50,5 @@ void MailPlugin::registerTypes (const char *uri) qmlRegisterType(uri, 1, 0, "FolderController"); qmlRegisterType(uri, 1, 0, "MouseProxy"); qmlRegisterType(uri, 1, 0,"ContactController"); + qmlRegisterType(uri, 1, 0,"PeopleModel"); } diff --git a/framework/domain/peoplemodel.cpp b/framework/domain/peoplemodel.cpp new file mode 100644 index 00000000..7cc2f3fa --- /dev/null +++ b/framework/domain/peoplemodel.cpp @@ -0,0 +1,101 @@ +/* + Copyright (c) 2016 Michael Bohlender + Copyright (c) 2016 Christian Mollekopf + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ +#include "peoplemodel.h" + +#include +#include + +PeopleModel::PeopleModel(QObject *parent) + : QSortFilterProxyModel() +{ + using namespace Sink::ApplicationDomain; + + setDynamicSortFilter(true); + sort(0, Qt::DescendingOrder); + Sink::Query query; + query.setFlags(Sink::Query::LiveQuery); + query.request(); + query.request(); + query.request(); + query.request(); + runQuery(query); +} + +PeopleModel::~PeopleModel() +{ + +} + +QHash< int, QByteArray > PeopleModel::roleNames() const +{ + static QHash roles = { + {Name, "name"}, + {Emails, "emails"}, + {Addressbook, "addressbook"}, + {Type, "type"}, + {DomainObject, "domainObject"} + }; + return roles; +} + +QVariant PeopleModel::data(const QModelIndex &idx, int role) const +{ + auto srcIdx = mapToSource(idx); + auto contact = srcIdx.data(Sink::Store::DomainObjectRole).value(); + switch (role) { + case Name: + return contact->getFn(); + case Emails: + return QVariant::fromValue(contact->getEmails()); + case Addressbook: + return contact->getAddressbook(); + case Type: + return "contact"; + case DomainObject: + return QVariant::fromValue(contact); + } + return QSortFilterProxyModel::data(idx, role); +} + +bool PeopleModel::lessThan(const QModelIndex &left, const QModelIndex &right) const +{ + const auto leftName = left.data(Sink::Store::DomainObjectRole).value()->getFn(); + const auto rightName = right.data(Sink::Store::DomainObjectRole).value()->getFn(); + return leftName < rightName; +} + +void PeopleModel::runQuery(const Sink::Query &query) +{ + mModel = Sink::Store::loadModel(query); + setSourceModel(mModel.data()); +} + +void PeopleModel::setAddressbook(const QVariant &parentFolder) +{ + //TODO filter query by addressbook + qWarning() << "The addressbook filter is not yet implemented"; +} + +QVariant PeopleModel::addressbook() const +{ + return QVariant(); +} + + diff --git a/framework/domain/peoplemodel.h b/framework/domain/peoplemodel.h new file mode 100644 index 00000000..419d59a6 --- /dev/null +++ b/framework/domain/peoplemodel.h @@ -0,0 +1,63 @@ +/* + Copyright (c) 2016 Michael Bohlender + Copyright (c) 2016 Christian Mollekopf + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + 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 Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#pragma once + +#include +#include + +namespace Sink { + class Query; +}; + +/** + * A model that mixes addressbooks, contact groups and contacts + */ +class PeopleModel : public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY (QVariant addressbook READ addressbook WRITE setAddressbook) + +public: + PeopleModel(QObject *parent = Q_NULLPTR); + ~PeopleModel(); + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; + + bool lessThan(const QModelIndex &left, const QModelIndex &right) const Q_DECL_OVERRIDE; + + enum Roles { + Name = Qt::UserRole + 1, + Type, + Emails, + Addressbook, + DomainObject + }; + + QHash roleNames() const Q_DECL_OVERRIDE; + + void runQuery(const Sink::Query &query); + + void setAddressbook(const QVariant &parentFolder); + QVariant addressbook() const; + +private: + QSharedPointer mModel; +}; -- cgit v1.2.3