/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtQml module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVECONTACTMODEL_P_H #define QDECLARATIVECONTACTMODEL_P_H #include #include #include #include #include #include #include "qdeclarativecontact_p.h" #include "qdeclarativecontactcollection_p.h" #include "qdeclarativecontactfetchhint_p.h" #include "qdeclarativecontactfilter_p.h" #include "qdeclarativecontactsortorder_p.h" QTCONTACTS_USE_NAMESPACE QTVERSIT_USE_NAMESPACE QT_BEGIN_NAMESPACE class QDeclarativeContactModelPrivate; class QDeclarativeContactModel : public QAbstractListModel, public QQmlParserStatus { Q_OBJECT Q_PROPERTY(QString manager READ manager WRITE setManager NOTIFY managerChanged) Q_PROPERTY(QStringList availableManagers READ availableManagers) Q_PROPERTY(QString error READ error NOTIFY errorChanged) Q_PROPERTY(bool autoUpdate READ autoUpdate WRITE setAutoUpdate NOTIFY autoUpdateChanged) Q_PROPERTY(QDeclarativeContactFilter* filter READ filter WRITE setFilter NOTIFY filterChanged) Q_PROPERTY(QDeclarativeContactFetchHint* fetchHint READ fetchHint WRITE setFetchHint NOTIFY fetchHintChanged) Q_PROPERTY(QQmlListProperty contacts READ contacts NOTIFY contactsChanged) Q_PROPERTY(QQmlListProperty collections READ collections NOTIFY collectionsChanged) Q_PROPERTY(QQmlListProperty sortOrders READ sortOrders NOTIFY sortOrdersChanged) Q_ENUMS(ExportError) Q_ENUMS(ImportError) Q_INTERFACES(QQmlParserStatus) public: explicit QDeclarativeContactModel(QObject *parent = nullptr); ~QDeclarativeContactModel(); enum { ContactRole = Qt::UserRole + 500 }; enum ExportError { ExportNoError = QVersitWriter::NoError, ExportUnspecifiedError = QVersitWriter::UnspecifiedError, ExportIOError = QVersitWriter::IOError, ExportOutOfMemoryError = QVersitWriter::OutOfMemoryError, ExportNotReadyError = QVersitWriter::NotReadyError }; enum ImportError { ImportNoError = QVersitReader::NoError, ImportUnspecifiedError = QVersitReader::UnspecifiedError, ImportIOError = QVersitReader::IOError, ImportOutOfMemoryError = QVersitReader::OutOfMemoryError, ImportNotReadyError = QVersitReader::NotReadyError, ImportParseError = QVersitReader::ParseError }; QHash roleNames() const Q_DECL_OVERRIDE; QString manager() const; void setManager(const QString& manager); QStringList availableManagers() const; QString error() const; QDeclarativeContactFilter* filter() const; void setFilter(QDeclarativeContactFilter* filter); QDeclarativeContactFetchHint* fetchHint() const; void setFetchHint(QDeclarativeContactFetchHint* fetchHint); // From QQmlParserStatus void classBegin() override {} void componentComplete() override; // From QAbstractListModel int rowCount(const QModelIndex &parent) const override; QVariant data(const QModelIndex &index, int role) const override; bool autoUpdate() const; void setAutoUpdate(bool autoUpdate); QQmlListProperty contacts() ; static void contacts_append(QQmlListProperty* prop, QDeclarativeContact* contact); static qsizetype contacts_count(QQmlListProperty* prop); static QDeclarativeContact* contacts_at(QQmlListProperty* prop, qsizetype index); static void contacts_clear(QQmlListProperty* prop); QQmlListProperty sortOrders(); static void sortOrder_append(QQmlListProperty *p, QDeclarativeContactSortOrder *sortOrder); static qsizetype sortOrder_count(QQmlListProperty *p); static QDeclarativeContactSortOrder * sortOrder_at(QQmlListProperty *p, qsizetype idx); static void sortOrder_clear(QQmlListProperty *p); QQmlListProperty collections(); static qsizetype collection_count(QQmlListProperty *p); static QDeclarativeContactCollection* collection_at(QQmlListProperty *p, qsizetype idx); Q_INVOKABLE void removeContact(QString id); Q_INVOKABLE void removeContacts(const QStringList& ids); Q_INVOKABLE void saveContact(QDeclarativeContact* dc); Q_INVOKABLE int fetchContacts(const QStringList& contactIds); Q_INVOKABLE void removeCollection(const QString& collectionId); Q_INVOKABLE void saveCollection(QDeclarativeContactCollection* collection); // FIXME : Naming indicates fetch from database Q_INVOKABLE void fetchCollections(); Q_INVOKABLE void importContacts(const QUrl& url, const QStringList& profiles = QStringList()); Q_INVOKABLE void exportContacts(const QUrl& url, const QStringList& profiles = QStringList(), const QVariantList &declarativeContacts = QVariantList()); signals: void managerChanged(); void filterChanged(); void errorChanged(); void fetchHintChanged(); void contactsChanged(); void collectionsChanged(); void sortOrdersChanged(); void autoUpdateChanged(); void exportCompleted(ExportError error, QUrl url); void importCompleted(ImportError error, QUrl url, const QStringList &ids); void contactsFetched(int requestId, const QVariantList &fetchedContacts); public slots: void update(); void updateContacts(); void updateCollections(); void cancelUpdate(); private slots: void clearContacts(); void fetchAgain(); void requestUpdated(); void fetchRequestStateChanged(QContactAbstractRequest::State newState); void doUpdate(); void doContactUpdate(); void onRequestStateChanged(QContactAbstractRequest::State newState); void onContactsAdded(const QList& ids); void onContactsRemoved(const QList& ids); void onContactsChanged(const QList& ids); void startImport(QVersitReader::State state); void contactsExported(QVersitWriter::State state); void onFetchedContactDestroyed(QObject *obj); // handle fetch request from onContactsAdded() void onContactsAddedFetchRequestStateChanged(QContactAbstractRequest::State state); // handle fetch request from onContactsChanged() void onContactsChangedFetchRequestStateChanged(QContactAbstractRequest::State state); // handle fetch request from fetchContacts() void onFetchContactsRequestStateChanged(QContactAbstractRequest::State state); void collectionsFetched(); private: QContactFetchRequest *createContactFetchRequest(const QList &ids); void checkError(const QContactAbstractRequest *request); void updateError(QContactManager::Error error); int contactIndex(const QDeclarativeContact* contact); private: QScopedPointer d; }; QT_END_NAMESPACE QML_DECLARE_TYPE(QDeclarativeContactModel) #endif // QDECLARATIVECONTACTMODEL_P_H