phonebookui/pbkcommonui/src/cntgroupmemberview.cpp
changeset 37 fd64c38c277d
parent 31 2a11b5b00470
child 40 b46a585f6909
--- a/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp	Fri May 14 15:42:23 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp	Thu May 27 12:45:19 2010 +0300
@@ -64,7 +64,6 @@
     mImageLabel(NULL), 
     mListView(NULL),
     mFetchView(NULL),
-    mIsPreviousImageEditorView(false),
     mAvatar(NULL)
 {
 
@@ -84,6 +83,7 @@
     
     mImageLabel = static_cast<CntImageLabel*>(mDocument->findWidget("editViewImage"));
     connect( mImageLabel, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) );
+    connect( mImageLabel, SIGNAL(iconLongPressed(const QPointF&)), this, SLOT(drawImageMenu(const QPointF&)) );
     
     mListView = static_cast<HbListView*>( mDocument->findWidget("listView") );
     connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this,
@@ -92,6 +92,7 @@
         SLOT(showContactView(const QModelIndex&)));
     
     mHeadingItem = static_cast<CntContactCardHeadingItem*>( mDocument->findWidget("editViewHeading") );
+    connect(mHeadingItem, SIGNAL(passShortPressed(const QPointF&)), this, SLOT(openImageEditor()) );
     connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawImageMenu(const QPointF&)));
 
     // menu actions
@@ -159,14 +160,9 @@
         mView->setNavigationAction(mSoftkey);   
         }
         
-    QVariant contact = aArgs.value( ESelectedContact );
+    QVariant contact = aArgs.value( ESelectedGroupContact );
     mGroupContact = new QContact( contact.value<QContact>() );
     
-    if (aArgs.value(ECustomParam).toInt() == imageEditorView)
-        {    
-            mIsPreviousImageEditorView = true;   
-        }
-    
     HbMainWindow* window = mView->mainWindow();
     if ( window )
     {
@@ -203,27 +199,7 @@
     frame.setFrameType(HbFrameDrawer::NinePieces);
     mListView->itemPrototypes().first()->setDefaultFrame(frame);
     
-    QContactRelationshipFilter rFilter;
-    rFilter.setRelationshipType(QContactRelationship::HasMember);
-    rFilter.setRelatedContactRole(QContactRelationship::First);
-    rFilter.setRelatedContactId(mGroupContact->id());
-    
-    QContactSortOrder sortOrderFirstName;
-    sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName,
-        QContactName::FieldFirst);
-    sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive);
-
-    QContactSortOrder sortOrderLastName;
-    sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName,
-        QContactName::FieldLast);
-    sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive);
-
-    QList<QContactSortOrder> sortOrders;
-    sortOrders.append(sortOrderFirstName);
-    sortOrders.append(sortOrderLastName);
-
-    mModel = new MobCntModel(getContactManager(), rFilter, sortOrders, false);
-    mListView->setModel(mModel);
+    createModel();
     
     if (aArgs.value(ESelectedAction).toString() == "save")
     {
@@ -242,12 +218,18 @@
 
 void CntGroupMemberView::showPreviousView()
 {
-    //save an avatar
-    if (mIsPreviousImageEditorView)
+    //save the contact if avatar has been changed.
+    QContact contact = mViewManager->contactManager( SYMBIAN_BACKEND )->contact(mGroupContact->localId());
+    if ( contact != *mGroupContact )
     {
-        if (!mAvatar->imageUrl().isEmpty())
+        QList<QContactAvatar> details = mGroupContact->details<QContactAvatar>();
+        for (int i = 0; i < details.count(); i++)
         {
-            mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact);
+            if (!details.at(i).imageUrl().isEmpty())
+            {
+                getContactManager()->saveContact(mGroupContact);
+                break;
+            }
         }
     }
     
@@ -261,7 +243,7 @@
     viewParameters.insert(EViewId, groupActionsView);
     QVariant var;
     var.setValue(*mGroupContact);
-    viewParameters.insert(ESelectedContact, var);
+    viewParameters.insert(ESelectedGroupContact, var);
     mViewManager->changeView(viewParameters);
 }
 
@@ -269,15 +251,20 @@
 {
     QContactRelationshipFilter membersFilter;
     membersFilter.setRelationshipType(QContactRelationship::HasMember);
-    membersFilter.setRelatedContactRole(QContactRelationshipFilter::First);
+    membersFilter.setRelatedContactRole(QContactRelationship::First);
     membersFilter.setRelatedContactId(mGroupContact->id());   
     mOriginalGroupMembers = getContactManager()->contactIds(membersFilter);
     
     QSet<QContactLocalId> contactsSet = mOriginalGroupMembers.toSet();
     QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName );
     QString groupName(groupContactName.value( QContactName::FieldCustomLabel ));
+    
+    if (!mFetchView) {
+        mFetchView = new CntFetchContacts(mViewManager->contactManager( SYMBIAN_BACKEND ));
+        connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleManageMembers()));
+    }
     mFetchView->setDetails(HbParameterLengthLimiter(hbTrId("txt_phob_subtitle_1_group")).arg(groupName),
-                           hbTrId("Save"));
+                           hbTrId("txt_common_button_save"));
     mFetchView->displayContacts(CntFetchContacts::popup,
                                 HbAbstractItemView::MultiSelection,
                                 contactsSet);
@@ -285,6 +272,7 @@
 
 void CntGroupMemberView::handleManageMembers()
 {
+    
     QSet<QContactLocalId> selectedContacts = mFetchView->getSelectedContacts();
     
     if (mFetchView->wasCanceled()) {
@@ -321,14 +309,46 @@
         membership.setSecond(contact.id());
         addedMemberships.append(membership);
     }
-        
+    
+    QMap<int, QContactManager::Error> errors;
     if (!addedMemberships.isEmpty()) {
-        getContactManager()->saveRelationships(&addedMemberships);
+        getContactManager()->saveRelationships(&addedMemberships, &errors);
     }
     
     if (!removedMemberships.isEmpty()) {
-        getContactManager()->removeRelationships(removedMemberships);
+        getContactManager()->removeRelationships(removedMemberships, &errors);
     }
+    
+    // delete the model and recreate it with relationship changes
+    delete mModel;
+    mModel = 0;
+    
+    createModel();
+}
+
+void CntGroupMemberView::createModel()
+{
+    QContactRelationshipFilter rFilter;
+    rFilter.setRelationshipType(QContactRelationship::HasMember);
+    rFilter.setRelatedContactRole(QContactRelationship::First);
+    rFilter.setRelatedContactId(mGroupContact->id());
+    
+    QContactSortOrder sortOrderFirstName;
+    sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName,
+        QContactName::FieldFirst);
+    sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive);
+
+    QContactSortOrder sortOrderLastName;
+    sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName,
+        QContactName::FieldLast);
+    sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive);
+
+    QList<QContactSortOrder> sortOrders;
+    sortOrders.append(sortOrderFirstName);
+    sortOrders.append(sortOrderLastName);
+
+    mModel = new MobCntModel(getContactManager(), rFilter, sortOrders, false);
+    mListView->setModel(mModel);
 }
 
 void CntGroupMemberView::editGroup()
@@ -337,7 +357,7 @@
     viewParameters.insert(EViewId, groupEditorView);
     QVariant var;
     var.setValue(*mGroupContact);
-    viewParameters.insert(ESelectedContact, var);
+    viewParameters.insert(ESelectedGroupContact, var);
     mViewManager->changeView(viewParameters);
 }
 
@@ -394,9 +414,7 @@
 {
     int row = action->data().toInt();
     HbMenu *menuItem = static_cast<HbMenu*>(sender());
-    QModelIndex index = mModel->index(row, 0);
-    
-    int id = index.data(Qt::UserRole).toInt();
+    QModelIndex index = mModel->index(row);
     
     if ( action == menuItem->actions().first() )
         {
@@ -426,7 +444,6 @@
     QVariant varGroup;
     varGroup.setValue(*mGroupContact);
     viewParameters.insert(ESelectedGroupContact, varGroup);
-    viewParameters.insert(ESelectedAction, "FromGroupMemberView");
     mViewManager->changeView(viewParameters);
         
 }
@@ -440,6 +457,12 @@
     relationship.setFirst(mGroupContact->id());
     relationship.setSecond(selectedContact.id());
     getContactManager()->removeRelationship(relationship);
+    
+    // delete the model and recreate it with relationship changes
+    delete mModel;
+    mModel = NULL;
+    
+    createModel();
 }
 
 void CntGroupMemberView::editContact(const QModelIndex &index)
@@ -474,7 +497,12 @@
     var.setValue(*mGroupContact);
                 
     CntViewParameters viewParameters;
+    // SelectedGroupContact is needed so we know which group to show
+    // when we come back to this view, and selected contact is needed
+    // for image editor to be able to assign the image to correct contact.
+    viewParameters.insert(ESelectedGroupContact, var);
     viewParameters.insert(ESelectedContact, var);
+    
     viewParameters.insert(EViewId, imageEditorView );
         
     mViewManager->changeView( viewParameters );
@@ -482,8 +510,6 @@
 
 QContactManager* CntGroupMemberView::getContactManager()
 {
-    if (!mViewManager) return NULL;
-
     return mViewManager->contactManager(SYMBIAN_BACKEND);
 }
 
@@ -493,50 +519,32 @@
 void CntGroupMemberView::drawImageMenu(const QPointF &aCoords)
 {
     HbMenu *menu = new HbMenu();
-    HbAction *changeImageAction = menu->addAction(hbTrId("txt_phob_menu_change_picture"));
-    HbAction *removeAction = menu->addAction(hbTrId("txt_phob_menu_remove_image"));
+    HbAction *changeImageAction = menu->addAction(hbTrId("txt_phob_menu_change_picture"), this, SLOT(openImageEditor()));
+    if (mAvatar)
+    {
+        HbAction *removeAction = menu->addAction(hbTrId("txt_phob_menu_remove_image"), this, SLOT(removeImage()));
+    }
     menu->setPreferredPos(aCoords);
-    menu->open(this, SLOT(handleImageMenu(HbAction*)));
+    menu->open();
 }
 
-void CntGroupMemberView::handleImageMenu(HbAction* action)
-{
-    HbMenu *menuItem = static_cast<HbMenu*>(sender());
-    if ( action == menuItem->actions().first() ) {
-        changeImage();
-    }
-    else if (action == menuItem->actions().at(1)) {
-        removeImage();
-    }
-}
-
-void CntGroupMemberView::changeImage()
-{
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, imageEditorView);
-    QVariant var;
-    var.setValue(*mGroupContact);
-    viewParameters.insert(ESelectedContact, var);
-    mViewManager->changeView(viewParameters);
-}
 
 void CntGroupMemberView::removeImage()
 {
-if (mAvatar) 
+    if (mAvatar) 
     {
-    if (!mAvatar->imageUrl().isEmpty())
+        if (!mAvatar->imageUrl().isEmpty())
+        {
+            mGroupContact->removeDetail(mAvatar);
+            // Check if image removable.
+            CntImageUtility imageUtility;
+            if(imageUtility.isImageRemovable(mAvatar->imageUrl().toString()))
             {
-                mGroupContact->removeDetail(mAvatar);
-                // Check if image removable.
-                CntImageUtility imageUtility;
-                if(imageUtility.isImageRemovable(mAvatar->imageUrl().toString()))
-                {
-                    imageUtility.removeImage(mAvatar->imageUrl().toString());
-                }
-                mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact);
-                mHeadingItem->setIcon(HbIcon("qtg_large_avatar"));
-                
+                imageUtility.removeImage(mAvatar->imageUrl().toString());
             }
+            mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact);
+            mHeadingItem->setIcon(HbIcon("qtg_large_avatar"));
+        }
     }
 }