Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[contacts] Add SeasideConstituentModel and SeasideMergeCandidateModel…
…. JB#51381
  • Loading branch information
Bea Lam committed Oct 7, 2020
1 parent 80cee9f commit 37febd3
Show file tree
Hide file tree
Showing 8 changed files with 709 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/plugin.cpp
Expand Up @@ -43,6 +43,8 @@
#include "seasidefilteredmodel.h"
#include "seasidedisplaylabelgroupmodel.h"
#include "seasidevcardmodel.h"
#include "seasideconstituentmodel.h"
#include "seasidemergecandidatemodel.h"
#include "knowncontacts.h"

template <typename T> static QObject *singletonApiCallback(QQmlEngine *engine, QJSEngine *) {
Expand Down Expand Up @@ -93,6 +95,8 @@ class Q_DECL_EXPORT NemoContactsPlugin : public QQmlExtensionPlugin
qmlRegisterType<SeasidePersonAttached>();
qmlRegisterType<SeasidePerson>(uri, 1, 0, "Person");
qmlRegisterType<SeasideVCardModel>(uri, 1, 0, "PeopleVCardModel");
qmlRegisterType<SeasideConstituentModel>(uri, 1, 0, "ConstituentModel");
qmlRegisterType<SeasideMergeCandidateModel>(uri, 1, 0, "MergeCandidateModel");
qmlRegisterUncreatableType<SeasideAddressBook>(uri, 1, 0, "AddressBook", "");
qmlRegisterSingletonType<KnownContacts>(uri, 1, 0, "KnownContacts", singletonApiCallback<KnownContacts>);
}
Expand Down
114 changes: 114 additions & 0 deletions src/seasideconstituentmodel.cpp
@@ -0,0 +1,114 @@
/*
* Copyright (c) 2020 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#include "seasideconstituentmodel.h"
#include "seasideperson.h"

#include <QQmlInfo>

#include <QDebug>

SeasideConstituentModel::SeasideConstituentModel(QObject *parent)
: SeasideSimpleContactModel(parent)
{
}

SeasideConstituentModel::~SeasideConstituentModel()
{
}

SeasidePerson* SeasideConstituentModel::person() const
{
return m_person;
}

void SeasideConstituentModel::setPerson(SeasidePerson *person)
{
if (m_person != person) {
if (m_person) {
m_person->disconnect(this);
m_person = nullptr;
}
if (m_cacheItem) {
m_cacheItem = nullptr;
}

m_person = person;
reset();
emit personChanged();
}
}

void SeasideConstituentModel::reset()
{
if (!m_complete) {
return;
}

if (m_person) {
connect(m_person, &SeasidePerson::constituentsChanged,
this, &SeasideConstituentModel::personConstituentsChanged);

SeasideCache::CacheItem *cacheItem = SeasideCache::itemById(m_person->id());
if (cacheItem) {
m_cacheItem = cacheItem;
m_person->fetchConstituents();
} else {
qmlInfo(this) << "Cannot find cache item for contact:" << m_person->id();
}

} else if (m_contacts.count() > 0) {
setContactIds(QList<int>());
}
}

void SeasideConstituentModel::personConstituentsChanged()
{
if (m_person) {
setContactIds(m_person->constituents());
}
}

void SeasideConstituentModel::itemUpdated(SeasideCache::CacheItem *item)
{
if (item == m_cacheItem) {
m_person->fetchConstituents();
}
SeasideSimpleContactModel::itemUpdated(item);
}

void SeasideConstituentModel::itemAboutToBeRemoved(SeasideCache::CacheItem *item)
{
if (item == m_cacheItem) {
setPerson(nullptr);
}
SeasideSimpleContactModel::itemAboutToBeRemoved(item);
}
69 changes: 69 additions & 0 deletions src/seasideconstituentmodel.h
@@ -0,0 +1,69 @@
/*
* Copyright (c) 2020 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#ifndef SEASIDECONSTITUENTMODEL_H
#define SEASIDECONSTITUENTMODEL_H

#include "seasidesimplecontactmodel.h"

class SeasidePerson;

QTCONTACTS_USE_NAMESPACE

class SeasideConstituentModel : public SeasideSimpleContactModel
{
Q_OBJECT
Q_PROPERTY(SeasidePerson* person READ person WRITE setPerson NOTIFY personChanged)

public:
SeasideConstituentModel(QObject *parent = 0);
~SeasideConstituentModel();

SeasidePerson* person() const;
void setPerson(SeasidePerson *person);

virtual void itemUpdated(SeasideCache::CacheItem *item) override;
virtual void itemAboutToBeRemoved(SeasideCache::CacheItem *item) override;

Q_SIGNALS:
void personChanged();

protected:
virtual void reset() override;

private:
void personConstituentsChanged();

SeasidePerson *m_person = nullptr;
SeasideCache::CacheItem *m_cacheItem = nullptr;
};

#endif
114 changes: 114 additions & 0 deletions src/seasidemergecandidatemodel.cpp
@@ -0,0 +1,114 @@
/*
* Copyright (c) 2020 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#include "seasidemergecandidatemodel.h"
#include "seasideperson.h"

#include <QQmlInfo>

#include <QDebug>

SeasideMergeCandidateModel::SeasideMergeCandidateModel(QObject *parent)
: SeasideSimpleContactModel(parent)
{
}

SeasideMergeCandidateModel::~SeasideMergeCandidateModel()
{
}

SeasidePerson* SeasideMergeCandidateModel::person() const
{
return m_person;
}

void SeasideMergeCandidateModel::setPerson(SeasidePerson *person)
{
if (m_person != person) {
if (m_person) {
m_person->disconnect(this);
m_person = nullptr;
}
if (m_cacheItem) {
m_cacheItem = nullptr;
}

m_person = person;
reset();
emit personChanged();
}
}

void SeasideMergeCandidateModel::reset()
{
if (!m_complete) {
return;
}

if (m_person) {
connect(m_person, &SeasidePerson::mergeCandidatesChanged,
this, &SeasideMergeCandidateModel::personMergeCandidatesChanged);

SeasideCache::CacheItem *cacheItem = SeasideCache::itemById(m_person->id());
if (cacheItem) {
m_cacheItem = cacheItem;
m_person->fetchMergeCandidates();
} else {
qmlInfo(this) << "Cannot find cache item for contact:" << m_person->id();
}

} else if (m_contacts.count() > 0) {
setContactIds(QList<int>());
}
}

void SeasideMergeCandidateModel::personMergeCandidatesChanged()
{
if (m_person) {
setContactIds(m_person->mergeCandidates());
}
}

void SeasideMergeCandidateModel::itemUpdated(SeasideCache::CacheItem *item)
{
if (item == m_cacheItem) {
m_person->fetchMergeCandidates();
}
SeasideSimpleContactModel::itemUpdated(item);
}

void SeasideMergeCandidateModel::itemAboutToBeRemoved(SeasideCache::CacheItem *item)
{
if (item == m_cacheItem) {
setPerson(nullptr);
}
SeasideSimpleContactModel::itemAboutToBeRemoved(item);
}
69 changes: 69 additions & 0 deletions src/seasidemergecandidatemodel.h
@@ -0,0 +1,69 @@
/*
* Copyright (c) 2020 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#ifndef SEASIDEMERGECANDIDATEMODEL_H
#define SEASIDEMERGECANDIDATEMODEL_H

#include "seasidesimplecontactmodel.h"

class SeasidePerson;

QTCONTACTS_USE_NAMESPACE

class SeasideMergeCandidateModel : public SeasideSimpleContactModel
{
Q_OBJECT
Q_PROPERTY(SeasidePerson* person READ person WRITE setPerson NOTIFY personChanged)

public:
SeasideMergeCandidateModel(QObject *parent = 0);
~SeasideMergeCandidateModel();

SeasidePerson* person() const;
void setPerson(SeasidePerson *person);

virtual void itemUpdated(SeasideCache::CacheItem *item) override;
virtual void itemAboutToBeRemoved(SeasideCache::CacheItem *item) override;

Q_SIGNALS:
void personChanged();

protected:
virtual void reset() override;

private:
void personMergeCandidatesChanged();

SeasidePerson *m_person = nullptr;
SeasideCache::CacheItem *m_cacheItem = nullptr;
};

#endif

0 comments on commit 37febd3

Please sign in to comment.