--- a/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Thu Sep 02 20:16:15 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Fri Sep 17 08:27:32 2010 +0300
@@ -33,6 +33,16 @@
#include <hbglobal.h>
#include <hbicon.h>
+#include <QtAlgorithms>
+
+namespace
+{
+ bool caseInsensitiveLessThan(const QContact &c1, const QContact &c2)
+ {
+ return c1.displayLabel().toLower() < c2.displayLabel().toLower();
+ }
+}
+
/*!
Constructor
*/
@@ -54,7 +64,8 @@
QString noMembers = hbTrId("txt_phob_dblist_val_no_members_selected");
mThread = new CntCollectionListModelWorker(unnamed, noFavs, noMembers, order);
- connect(mThread, SIGNAL(fetchDone(int, const QString&, int)), this, SLOT(informationUpdated(int, const QString&, int)));
+ connect(mThread, SIGNAL(fetchDone(int, const QString&, const QList<int>&)), this,
+ SLOT(informationUpdated(int, const QString&, const QList<int>&)));
connect(d->mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void *, int, int)),
this, SLOT(onIconReady(QPixmap, void *, int, int)));
@@ -94,6 +105,8 @@
*/
QVariant CntCollectionListModel::data(const QModelIndex& index, int role) const
{
+ CNT_ENTRY_ARGS(index << role)
+
int row = index.row();
if ( !validateRowIndex(row) )
@@ -190,20 +203,25 @@
\param localId QContactLocalId of the group that should be removed
*/
-void CntCollectionListModel::removeGroup(int localId)
+bool CntCollectionListModel::removeGroup(int localId)
{
- CNT_ENTRY
+ CNT_ENTRY_ARGS(localId)
+
+ bool groupRemoved = false;
for (int i = 0;i < rowCount();i++)
{
if (!d->mList.at(i)->isPlugin && d->mList.at(i)->id == localId)
{
removeRow(i);
+ groupRemoved = true;
break;
}
}
- CNT_EXIT
+ CNT_EXIT_ARGS(groupRemoved)
+
+ return groupRemoved;
}
/*!
@@ -214,7 +232,7 @@
*/
void CntCollectionListModel::addGroup(int localId)
{
- CNT_ENTRY
+ CNT_ENTRY_ARGS(localId)
QContactDetailFilter groupFilter;
groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
@@ -312,6 +330,8 @@
*/
CntViewParameters CntCollectionListModel::extensionGroupActivated(int row)
{
+ CNT_ENTRY_ARGS(row)
+
CntViewParameters params;
for(int i = 0;i < d->mExtensions.value(row)->groupCount();i++)
{
@@ -322,6 +342,9 @@
break;
}
}
+
+ CNT_EXIT_ARGS(params)
+
return params;
}
@@ -335,7 +358,7 @@
*/
void CntCollectionListModel::extensionGroupLongPressed(int row, const QPointF& coords, CntExtensionGroupCallback* interface)
{
- CNT_ENTRY
+ CNT_ENTRY_ARGS(row << coords << interface)
for(int i = 0;i < d->mExtensions.value(row)->groupCount();i++)
{
@@ -358,15 +381,22 @@
*/
QModelIndex CntCollectionListModel::indexOfGroup(int localId)
{
+ CNT_ENTRY_ARGS(localId)
+
+ QModelIndex groupIndex;
+
for (int i = 0;i < d->mList.count();i++)
{
if (d->mList.at(i)->id == localId && !d->mList.at(i)->isPlugin)
{
- return index(i);
+ groupIndex = index(i);
+ break;
}
}
- return QModelIndex();
+ CNT_EXIT_ARGS(groupIndex)
+
+ return groupIndex;
}
/*!
@@ -380,6 +410,13 @@
initializeExtensions();
initializeUserGroups();
+ connect(d->mContactManager, SIGNAL(contactsAdded(const QList<QContactLocalId>&)), this, SLOT(handleAdded(const QList<QContactLocalId>&)));
+ connect(d->mContactManager, SIGNAL(contactsChanged(const QList<QContactLocalId>&)), this, SLOT(handleChanged(const QList<QContactLocalId>&)));
+ connect(d->mContactManager, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), this, SLOT(handleRemoved(const QList<QContactLocalId>&)));
+ connect(d->mContactManager, SIGNAL(relationshipsAdded(const QList<QContactLocalId>&)), this, SLOT(handleAddedRelationship(const QList<QContactLocalId>&)));
+ connect(d->mContactManager, SIGNAL(relationshipsRemoved(const QList<QContactLocalId>&)), this, SLOT(handleRemovedRelationship(const QList<QContactLocalId>&)));
+
+
CNT_EXIT
}
@@ -526,6 +563,8 @@
*/
QVariant CntCollectionListModel::displayRoleData(const CntCollectionItem& item) const
{
+ CNT_ENTRY
+
QStringList list;
list << item.groupName << item.secondLineText;
@@ -539,6 +578,8 @@
list << " ";
}
+ CNT_EXIT
+
return QVariant(list);
}
@@ -550,6 +591,8 @@
*/
QVariant CntCollectionListModel::decorationRoleData(const CntCollectionItem& item) const
{
+ CNT_ENTRY
+
QList<QVariant> icons;
icons << item.icon;
@@ -558,6 +601,8 @@
icons << item.secondaryIcon;
}
+ CNT_EXIT
+
return QVariant(icons);
}
@@ -580,9 +625,9 @@
\param secondRowText text to be shown in the second row
\param memberCount the amount of members the group has (shown in text-3 in HbListViewItem)
*/
-void CntCollectionListModel::informationUpdated(int id, const QString& secondRowText, int memberCount)
+void CntCollectionListModel::informationUpdated(int id, const QString& secondRowText, const QList<int>& members)
{
- CNT_ENTRY
+ CNT_ENTRY_ARGS(id << secondRowText << members)
for (int i = 0;i < d->mList.count();i++)
{
@@ -591,7 +636,8 @@
CollectionItemPointer item = d->mList.at(i);
item->secondLineText = secondRowText;
- item->memberCount = memberCount;
+ item->memberCount = members.count();
+ item->members = members;
int idx = d->mList.indexOf(item);
emit dataChanged(index(idx, 0), index(idx, 0));
@@ -614,7 +660,7 @@
*/
void CntCollectionListModel::onIconReady(const QPixmap& pixmap, void *data, int id, int error)
{
- CNT_ENTRY
+ CNT_ENTRY_ARGS(pixmap << data << id << error)
Q_UNUSED(data);
@@ -649,6 +695,8 @@
*/
void CntCollectionListModel::extensionGroupsReady()
{
+ CNT_ENTRY
+
CntUiGroupSupplier* groupSupplier = static_cast<CntUiGroupSupplier*>(sender());
int addedCount = groupSupplier->groupCount();
@@ -693,4 +741,198 @@
endInsertRows();
}
+
+ CNT_EXIT
}
+
+void CntCollectionListModel::handleAdded(const QList<QContactLocalId>& contactIds)
+{
+ CNT_ENTRY_ARGS(contactIds)
+
+ if (contactIds.count() == 1)
+ {
+ QContactFetchHint noRelationshipsFetchHint;
+ noRelationshipsFetchHint.setOptimizationHints(QContactFetchHint::NoRelationships);
+
+ QContact contact = d->mContactManager->contact(contactIds.first(), noRelationshipsFetchHint);
+
+ if (contact.type() == QContactType::TypeGroup)
+ {
+ addGroup(contactIds.first());
+ emit groupCountChanged();
+ }
+ }
+ else
+ {
+ QList<QContact> addedGroups;
+
+ foreach (QContactLocalId id, contactIds)
+ {
+ QContactFetchHint noRelationshipsFetchHint;
+ noRelationshipsFetchHint.setOptimizationHints(QContactFetchHint::NoRelationships);
+
+ QContact contact = d->mContactManager->contact(id, noRelationshipsFetchHint);
+
+ if (contact.type() == QContactType::TypeGroup)
+ {
+ addedGroups << contact;
+ }
+ }
+
+ if (addedGroups.count() == 1)
+ {
+ addGroup(addedGroups.first().localId());
+ emit groupCountChanged();
+ }
+ else if (addedGroups.count() > 1)
+ {
+ qSort(addedGroups.begin(), addedGroups.end(), caseInsensitiveLessThan);
+
+ foreach (QContact c, addedGroups)
+ {
+ addGroup(c.localId());
+ }
+ emit groupCountChanged();
+ }
+ }
+
+ CNT_EXIT
+}
+
+void CntCollectionListModel::handleRemoved(const QList<QContactLocalId>& contactIds)
+{
+ CNT_ENTRY_ARGS(contactIds)
+
+ foreach (QContactLocalId id, contactIds)
+ {
+ if (removeGroup(id))
+ {
+ emit groupCountChanged();
+ }
+ else
+ {
+ for (int i = 0;i < d->mList.count();i++)
+ {
+ if (d->mList.at(i)->members.contains(id))
+ {
+ CollectionItemPointer item = d->mList.at(i);
+
+ item->fetched = false;
+
+ int idx = d->mList.indexOf(item);
+ emit dataChanged(index(idx, 0), index(idx, 0));
+ }
+ }
+ }
+ }
+
+ CNT_EXIT
+}
+
+void CntCollectionListModel::handleChanged(const QList<QContactLocalId>& contactIds)
+{
+ CNT_ENTRY_ARGS(contactIds)
+
+ foreach (QContactLocalId id, contactIds)
+ {
+ QContact contact = d->mContactManager->contact(id);
+
+ if (contact.type() == QContactType::TypeGroup)
+ {
+ for (int i = 0;i < d->mList.count();i++)
+ {
+ if (d->mList.at(i)->id == id && !d->mList.at(i)->isPlugin)
+ {
+ CollectionItemPointer item = d->mList.at(i);
+
+ QContactName contactName = contact.detail<QContactName>();
+ QString groupName = contactName.customLabel();
+
+ if (groupName != item->groupName)
+ {
+ if (groupName.isNull())
+ {
+ item->groupName = hbTrId("txt_phob_dblist_unnamed");
+ }
+ else
+ {
+ item->groupName = groupName;
+ }
+
+ int idx = d->mList.indexOf(item);
+ emit dataChanged(index(idx, 0), index(idx, 0));
+ }
+
+ break;
+ }
+ }
+ }
+ else if (contact.type() == QContactType::TypeContact)
+ {
+ for (int i = 0;i < d->mList.count();i++)
+ {
+ if (d->mList.at(i)->members.contains(id))
+ {
+ CollectionItemPointer item = d->mList.at(i);
+
+ item->fetched = false;
+
+ int idx = d->mList.indexOf(item);
+ emit dataChanged(index(idx, 0), index(idx, 0));
+ }
+ }
+ }
+ }
+
+ CNT_EXIT
+}
+
+void CntCollectionListModel::handleAddedRelationship(const QList<QContactLocalId>& contactIds)
+{
+ CNT_ENTRY_ARGS(contactIds)
+
+ foreach (QContactLocalId id, contactIds)
+ {
+ for (int i = 0;i < d->mList.count();i++)
+ {
+ if (d->mList.at(i)->id == id && !d->mList.at(i)->isPlugin)
+ {
+ CollectionItemPointer item = d->mList.at(i);
+
+ item->fetched = false;
+
+ int idx = d->mList.indexOf(item);
+ emit dataChanged(index(idx, 0), index(idx, 0));
+
+ break;
+ }
+ }
+ }
+
+ CNT_EXIT
+}
+
+void CntCollectionListModel::handleRemovedRelationship(const QList<QContactLocalId>& contactIds)
+{
+ CNT_ENTRY_ARGS(contactIds)
+
+ foreach (QContactLocalId id, contactIds)
+ {
+ for (int i = 0;i < d->mList.count();i++)
+ {
+ if (d->mList.at(i)->id == id && !d->mList.at(i)->isPlugin)
+ {
+ CollectionItemPointer item = d->mList.at(i);
+
+ item->fetched = false;
+
+ int idx = d->mList.indexOf(item);
+ emit dataChanged(index(idx, 0), index(idx, 0));
+
+ break;
+ }
+ }
+ }
+
+ CNT_EXIT
+}