1/****************************************************************************
2**
3** Copyright (C) 2015 The Qt Company Ltd.
4** Contact: http://www.qt.io/licensing/
5**
6** This file is part of the QtOrganizer module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL21$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see http://www.qt.io/terms-conditions. For further
15** information use the contact form at http://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 or version 3 as published by the Free
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22** following information to ensure the GNU Lesser General Public License
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25**
26** As a special exception, The Qt Company gives you certain additional
27** rights. These rights are described in The Qt Company LGPL Exception
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29**
30** $QT_END_LICENSE$
31**
32****************************************************************************/
33
34#ifndef QDECLARATIVEORGANIZERMODEL_H
35#define QDECLARATIVEORGANIZERMODEL_H
36
37#include <QtCore/qabstractitemmodel.h>
38
39#include <QtQml/qqml.h>
40
41#include <QtOrganizer/qorganizerabstractrequest.h>
42#include <QtOrganizer/qorganizercollectionid.h>
43#include <QtOrganizer/qorganizeritem.h>
44
45#include <QtVersit/qversitreader.h>
46#include <QtVersit/qversitwriter.h>
47
48#include "qdeclarativeorganizercollection_p.h"
49#include "qdeclarativeorganizeritem_p.h"
50#include "qdeclarativeorganizeritemfetchhint_p.h"
51#include "qdeclarativeorganizeritemfilter_p.h"
52#include "qdeclarativeorganizeritemsortorder_p.h"
53
54QTORGANIZER_USE_NAMESPACE
55QTVERSIT_USE_NAMESPACE
56
57QT_BEGIN_NAMESPACE
58
59class QDeclarativeOrganizerModelPrivate;
60class QDeclarativeOrganizerModel : public QAbstractListModel, public QQmlParserStatus
61{
62 Q_OBJECT
63 Q_PROPERTY(QString manager READ manager WRITE setManager NOTIFY managerChanged)
64 Q_PROPERTY(QString managerName READ managerName NOTIFY managerChanged)
65 Q_PROPERTY(QStringList availableManagers READ availableManagers)
66 Q_PROPERTY(bool autoUpdate READ autoUpdate WRITE setAutoUpdate NOTIFY autoUpdateChanged)
67 Q_PROPERTY(QDateTime startPeriod READ startPeriod WRITE setStartPeriod NOTIFY startPeriodChanged)
68 Q_PROPERTY(QDateTime endPeriod READ endPeriod WRITE setEndPeriod NOTIFY endPeriodChanged)
69 Q_PROPERTY(QDeclarativeOrganizerItemFilter* filter READ filter WRITE setFilter NOTIFY filterChanged)
70 Q_PROPERTY(QDeclarativeOrganizerItemFetchHint* fetchHint READ fetchHint WRITE setFetchHint NOTIFY fetchHintChanged)
71 Q_PROPERTY(QQmlListProperty<QDeclarativeOrganizerItemSortOrder> sortOrders READ sortOrders NOTIFY sortOrdersChanged)
72 Q_PROPERTY(QQmlListProperty<QDeclarativeOrganizerItem> items READ items NOTIFY modelChanged)
73 Q_PROPERTY(QQmlListProperty<QDeclarativeOrganizerCollection> collections READ collections NOTIFY collectionsChanged)
74 Q_PROPERTY(QString error READ error NOTIFY errorChanged)
75 Q_PROPERTY(int itemCount READ itemCount NOTIFY modelChanged)
76 Q_ENUMS(ExportError)
77 Q_ENUMS(ImportError)
78 Q_INTERFACES(QQmlParserStatus)
79public:
80 enum {
81 OrganizerItemRole = Qt::UserRole + 500
82 };
83
84 enum ExportError {
85 ExportNoError = QVersitWriter::NoError,
86 ExportUnspecifiedError = QVersitWriter::UnspecifiedError,
87 ExportIOError = QVersitWriter::IOError,
88 ExportOutOfMemoryError = QVersitWriter::OutOfMemoryError,
89 ExportNotReadyError = QVersitWriter::NotReadyError
90 };
91
92 enum ImportError {
93 ImportNoError = QVersitReader::NoError,
94 ImportUnspecifiedError = QVersitReader::UnspecifiedError,
95 ImportIOError = QVersitReader::IOError,
96 ImportOutOfMemoryError = QVersitReader::OutOfMemoryError,
97 ImportNotReadyError = QVersitReader::NotReadyError,
98 ImportParseError = QVersitReader::ParseError
99 };
100
101 explicit QDeclarativeOrganizerModel(QObject *parent = Q_NULLPTR);
102 explicit QDeclarativeOrganizerModel(QOrganizerManager* manager, const QDateTime& start, const QDateTime& end, QObject *parent = Q_NULLPTR);
103 ~QDeclarativeOrganizerModel();
104
105 QString error() const;
106 int itemCount() const;
107
108 QString manager() const;
109 void setManager(const QString& managerUri);
110 QString managerName() const;
111 QStringList availableManagers() const;
112 QDateTime startPeriod() const;
113 void setStartPeriod(const QDateTime& start);
114
115 QDateTime endPeriod() const;
116 void setEndPeriod(const QDateTime& end);
117
118 // From QQmlParserStatus
119 virtual void classBegin() {}
120 virtual void componentComplete();
121
122 int rowCount(const QModelIndex &parent) const;
123 QVariant data(const QModelIndex &index, int role) const;
124
125 QDeclarativeOrganizerItemFilter* filter() const;
126
127 QDeclarativeOrganizerItemFetchHint* fetchHint() const;
128
129
130 QQmlListProperty<QDeclarativeOrganizerItem> items() ;
131 QQmlListProperty<QDeclarativeOrganizerItemSortOrder> sortOrders() ;
132 QQmlListProperty<QDeclarativeOrganizerCollection> collections();
133
134 Q_INVOKABLE void removeItem(const QString& id);
135 Q_INVOKABLE void removeItem(QDeclarativeOrganizerItem *item);
136 Q_INVOKABLE void removeItems(const QStringList& ids);
137 Q_INVOKABLE void removeItems(const QList<QDeclarativeOrganizerItem> &items);
138 Q_INVOKABLE void saveItem(QDeclarativeOrganizerItem* item);
139 Q_INVOKABLE int fetchItems(const QStringList &itemIds);
140 Q_INVOKABLE int fetchItems(const QDateTime &start, const QDateTime &end,
141 QDeclarativeOrganizerItemFilter *filter = new QDeclarativeOrganizerItemFilter(),
142 int maxCount = -1,
143 const QVariantList &sortOrders = QVariantList(),
144 QDeclarativeOrganizerItemFetchHint *fetchHint = new QDeclarativeOrganizerItemFetchHint());
145 Q_INVOKABLE void removeCollection(const QString& collectionId);
146 Q_INVOKABLE void saveCollection(QDeclarativeOrganizerCollection* collection);
147 // FIXME : Naming indicates fetch from database
148 Q_INVOKABLE void fetchCollections();
149
150 Q_INVOKABLE QList<bool> containsItems(const QDateTime &start, const QDateTime &end, int interval);
151 Q_INVOKABLE bool containsItems(const QDateTime &start, const QDateTime &end = QDateTime());
152 Q_INVOKABLE QVariantList itemsByTimePeriod(const QDateTime &start = QDateTime(), const QDateTime &end = QDateTime());
153 Q_INVOKABLE QDeclarativeOrganizerItem* item(const QString& id);
154 Q_INVOKABLE QStringList itemIds(const QDateTime &start = QDateTime(), const QDateTime &end = QDateTime());
155 Q_INVOKABLE QString defaultCollectionId() const;
156 Q_INVOKABLE QDeclarativeOrganizerCollection* collection(const QString& collectionId);
157
158 Q_INVOKABLE void importItems(const QUrl& url, const QStringList& profiles = QStringList());
159 Q_INVOKABLE void exportItems(const QUrl& url, const QStringList& profiles = QStringList());
160
161 bool autoUpdate() const;
162 void setAutoUpdate(bool autoUpdate);
163
164 void setFilter(QDeclarativeOrganizerItemFilter* filter);
165 void setFetchHint(QDeclarativeOrganizerItemFetchHint* fetchHint);
166
167
168signals:
169 void managerChanged();
170 void availableManagersChanged();
171 void filterChanged();
172 void fetchHintChanged();
173 void modelChanged();
174 void sortOrdersChanged();
175 void errorChanged();
176 void startPeriodChanged();
177 void endPeriodChanged();
178 void autoUpdateChanged();
179 void collectionsChanged();
180 void itemsFetched(int requestId, const QVariantList &fetchedItems);
181 void exportCompleted(ExportError error, QUrl url);
182 void importCompleted(ImportError error, QUrl url, const QStringList &ids);
183
184public slots:
185 void update();
186 void updateItems();
187 void updateCollections();
188 void cancelUpdate();
189
190private slots:
191 void doUpdate();
192 void doUpdateItems();
193 void fetchAgain();
194 void requestUpdated();
195
196 // handle request from saveItem(), removeItem(), saveCollection(), and removeCollection()
197 void onRequestStateChanged(QOrganizerAbstractRequest::State newState);
198
199 // handle fetch request from fetchItems()
200 void onFetchItemsRequestStateChanged(QOrganizerAbstractRequest::State state);
201
202 // handle signals from organizer manager
203 void onItemsModified(const QList<QPair<QOrganizerItemId, QOrganizerManager::Operation> > &itemIds);
204
205 // handle fetch request from onItemsModified()
206 void onItemsModifiedFetchRequestStateChanged(QOrganizerAbstractRequest::State state);
207
208 void collectionsFetched();
209
210 void startImport(QVersitReader::State state);
211 void itemsExported(QVersitWriter::State state);
212
213
214private:
215 void removeItemsFromModel(const QList<QString>& ids);
216 bool itemHasRecurrence(const QOrganizerItem& oi) const;
217 QDeclarativeOrganizerItem* createItem(const QOrganizerItem& item);
218 void checkError(const QOrganizerAbstractRequest *request);
219
220 static int item_count(QQmlListProperty<QDeclarativeOrganizerItem> *p);
221 static QDeclarativeOrganizerItem * item_at(QQmlListProperty<QDeclarativeOrganizerItem> *p, int idx);
222
223 static void sortOrder_append(QQmlListProperty<QDeclarativeOrganizerItemSortOrder> *p, QDeclarativeOrganizerItemSortOrder *sortOrder);
224 static int sortOrder_count(QQmlListProperty<QDeclarativeOrganizerItemSortOrder> *p);
225 static QDeclarativeOrganizerItemSortOrder * sortOrder_at(QQmlListProperty<QDeclarativeOrganizerItemSortOrder> *p, int idx);
226 static void sortOrder_clear(QQmlListProperty<QDeclarativeOrganizerItemSortOrder> *p);
227
228 static int collection_count(QQmlListProperty<QDeclarativeOrganizerCollection> *p);
229 static QDeclarativeOrganizerCollection* collection_at(QQmlListProperty<QDeclarativeOrganizerCollection> *p, int idx);
230
231 QScopedPointer<QDeclarativeOrganizerModelPrivate> d_ptr;
232 Q_DECLARE_PRIVATE(QDeclarativeOrganizerModel)
233};
234
235QT_END_NAMESPACE
236
237QML_DECLARE_TYPE(QDeclarativeOrganizerModel)
238
239#endif // QDECLARATIVEORGANIZERMODEL_H
240

source code of qtpim/src/imports/organizer/qdeclarativeorganizermodel_p.h