9 #include "contactgroupmodel_p.h"
11 #include <Akonadi/ItemFetchJob>
12 #include <Akonadi/ItemFetchScope>
13 #include <KContacts/Addressee>
15 #include <KIconEngine>
16 #include <KIconLoader>
17 #include <KLocalizedString>
20 using namespace Akonadi;
26 bool isReference =
false;
27 bool loadingError =
false;
30 class Akonadi::ContactGroupModelPrivate
33 ContactGroupModelPrivate(ContactGroupModel *parent)
47 job->setProperty(
"row", row);
48 job->fetchScope().fetchFullPayload();
55 void itemFetched(
KJob *job)
60 mMembers[row].loadingError =
true;
65 auto fetchJob = qobject_cast<ItemFetchJob *>(job);
67 if (fetchJob->items().count() != 1) {
68 mMembers[row].loadingError =
true;
73 const Item item = fetchJob->items().at(0);
76 GroupMember &member = mMembers[row];
77 member.referencedContact = contact;
81 void normalizeMemberList()
84 bool needsNormalization =
false;
85 if (mMembers.isEmpty()) {
86 needsNormalization =
true;
88 for (
int i = 0; i < mMembers.count(); ++i) {
89 const GroupMember &member = mMembers[i];
90 if (!member.isReference && !(i == mMembers.count() - 1)) {
91 if (member.data.name().isEmpty() && member.data.email().isEmpty()) {
92 needsNormalization =
true;
98 const GroupMember &member = mMembers.last();
99 if (member.isReference || !(member.data.name().isEmpty() && member.data.email().isEmpty())) {
100 needsNormalization =
true;
105 if (!needsNormalization) {
109 bool foundEmpty =
false;
112 mParent->beginInsertRows(
QModelIndex(), mMembers.count(), mMembers.count());
114 member.isReference =
false;
115 mMembers.append(member);
116 mParent->endInsertRows();
121 for (
int i = 0, total = mMembers.count(); i < total; ++i) {
122 const GroupMember &member = mMembers[i];
123 if (!member.isReference && !(i == mMembers.count() - 1)) {
124 if (member.data.name().isEmpty() && member.data.email().isEmpty()) {
127 mParent->endRemoveRows();
133 }
while (foundEmpty);
136 ContactGroupModel *
const mParent;
142 ContactGroupModel::ContactGroupModel(
QObject *parent)
144 , d(new ContactGroupModelPrivate(this))
148 ContactGroupModel::~ContactGroupModel() =
default;
152 Q_EMIT layoutAboutToBeChanged();
155 d->mGroup = contactGroup;
157 for (
int i = 0; i < d->mGroup.dataCount(); ++i) {
160 member.isReference =
false;
163 d->mMembers.append(member);
166 for (
int i = 0; i < d->mGroup.contactReferenceCount(); ++i) {
169 member.isReference =
true;
170 member.reference = reference;
172 d->mMembers.append(member);
174 d->resolveContactReference(reference, d->mMembers.count() - 1);
177 d->normalizeMemberList();
179 Q_EMIT layoutChanged();
187 for (
int i = 0; i < d->mMembers.count(); ++i) {
188 const GroupMember &member = d->mMembers[i];
189 if (member.isReference) {
190 group.
append(member.reference);
192 if (i != (d->mMembers.count() - 1)) {
193 if (member.data.email().isEmpty()) {
194 d->mLastErrorMessage =
i18n(
"The member with name <b>%1</b> is missing an email address", member.data.name());
197 group.
append(member.data);
205 QString ContactGroupModel::lastErrorMessage()
const
207 return d->mLastErrorMessage;
213 return createIndex(row, col);
228 if (index.
row() < 0 || index.
row() >= d->mMembers.count()) {
236 const GroupMember &member = d->mMembers[index.
row()];
239 if (member.loadingError) {
240 if (index.
column() == 0) {
241 return i18n(
"Contact does not exist any more");
247 if (member.isReference) {
248 if (index.
column() == 0) {
249 return member.referencedContact.realName();
251 if (!member.reference.preferredEmail().isEmpty()) {
252 return member.reference.preferredEmail();
254 return member.referencedContact.preferredEmail();
258 if (index.
column() == 0) {
259 return member.data.name();
261 return member.data.email();
267 if (index.
column() == 1) {
271 if (member.loadingError) {
275 if (index.
row() == (d->mMembers.count() - 1)) {
279 if (member.isReference) {
287 if (member.isReference) {
288 if (index.
column() == 0) {
289 return member.referencedContact.realName();
291 if (!member.reference.preferredEmail().isEmpty()) {
292 return member.reference.preferredEmail();
294 return member.referencedContact.preferredEmail();
298 if (index.
column() == 0) {
299 return member.data.name();
301 return member.data.email();
306 if (role == IsReferenceRole) {
307 return member.isReference;
310 if (role == AllEmailsRole) {
311 if (member.isReference) {
312 return member.referencedContact.emails();
327 if (index.
row() < 0 || index.
row() >= d->mMembers.count()) {
335 GroupMember &member = d->mMembers[index.
row()];
338 if (member.isReference) {
339 if (index.
column() == 0) {
341 d->resolveContactReference(member.reference, index.
row());
343 if (index.
column() == 1) {
345 if (email != member.referencedContact.preferredEmail()) {
346 member.reference.setPreferredEmail(email);
348 member.reference.setPreferredEmail(
QString());
352 if (index.
column() == 0) {
353 member.data.setName(value.
toString());
355 member.data.setEmail(value.
toString());
359 d->normalizeMemberList();
364 if (role == IsReferenceRole) {
365 if ((value.
toBool() ==
true) && !member.isReference) {
366 member.isReference =
true;
368 if ((value.
toBool() ==
false) && member.isReference) {
369 member.isReference =
false;
370 member.data.setName(member.referencedContact.realName());
371 member.data.setEmail(member.referencedContact.preferredEmail());
382 if (section < 0 || section > 1) {
395 return i18nc(
"contact's name",
"Name");
397 return i18nc(
"contact's email address",
"EMail");
403 if (!index.
isValid() || index.
row() < 0 || index.
row() >= d->mMembers.count()) {
407 if (d->mMembers[index.
row()].loadingError) {
415 int ContactGroupModel::columnCount(
const QModelIndex &parent)
const
424 int ContactGroupModel::rowCount(
const QModelIndex &parent)
const
427 return d->mMembers.count();
433 bool ContactGroupModel::removeRows(
int row,
int count,
const QModelIndex &parent)
439 beginRemoveRows(
QModelIndex(), row, row + count - 1);
440 for (
int i = 0; i < count; ++i) {
441 d->mMembers.remove(row);
448 GroupFilterModel::GroupFilterModel(
QObject *parent)
452 setFilterKeyColumn(-1);
455 bool GroupFilterModel::filterAcceptsRow(
int sourceRow,
const QModelIndex &sourceParent)
const
457 if (sourceRow == sourceModel()->rowCount() - 1) {
466 if (
left.row() == sourceModel()->rowCount() - 1) {
470 if (
right.row() == sourceModel()->rowCount() - 1) {
477 #include "moc_contactgroupmodel_p.cpp"