phonebookui/pbkcommonui/src/cnteditview_p.cpp
changeset 53 e6aff7b69165
parent 50 77bc263e1626
child 61 d30183af6ca6
--- a/phonebookui/pbkcommonui/src/cnteditview_p.cpp	Wed Jul 21 11:37:51 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cnteditview_p.cpp	Fri Jul 23 12:43:48 2010 +0300
@@ -23,6 +23,7 @@
 #include "cntimagelabel.h"
 #include "cntsavemanager.h"
 #include "cntglobal.h"
+#include "cntdebug.h"
 
 #include <qtcontacts.h>
 #include <hbdocumentloader.h>
@@ -44,6 +45,7 @@
 
 #include <QFileInfo>
 #include <QApplication>
+#include <QTimer>
 
 const char *CNT_EDIT_XML = ":/xml/contacts_ev.docml";
 
@@ -52,7 +54,7 @@
     mImageLabel( NULL ),
     mThumbnailManager( NULL ),
     mContact( NULL ),
-    mReq(0),
+    mReq(NULL),
     mMenu(NULL),
     mSaveManager(NULL)
 {
@@ -140,6 +142,8 @@
 
 void CntEditViewPrivate::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs )
 {
+    CNT_ENTRY
+    
     mMgr = aMgr;
     mArgs = aArgs;
     
@@ -220,6 +224,8 @@
             this, SLOT(thumbnailReady(QPixmap, void*, int, int)) );
 
     loadAvatar();
+    
+    CNT_EXIT
 }
 
 void CntEditViewPrivate::deactivate()
@@ -346,10 +352,12 @@
 {
     CntDetailPopup *popup = static_cast<CntDetailPopup*>(sender());
     
-    if (popup && aAction != popup->actions().first())
+    if (popup && aAction != popup->actions().first() && popup->selectedItems().count())
     {
-        int id = popup->selectedDetail();
-        
+        int row = popup->selectedItems().first().toInt();
+        QModelIndex index = popup->model()->index(row, 0);
+        int id = popup->model()->data(index, Qt::UserRole).toInt();
+
         if (id != noView )
         {
             mArgs.insert(EViewId, id );
@@ -454,7 +462,7 @@
     else
     {
         QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
-        QString name = cm->synthesizedDisplayLabel( *mContact );
+        QString name = cm->synthesizedContactDisplayLabel( *mContact );
         if (name.isEmpty())
         {
             name = hbTrId("txt_phob_list_unnamed");
@@ -473,9 +481,11 @@
     {
         QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
 
+        disconnect(cm, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)),
+                this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)));
         emit q->contactRemoved(cm->removeContact( mContact->localId() ));
         
-        mMgr->back( mArgs );
+        mMgr->back( mArgs, true );
     }
 }
 
@@ -487,22 +497,30 @@
     
     // get a fresh one from backend.
     QContactManager* mgr = mMgr->contactManager(SYMBIAN_BACKEND);
-    mContact = new QContact(mgr->contact( mContact->localId() ));
+    setSelectedContact( mgr->contact( mContact->localId()) );
     
     QVariant var;
     var.setValue(*mContact);
     
     CntViewParameters viewParameters;
     viewParameters.insert(ESelectedContact, var);
-            
-    mMgr->back( viewParameters );
-}
+    
+    if ( mArgs.value( EExtraAction ).toString() == CNT_ROOT_ACTION )
+    {
+        mMgr->back( viewParameters, true );
+    }
+    else
+    {
+        mMgr->back( viewParameters );
+    }
+       
+}   
 
 void CntEditViewPrivate::saveChanges()
 {
     Q_Q(CntEditView);
     
-    QString name = mMgr->contactManager(SYMBIAN_BACKEND)->synthesizedDisplayLabel(*mContact);
+    QString name = mMgr->contactManager(SYMBIAN_BACKEND)->synthesizedContactDisplayLabel(*mContact);
     
     if (name.isEmpty())
     {
@@ -512,6 +530,7 @@
     CntSaveManager::CntSaveResult result = mSaveManager->saveContact(mContact, mMgr->contactManager(SYMBIAN_BACKEND));
     
     QVariant var;
+    bool backToRoot(false);
     
     switch (result)
     {
@@ -534,15 +553,21 @@
         HbDeviceNotificationDialog::notification(QString(),hbTrId("SAVING FAILED!"));
         break;
     case CntSaveManager::EDeleted:
-        emit q->contactUpdated(KCntServicesReturnValueContactDeleted);
+        emit q->contactRemoved(true);
+        backToRoot = true;
         break;
     case CntSaveManager::ENothingDone:
     default:
         emit q->contactUpdated(KCntServicesReturnValueContactNotModified);
         break;
     }
+
+    if ( mArgs.value( EExtraAction ).toString() == CNT_ROOT_ACTION )
+    {
+        backToRoot = true;
+    }
     
-    mMgr->back( mArgs );
+    mMgr->back( mArgs, backToRoot );
 }
 
 void CntEditViewPrivate::openNameEditor()
@@ -607,7 +632,7 @@
         mHeading->setIcon(icon);
         
         mImageLabel->clear();
-        mImageLabel->setIcon(icon);
+        mImageLabel->setIcon(pixmap);
     }
 }
 
@@ -681,14 +706,15 @@
 void CntEditViewPrivate::addDetail( CntEditViewItem* aDetail )
 {
     QVariant id = aDetail->data( ERoleEditorViewId );
-    CntViewParameters viewParameters;
-    viewParameters.insert(EViewId, id.toInt());
+    
+    mArgs.insert(EViewId, id.toInt());
+    mArgs.insert(ESelectedAction, CNT_ADD_ACTION );
     QVariant var;
     var.setValue(*mContact);
-    viewParameters.insert(ESelectedContact, var);
-    viewParameters.insert(ESelectedAction, CNT_ADD_ACTION );
-                                            
-    mMgr->changeView( viewParameters );
+    
+    mArgs.insert(ESelectedContact, var);
+                                        
+    mMgr->changeView( mArgs );
 }
 
 void CntEditViewPrivate::editDetail( CntEditViewItem* aDetail )
@@ -720,19 +746,37 @@
         mContact = NULL;
     }
     mContact = new QContact( aContact );
-    /*
-    mListView->setModel( NULL );
     
-    if ( mModel )
+    QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND );
+    connect(cm, SIGNAL(contactsRemoved(const QList<QContactLocalId>&)), 
+        this, SLOT(contactDeletedFromOtherSource(const QList<QContactLocalId>&)), Qt::UniqueConnection);
+}
+
+void CntEditViewPrivate::contactDeletedFromOtherSource(const QList<QContactLocalId>& contactIds)
+{
+    CNT_ENTRY
+    
+    if ( contactIds.contains(mContact->localId()) )
     {
-        delete mModel;
-        mModel = NULL;
+        // Do not switch to the previous view immediately. List views are
+        // not updated properly if this is not done in the event loop
+        QTimer::singleShot(0, this, SLOT(showRootView()));
     }
-    mModel = new CntEditViewListModel( mContact );
     
-    if ( mListView )
-        mListView->setModel( mModel );
-        */
+    CNT_EXIT
 }
+
+void CntEditViewPrivate::showRootView()
+{
+    CNT_ENTRY
+    
+    Q_Q(CntEditView);
+    
+    emit q->contactRemoved(true);
+    mMgr->back( mArgs, true );
+    
+    CNT_EXIT
+}
+
 // End of File