22 #include "contactgroupmodel_p.h"
24 #include <akonadi/itemfetchjob.h>
25 #include <akonadi/itemfetchscope.h>
26 #include <kabc/addressee.h>
28 #include <kiconloader.h>
31 using namespace Akonadi;
36 : isReference(false), loadingError( false )
41 KABC::ContactGroup::ContactReference reference;
42 KABC::ContactGroup::Data data;
43 KABC::Addressee referencedContact;
47 class ContactGroupModel::Private
50 Private( ContactGroupModel *parent )
55 void resolveContactReference(
const KABC::ContactGroup::ContactReference &reference,
int row )
57 const Item item( reference.uid().toLongLong() );
60 job->setProperty(
"row", row );
61 job->fetchScope().fetchFullPayload();
63 mParent->connect( job, SIGNAL(result(KJob*)), SLOT(itemFetched(KJob*)) );
66 void itemFetched( KJob *job )
68 const int row = job->property(
"row" ).toInt();
71 mMembers[ row ].loadingError =
true;
72 emit mParent->dataChanged( mParent->index( row, 0, QModelIndex() ), mParent->index( row, 1, QModelIndex() ) );
78 if ( fetchJob->
items().count() != 1 ) {
79 mMembers[ row ].loadingError =
true;
80 emit mParent->dataChanged( mParent->index( row, 0, QModelIndex() ), mParent->index( row, 1, QModelIndex() ) );
84 const Item item = fetchJob->
items().first();
85 const KABC::Addressee contact = item.
payload<KABC::Addressee>();
87 GroupMember &member = mMembers[ row ];
88 member.referencedContact = contact;
89 emit mParent->dataChanged( mParent->index( row, 0, QModelIndex() ), mParent->index( row, 1, QModelIndex() ) );
92 void normalizeMemberList()
95 bool needsNormalization =
false;
96 if ( mMembers.isEmpty() ) {
97 needsNormalization =
true;
99 for (
int i = 0; i < mMembers.count(); ++i ) {
100 const GroupMember &member = mMembers[ i ];
101 if ( !member.isReference && !( i == mMembers.count() - 1 ) ) {
102 if ( member.data.name().isEmpty() && member.data.email().isEmpty() ) {
103 needsNormalization =
true;
109 const GroupMember &member = mMembers.last();
110 if ( member.isReference || !( member.data.name().isEmpty() && member.data.email().isEmpty() ) ) {
111 needsNormalization =
true;
116 if ( !needsNormalization ) {
120 bool foundEmpty =
false;
123 mParent->beginInsertRows( QModelIndex(), mMembers.count(), mMembers.count() );
125 member.isReference =
false;
126 mMembers.append( member );
127 mParent->endInsertRows();
132 for (
int i = 0; i < mMembers.count(); ++i ) {
133 const GroupMember &member = mMembers[ i ];
134 if ( !member.isReference && !( i == mMembers.count() - 1 ) ) {
135 if ( member.data.name().isEmpty() && member.data.email().isEmpty() ) {
136 mParent->beginRemoveRows( QModelIndex(), i, i );
137 mMembers.remove( i );
138 mParent->endRemoveRows();
144 }
while ( foundEmpty );
147 ContactGroupModel *mParent;
148 QVector<GroupMember> mMembers;
149 KABC::ContactGroup mGroup;
150 QString mLastErrorMessage;
153 ContactGroupModel::ContactGroupModel( QObject *parent )
154 : QAbstractItemModel( parent ), d( new Private( this ) )
158 ContactGroupModel::~ContactGroupModel()
163 void ContactGroupModel::loadContactGroup(
const KABC::ContactGroup &contactGroup )
165 emit layoutAboutToBeChanged();
168 d->mGroup = contactGroup;
170 for ( uint i = 0; i < d->mGroup.dataCount(); ++i ) {
171 const KABC::ContactGroup::Data data = d->mGroup.data( i );
173 member.isReference =
false;
176 d->mMembers.append( member );
179 for ( uint i = 0; i < d->mGroup.contactReferenceCount(); ++i ) {
180 const KABC::ContactGroup::ContactReference reference = d->mGroup.contactReference( i );
182 member.isReference =
true;
183 member.reference = reference;
185 d->mMembers.append( member );
187 d->resolveContactReference( reference, d->mMembers.count() - 1 );
190 d->normalizeMemberList();
192 emit layoutChanged();
195 bool ContactGroupModel::storeContactGroup( KABC::ContactGroup &group )
const
197 group.removeAllContactReferences();
198 group.removeAllContactData();
200 for (
int i = 0; i < d->mMembers.count(); ++i ) {
201 const GroupMember &member = d->mMembers[ i ];
202 if ( member.isReference ) {
203 group.append( member.reference );
205 if ( i != ( d->mMembers.count() - 1 ) ) {
206 if ( member.data.email().isEmpty() ) {
207 d->mLastErrorMessage =
208 i18n(
"The member with name <b>%1</b> is missing an email address",
209 member.data.name() );
212 group.append( member.data );
220 QString ContactGroupModel::lastErrorMessage()
const
222 return d->mLastErrorMessage;
225 QModelIndex ContactGroupModel::index(
int row,
int col,
const QModelIndex& )
const
227 return createIndex( row, col, 0 );
230 QModelIndex ContactGroupModel::parent(
const QModelIndex& )
const
232 return QModelIndex();
235 QVariant ContactGroupModel::data(
const QModelIndex &index,
int role )
const
237 if ( !index.isValid() ) {
241 if ( index.row() < 0 || index.row() >= d->mMembers.count() ) {
245 if ( index.column() < 0 || index.column() > 1 ) {
249 const GroupMember &member = d->mMembers[ index.row() ];
251 if ( role == Qt::DisplayRole ) {
252 if ( member.loadingError ) {
253 if ( index.column() == 0 ) {
254 return i18n(
"Contact does not exist any more" );
260 if ( member.isReference ) {
261 if ( index.column() == 0 ) {
262 return member.referencedContact.realName();
264 if ( !member.reference.preferredEmail().isEmpty() ) {
265 return member.reference.preferredEmail();
267 return member.referencedContact.preferredEmail();
271 if ( index.column() == 0 ) {
272 return member.data.name();
274 return member.data.email();
279 if ( role == Qt::DecorationRole ) {
280 if ( index.column() == 1 ) {
284 if ( member.loadingError ) {
285 return KIcon( QLatin1String(
"emblem-important" ) );
288 if ( index.row() == ( d->mMembers.count() - 1 ) ) {
289 return KIcon( QLatin1String(
"contact-new" ) );
292 if ( member.isReference ) {
293 return KIcon( QLatin1String(
"x-office-contact" ), KIconLoader::global(),
294 QStringList() << QLatin1String(
"emblem-symbolic-link" ) );
296 return KIcon( QLatin1String(
"x-office-contact" ) );
300 if ( role == Qt::EditRole ) {
301 if ( member.isReference ) {
302 if ( index.column() == 0 ) {
303 return member.referencedContact.realName();
305 if ( !member.reference.preferredEmail().isEmpty() ) {
306 return member.reference.preferredEmail();
308 return member.referencedContact.preferredEmail();
312 if ( index.column() == 0 ) {
313 return member.data.name();
315 return member.data.email();
320 if ( role == IsReferenceRole ) {
321 return member.isReference;
324 if ( role == AllEmailsRole ) {
325 if ( member.isReference ) {
326 return member.referencedContact.emails();
328 return QStringList();
335 bool ContactGroupModel::setData(
const QModelIndex &index,
const QVariant &value,
int role )
337 if ( !index.isValid() ) {
341 if ( index.row() < 0 || index.row() >= d->mMembers.count() ) {
345 if ( index.column() < 0 || index.column() > 1 ) {
349 GroupMember &member = d->mMembers[ index.row() ];
351 if ( role == Qt::EditRole ) {
352 if ( member.isReference ) {
353 if ( index.column() == 0 ) {
354 member.reference.setUid( QString::number( value.toLongLong() ) );
355 d->resolveContactReference( member.reference, index.row() );
357 if ( index.column() == 1 ) {
358 const QString email = value.toString();
359 if ( email != member.referencedContact.preferredEmail() ) {
360 member.reference.setPreferredEmail( email );
362 member.reference.setPreferredEmail( QString() );
366 if ( index.column() == 0 ) {
367 member.data.setName( value.toString() );
369 member.data.setEmail( value.toString() );
373 d->normalizeMemberList();
378 if ( role == IsReferenceRole ) {
379 if ( ( value.toBool() == true ) && !member.isReference ) {
380 member.isReference =
true;
382 if ( ( value.toBool() == false ) && member.isReference ) {
383 member.isReference =
false;
384 member.data.setName( member.referencedContact.realName() );
385 member.data.setEmail( member.referencedContact.preferredEmail() );
394 QVariant ContactGroupModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
396 if ( section < 0 || section > 1 ) {
400 if ( orientation != Qt::Horizontal ) {
404 if ( role != Qt::DisplayRole ) {
408 if ( section == 0 ) {
409 return i18nc(
"contact's name",
"Name" );
411 return i18nc(
"contact's email address",
"EMail" );
415 Qt::ItemFlags ContactGroupModel::flags(
const QModelIndex &index )
const
417 if ( !index.isValid() || index.row() < 0 || index.row() >= d->mMembers.count() ) {
418 return Qt::ItemIsEnabled;
421 if ( d->mMembers[ index.row() ].loadingError ) {
422 return Qt::ItemFlags( Qt::ItemIsEnabled );
425 Qt::ItemFlags parentFlags = QAbstractItemModel::flags( index );
426 return ( parentFlags | Qt::ItemIsEnabled | Qt::ItemIsEditable );
429 int ContactGroupModel::columnCount(
const QModelIndex &parent )
const
431 if ( !parent.isValid() ) {
438 int ContactGroupModel::rowCount(
const QModelIndex &parent )
const
440 if ( !parent.isValid() ) {
441 return d->mMembers.count();
447 bool ContactGroupModel::removeRows(
int row,
int count,
const QModelIndex &parent )
449 if ( parent.isValid() ) {
453 beginRemoveRows( QModelIndex(), row, row + count - 1 );
454 for (
int i = 0; i < count; ++i ) {
455 d->mMembers.remove( row );
462 #include "moc_contactgroupmodel_p.cpp"