summaryrefslogtreecommitdiffstats
path: root/framework/src/domain/maillistmodel.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-05 15:04:00 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-05 15:04:00 +0200
commit4b1798f0cdf87361869e7cf2b341acacd056c410 (patch)
tree3ff780641acdcb20b81f9b41533afd50a2525d38 /framework/src/domain/maillistmodel.cpp
parent71721aa4f3e85bea1a2fe504e86d99f80a3106a9 (diff)
downloadkube-4b1798f0cdf87361869e7cf2b341acacd056c410.tar.gz
kube-4b1798f0cdf87361869e7cf2b341acacd056c410.zip
Moved cpp code into src directory
Diffstat (limited to 'framework/src/domain/maillistmodel.cpp')
-rw-r--r--framework/src/domain/maillistmodel.cpp265
1 files changed, 265 insertions, 0 deletions
diff --git a/framework/src/domain/maillistmodel.cpp b/framework/src/domain/maillistmodel.cpp
new file mode 100644
index 00000000..83340f69
--- /dev/null
+++ b/framework/src/domain/maillistmodel.cpp
@@ -0,0 +1,265 @@
1/*
2 Copyright (c) 2016 Michael Bohlender <michael.bohlender@kdemail.net>
3 Copyright (c) 2016 Christian Mollekopf <mollekopf@kolabsys.com>
4
5 This library is free software; you can redistribute it and/or modify it
6 under the terms of the GNU Library General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or (at your
8 option) any later version.
9
10 This library is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13 License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 02110-1301, USA.
19*/
20
21#include "maillistmodel.h"
22
23#include <sink/standardqueries.h>
24
25MailListModel::MailListModel(QObject *parent)
26 : QSortFilterProxyModel()
27{
28 setDynamicSortFilter(true);
29 sort(0, Qt::DescendingOrder);
30 setFilterCaseSensitivity(Qt::CaseInsensitive);
31}
32
33MailListModel::~MailListModel()
34{
35
36}
37
38void MailListModel::setFilter(const QString &filter)
39{
40 setFilterWildcard(filter);
41}
42
43QString MailListModel::filter() const
44{
45 return {};
46}
47
48QHash< int, QByteArray > MailListModel::roleNames() const
49{
50 QHash<int, QByteArray> roles;
51
52 roles[Subject] = "subject";
53 roles[Sender] = "sender";
54 roles[SenderName] = "senderName";
55 roles[To] = "to";
56 roles[Cc] = "cc";
57 roles[Bcc] = "bcc";
58 roles[Date] = "date";
59 roles[Unread] = "unread";
60 roles[Important] = "important";
61 roles[Draft] = "draft";
62 roles[Sent] = "sent";
63 roles[Trash] = "trash";
64 roles[Id] = "id";
65 roles[MimeMessage] = "mimeMessage";
66 roles[DomainObject] = "domainObject";
67 roles[ThreadSize] = "threadSize";
68 roles[Mail] = "mail";
69 roles[Incomplete] = "incomplete";
70 roles[Status] = "status";
71
72 return roles;
73}
74
75static QString join(const QList<Sink::ApplicationDomain::Mail::Contact> &contacts)
76{
77 QStringList list;
78 for (const auto &contact : contacts) {
79 if (!contact.name.isEmpty()) {
80 list << QString("%1 <%2>").arg(contact.name).arg(contact.emailAddress);
81 } else {
82 list << contact.emailAddress;
83 }
84 }
85 return list.join(", ");
86}
87
88void MailListModel::fetchMail(Sink::ApplicationDomain::Mail::Ptr mail)
89{
90 if (mail && !mail->getFullPayloadAvailable() && !mFetchedMails.contains(mail->identifier())) {
91 qDebug() << "Fetching mail: " << mail->identifier() << mail->getSubject();
92 mFetchedMails.insert(mail->identifier());
93 Sink::Store::synchronize(Sink::SyncScope{*mail}).exec();
94 }
95}
96
97QVariant MailListModel::data(const QModelIndex &idx, int role) const
98{
99 auto srcIdx = mapToSource(idx);
100 auto mail = srcIdx.data(Sink::Store::DomainObjectRole).value<Sink::ApplicationDomain::Mail::Ptr>();
101 switch (role) {
102 case Subject:
103 return mail->getSubject();
104 case Sender:
105 return mail->getSender().emailAddress;
106 case SenderName:
107 return mail->getSender().name;
108 case To:
109 return join(mail->getTo());
110 case Cc:
111 return join(mail->getCc());
112 case Bcc:
113 return join(mail->getBcc());
114 case Date:
115 return mail->getDate();
116 case Unread:
117 return mail->getProperty("unreadCollected").toList().contains(true);
118 case Important:
119 return mail->getProperty("importantCollected").toList().contains(true);
120 case Draft:
121 return mail->getDraft();
122 case Sent:
123 return mail->getSent();
124 case Trash:
125 return mail->getTrash();
126 case Id:
127 return mail->identifier();
128 case DomainObject:
129 return QVariant::fromValue(mail);
130 case MimeMessage:
131 if (mFetchMails) {
132 const_cast<MailListModel*>(this)->fetchMail(mail);
133 }
134 return mail->getMimeMessage();
135 case ThreadSize:
136 return mail->getProperty("count").toInt();
137 case Mail:
138 return QVariant::fromValue(mail);
139 case Incomplete:
140 return !mail->getFullPayloadAvailable();
141 case Status:
142 const auto status = srcIdx.data(Sink::Store::StatusRole).toInt();
143 if (status == Sink::ApplicationDomain::SyncStatus::SyncInProgress) {
144 return InProgressStatus;
145 }
146 if (status == Sink::ApplicationDomain::SyncStatus::SyncError) {
147 return ErrorStatus;
148 }
149 return NoStatus;
150 }
151 return QSortFilterProxyModel::data(idx, role);
152}
153
154bool MailListModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
155{
156 const auto leftDate = left.data(Sink::Store::DomainObjectRole).value<Sink::ApplicationDomain::Mail::Ptr>()->getDate();
157 const auto rightDate = right.data(Sink::Store::DomainObjectRole).value<Sink::ApplicationDomain::Mail::Ptr>()->getDate();
158 return leftDate < rightDate;
159}
160
161bool MailListModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
162{
163 auto idx = sourceModel()->index(sourceRow, 0, sourceParent);
164 auto regExp = filterRegExp();
165 if (regExp.isEmpty()) {
166 return true;
167 }
168 auto mail = idx.data(Sink::Store::DomainObjectRole).value<Sink::ApplicationDomain::Mail::Ptr>();
169 return mail->getSubject().contains(regExp) ||
170 mail->getSender().name.contains(regExp);
171}
172
173void MailListModel::runQuery(const Sink::Query &query)
174{
175 m_model = Sink::Store::loadModel<Sink::ApplicationDomain::Mail>(query);
176 setSourceModel(m_model.data());
177}
178
179void MailListModel::setParentFolder(const QVariant &parentFolder)
180{
181 using namespace Sink::ApplicationDomain;
182 auto folder = parentFolder.value<Folder::Ptr>();
183 if (!folder) {
184 mCurrentQueryItem.clear();
185 setSourceModel(nullptr);
186 return;
187 }
188 if (mCurrentQueryItem == folder->identifier()) {
189 return;
190 }
191 mCurrentQueryItem = folder->identifier();
192 Sink::Query query = Sink::StandardQueries::threadLeaders(*folder);
193 if (!folder->getSpecialPurpose().contains(Sink::ApplicationDomain::SpecialPurpose::Mail::trash)) {
194 //Filter trash if this is not a trash folder
195 query.filter<Sink::ApplicationDomain::Mail::Trash>(false);
196 }
197 query.setFlags(Sink::Query::LiveQuery);
198 query.limit(100);
199 query.request<Mail::Subject>();
200 query.request<Mail::Sender>();
201 query.request<Mail::To>();
202 query.request<Mail::Cc>();
203 query.request<Mail::Bcc>();
204 query.request<Mail::Date>();
205 query.request<Mail::Unread>();
206 query.request<Mail::Important>();
207 query.request<Mail::Draft>();
208 query.request<Mail::Sent>();
209 query.request<Mail::Trash>();
210 query.request<Mail::Folder>();
211 mFetchMails = false;
212 qDebug() << "Running folder query: " << folder->resourceInstanceIdentifier() << folder->identifier();
213 //Latest mail on top
214 sort(0, Qt::DescendingOrder);
215 runQuery(query);
216}
217
218QVariant MailListModel::parentFolder() const
219{
220 return QVariant();
221}
222
223void MailListModel::setMail(const QVariant &variant)
224{
225 using namespace Sink::ApplicationDomain;
226 auto mail = variant.value<Sink::ApplicationDomain::Mail::Ptr>();
227 if (!mail) {
228 mCurrentQueryItem.clear();
229 setSourceModel(nullptr);
230 return;
231 }
232 if (mCurrentQueryItem == mail->identifier()) {
233 return;
234 }
235 mCurrentQueryItem = mail->identifier();
236 Sink::Query query = Sink::StandardQueries::completeThread(*mail);
237 query.setFlags(Sink::Query::LiveQuery | Sink::Query::UpdateStatus);
238 query.request<Mail::Subject>();
239 query.request<Mail::Sender>();
240 query.request<Mail::To>();
241 query.request<Mail::Cc>();
242 query.request<Mail::Bcc>();
243 query.request<Mail::Date>();
244 query.request<Mail::Unread>();
245 query.request<Mail::Important>();
246 query.request<Mail::Draft>();
247 query.request<Mail::Folder>();
248 query.request<Mail::Sent>();
249 query.request<Mail::Trash>();
250 query.request<Mail::MimeMessage>();
251 query.request<Mail::FullPayloadAvailable>();
252 mFetchMails = true;
253 mFetchedMails.clear();
254 qDebug() << "Running mail query: " << mail->resourceInstanceIdentifier() << mail->identifier();
255 //Latest mail at the bottom
256 sort(0, Qt::AscendingOrder);
257 runQuery(query);
258}
259
260QVariant MailListModel::mail() const
261{
262 return QVariant();
263}
264
265