qtmobility/examples/samplephonebook/contacteditor.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
equal deleted inserted replaced
1:2b40d63a9c3d 4:90517678cc4f
    47         :QWidget(parent)
    47         :QWidget(parent)
    48 {
    48 {
    49     m_manager = 0;
    49     m_manager = 0;
    50     m_contactId = QContactLocalId(0);
    50     m_contactId = QContactLocalId(0);
    51 
    51 
    52 #ifdef Q_OS_SYMBIAN    
       
    53     // In symbian "save" and "cancel" buttons are softkeys.
       
    54     m_saveBtn = new QAction("Save", this);
       
    55     m_saveBtn->setSoftKeyRole(QAction::PositiveSoftKey);
       
    56     addAction(m_saveBtn);
       
    57     connect(m_saveBtn, SIGNAL(triggered(bool)), this, SLOT(saveClicked()));
       
    58     m_cancelBtn = new QAction("Cancel", this);
       
    59     m_cancelBtn->setSoftKeyRole(QAction::NegativeSoftKey);
       
    60     addAction(m_cancelBtn);
       
    61     connect(m_cancelBtn, SIGNAL(triggered(bool)), this, SLOT(cancelClicked()));     
       
    62 #else
       
    63     m_saveBtn = new QPushButton("Save", this);
       
    64     connect(m_saveBtn, SIGNAL(clicked()), this, SLOT(saveClicked()));
       
    65     m_cancelBtn = new QPushButton("Cancel", this);
       
    66     connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(cancelClicked()));
       
    67 #endif
       
    68 
       
    69     m_nameEdit = new QLineEdit(this);
    52     m_nameEdit = new QLineEdit(this);
    70     m_phoneEdit = new QLineEdit(this);
    53     m_phoneEdit = new QLineEdit(this);
    71     m_emailEdit = new QLineEdit(this);
    54     m_emailEdit = new QLineEdit(this);
    72     m_addrEdit = new QLineEdit(this);
    55     m_addrEdit = new QLineEdit(this);
    73     m_avatarBtn = new QPushButton("Add image", this);
    56     m_avatarBtn = new QPushButton(tr("Add image"), this);
    74     m_avatarBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    57     m_avatarBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    75     connect(m_avatarBtn, SIGNAL(clicked()), this, SLOT(avatarClicked()));
    58     connect(m_avatarBtn, SIGNAL(clicked()), this, SLOT(avatarClicked()));
    76 
    59 
       
    60 
    77     QFormLayout *detailsLayout = new QFormLayout;
    61     QFormLayout *detailsLayout = new QFormLayout;
    78     detailsLayout->addRow(new QLabel("Name", this));
    62     QLabel *nameLabel = new QLabel(tr("Name"), this);
    79     detailsLayout->addRow(m_nameEdit);
    63     QLabel *phoneLabel = new QLabel(tr("Phone"), this);
    80     detailsLayout->addRow(new QLabel("Phone", this));
    64     QLabel *emailLabel = new QLabel(tr("Email"), this);
    81     detailsLayout->addRow(m_phoneEdit);
    65     QLabel *addressLabel = new QLabel(tr("Address"), this);
    82     detailsLayout->addRow(new QLabel("Email", this));
    66     QLabel *avatarLabel = new QLabel(tr("Avatar"), this);
    83     detailsLayout->addRow(m_emailEdit);
    67     if (QApplication::desktop()->availableGeometry().width() < 360) {
    84     detailsLayout->addRow(new QLabel("Address", this));
    68         // Narrow screen: put label on separate line to textbox
    85     detailsLayout->addRow(m_addrEdit);
    69         detailsLayout->addRow(nameLabel);
    86     detailsLayout->addRow(new QLabel("Avatar", this));
    70         detailsLayout->addRow(m_nameEdit);
    87     detailsLayout->addRow(m_avatarBtn);
    71         detailsLayout->addRow(phoneLabel);
       
    72         detailsLayout->addRow(m_phoneEdit);
       
    73         detailsLayout->addRow(emailLabel);
       
    74         detailsLayout->addRow(m_emailEdit);
       
    75         detailsLayout->addRow(addressLabel);
       
    76         detailsLayout->addRow(m_addrEdit);
       
    77         detailsLayout->addRow(avatarLabel);
       
    78         detailsLayout->addRow(m_avatarBtn);
       
    79     } else {
       
    80         // Wide screen: put label on same line as textbox
       
    81         detailsLayout->addRow(nameLabel, m_nameEdit);
       
    82         detailsLayout->addRow(phoneLabel, m_phoneEdit);
       
    83         detailsLayout->addRow(emailLabel, m_emailEdit);
       
    84         detailsLayout->addRow(addressLabel, m_addrEdit);
       
    85         detailsLayout->addRow(avatarLabel, m_avatarBtn);
       
    86     }
    88     detailsLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
    87     detailsLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
    89     detailsLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
    88     detailsLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
    90     
    89 
    91     QScrollArea *detailsScrollArea = new QScrollArea(this);
    90     QScrollArea *detailsScrollArea = new QScrollArea(this);
    92     detailsScrollArea->setWidgetResizable(true);
    91     detailsScrollArea->setWidgetResizable(true);
    93     QWidget *detailsContainer = new QWidget(detailsScrollArea);
    92     QWidget *detailsContainer = new QWidget(detailsScrollArea);
    94     detailsContainer->setLayout(detailsLayout);
    93     detailsContainer->setLayout(detailsLayout);
    95     detailsScrollArea->setWidget(detailsContainer);
    94     detailsScrollArea->setWidget(detailsContainer);
    96 
    95 
    97 #ifndef Q_OS_SYMBIAN    
    96     QVBoxLayout *editLayout = new QVBoxLayout;
       
    97     editLayout->addWidget(detailsScrollArea);
       
    98 
       
    99 #ifdef Q_OS_SYMBIAN
       
   100     // In symbian "save" and "cancel" buttons are softkeys.
       
   101     m_saveBtn = new QAction(tr("Save"), this);
       
   102     m_saveBtn->setSoftKeyRole(QAction::PositiveSoftKey);
       
   103     addAction(m_saveBtn);
       
   104     connect(m_saveBtn, SIGNAL(triggered(bool)), this, SLOT(saveClicked()));
       
   105     m_cancelBtn = new QAction(tr("Cancel"), this);
       
   106     m_cancelBtn->setSoftKeyRole(QAction::NegativeSoftKey);
       
   107     addAction(m_cancelBtn);
       
   108     connect(m_cancelBtn, SIGNAL(triggered(bool)), this, SLOT(cancelClicked()));
       
   109 #else
       
   110     m_saveBtn = new QPushButton(tr("&Save"), this);
       
   111     m_saveBtn->setDefault(true);
       
   112     connect(m_saveBtn, SIGNAL(clicked()), this, SLOT(saveClicked()));
       
   113     m_cancelBtn = new QPushButton(tr("&Cancel"), this);
       
   114     connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(cancelClicked()));
    98     QHBoxLayout *btnLayout = new QHBoxLayout;
   115     QHBoxLayout *btnLayout = new QHBoxLayout;
    99     btnLayout->addWidget(m_saveBtn);
   116     btnLayout->addWidget(m_saveBtn);
   100     btnLayout->addWidget(m_cancelBtn);
   117     btnLayout->addWidget(m_cancelBtn);
   101 #endif
       
   102 
       
   103     QVBoxLayout *editLayout = new QVBoxLayout;
       
   104     editLayout->addWidget(detailsScrollArea);
       
   105 #ifndef Q_OS_SYMBIAN
       
   106     editLayout->addLayout(btnLayout);
   118     editLayout->addLayout(btnLayout);
   107 #endif
   119 #endif
   108 
   120 
   109     setLayout(editLayout);
   121     setLayout(editLayout);
   110 }
   122 }
   117 {
   129 {
   118     m_manager = manager;
   130     m_manager = manager;
   119     m_contactId = currentId;
   131     m_contactId = currentId;
   120     m_newAvatarPath = QString();
   132     m_newAvatarPath = QString();
   121 
   133 
   122     if (manager == 0 || currentId == 0) {
   134     // Clear UI
   123         // clear the UI and return.
   135     m_nameEdit->clear();
   124         m_nameEdit->setText("");
   136     m_phoneEdit->clear();
   125         m_phoneEdit->setText("");
   137     m_emailEdit->clear();
   126         m_emailEdit->setText("");
   138     m_addrEdit->clear();
   127         m_addrEdit->setText("");
   139     m_avatarBtn->setText("Add image");
   128         m_avatarBtn->setText("Add image");
   140     m_avatarBtn->setIcon(QIcon());
   129         m_avatarBtn->setIcon(QIcon());
   141 
   130 
   142     if (manager == 0) {
   131         if (manager == 0)
   143         m_saveBtn->setEnabled(false);
   132             m_saveBtn->setEnabled(false);
       
   133 
       
   134         return;
   144         return;
   135     }
   145     }
   136 
   146 
   137     // enable the UI.
   147     // enable the UI.
   138     m_saveBtn->setEnabled(true);
   148     m_saveBtn->setEnabled(true);
   139 
   149 
   140     // otherwise, build from the contact details.
   150     // otherwise, build from the contact details.
   141     QContact curr = manager->contact(m_contactId);
   151     QContact curr;
   142     QContactName nm = curr.detail(QContactName::DefinitionName);
   152     if (m_contactId != QContactLocalId(0))
       
   153         curr = manager->contact(m_contactId);
       
   154 
       
   155     // Disable fields & buttons according to what the backend supports
       
   156     QMap<QString, QContactDetailDefinition> defs = m_manager->detailDefinitions(QContactType::TypeContact);
       
   157 
       
   158     // name
       
   159     //QContactName nm = curr.detail(QContactName::DefinitionName);
       
   160     if (m_contactId != QContactLocalId(0))
       
   161         m_nameEdit->setText(manager->synthesizedDisplayLabel(curr));
       
   162 
       
   163     // phonenumber
   143     QContactPhoneNumber phn = curr.detail(QContactPhoneNumber::DefinitionName);
   164     QContactPhoneNumber phn = curr.detail(QContactPhoneNumber::DefinitionName);
   144     QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName);
       
   145     QContactAddress adr = curr.detail(QContactAddress::DefinitionName);
       
   146     QContactAvatar av = curr.detail(QContactAvatar::DefinitionName);
       
   147 
       
   148     m_nameEdit->setText(manager->synthesizedDisplayLabel(curr));
       
   149     m_phoneEdit->setText(phn.value(QContactPhoneNumber::FieldNumber));
   165     m_phoneEdit->setText(phn.value(QContactPhoneNumber::FieldNumber));
   150     m_emailEdit->setText(em.value(QContactEmailAddress::FieldEmailAddress));
   166 
   151     m_addrEdit->setText(adr.value(QContactAddress::FieldStreet)); // ugly hack.
   167     // email
   152     
   168     if (defs.contains(QContactEmailAddress::DefinitionName)) {
   153     m_avatarBtn->setText(QString());
   169         QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName);
   154     m_avatarBtn->setIcon(QIcon());
   170         m_emailEdit->setText(em.value(QContactEmailAddress::FieldEmailAddress));
   155     
   171         m_emailEdit->setReadOnly(false);
   156     if (av.pixmap().isNull()) {
   172     } else {
   157         if (av.avatar().isEmpty()) {
   173         m_emailEdit->setText("<not supported>");
   158             m_avatarBtn->setText("Add image");
   174         m_emailEdit->setReadOnly(true);
       
   175     }
       
   176 
       
   177     // address
       
   178     if (defs.contains(QContactAddress::DefinitionName)) {
       
   179         QContactAddress adr = curr.detail(QContactAddress::DefinitionName);
       
   180         m_addrEdit->setText(adr.value(QContactAddress::FieldStreet)); // ugly hack.
       
   181         m_addrEdit->setReadOnly(false);
       
   182     } else {
       
   183         m_addrEdit->setText("<not supported>");
       
   184         m_addrEdit->setReadOnly(true);
       
   185     }
       
   186 
       
   187     // avatar button
       
   188     if (defs.contains(QContactAvatar::DefinitionName)) {
       
   189         QContactAvatar av = curr.detail(QContactAvatar::DefinitionName);
       
   190         QContactThumbnail thumb = curr.detail(QContactThumbnail::DefinitionName);
       
   191         m_avatarBtn->setText(QString());
       
   192         m_avatarBtn->setIcon(QIcon());
       
   193         if (thumb.thumbnail().isNull()) {
       
   194             if (av.imageUrl().isEmpty()) {
       
   195                 m_avatarBtn->setText("Add image");
       
   196             } else {
       
   197                 m_avatarBtn->setIcon(QIcon(QPixmap(av.imageUrl().toLocalFile())));
       
   198                 m_thumbnail = QImage(av.imageUrl().toLocalFile());
       
   199             }
   159         } else {
   200         } else {
   160             m_avatarBtn->setIcon(QIcon(QPixmap(av.avatar())));
   201             m_newAvatarPath = av.imageUrl().toLocalFile();
   161         }
   202             m_thumbnail = thumb.thumbnail();
   162     } else {
   203             m_avatarBtn->setIcon(QIcon(QPixmap::fromImage(thumb.thumbnail())));
   163         m_newAvatarPath = av.avatar();
   204         }
   164         m_avatarBtn->setIcon(QIcon(av.pixmap()));
   205         m_avatarBtn->setDisabled(false);
       
   206     } else {
       
   207         m_avatarBtn->setIcon(QIcon());
       
   208         m_avatarBtn->setText("<not supported>");
       
   209         m_avatarBtn->setDisabled(true);
   165     }
   210     }
   166 }
   211 }
   167 
   212 
   168 QString ContactEditor::nameField()
   213 QString ContactEditor::nameField()
   169 {
   214 {
   185 void ContactEditor::avatarClicked()
   230 void ContactEditor::avatarClicked()
   186 {
   231 {
   187     // put up a file dialog, and update the new avatar path.
   232     // put up a file dialog, and update the new avatar path.
   188     QString fileName = QFileDialog::getOpenFileName(this,
   233     QString fileName = QFileDialog::getOpenFileName(this,
   189        tr("Select Avatar Image"), ".", tr("Image Files (*.png *.jpg *.bmp)"));
   234        tr("Select Avatar Image"), ".", tr("Image Files (*.png *.jpg *.bmp)"));
   190     
   235 
   191     if (!fileName.isEmpty()) {
   236     if (!fileName.isEmpty()) {
   192         m_newAvatarPath = fileName;
   237         m_newAvatarPath = fileName;
       
   238         m_thumbnail = QImage(m_newAvatarPath);
   193         m_avatarBtn->setText(QString());
   239         m_avatarBtn->setText(QString());
   194         m_avatarBtn->setIcon(QIcon(m_newAvatarPath));
   240         m_avatarBtn->setIcon(QIcon(m_newAvatarPath));
   195     }
   241     }
   196 }
   242 }
   197 
   243 
   201         qWarning() << "No manager selected; cannot save.";
   247         qWarning() << "No manager selected; cannot save.";
   202     } else {
   248     } else {
   203         QContact curr;
   249         QContact curr;
   204         if (m_contactId != QContactLocalId(0))
   250         if (m_contactId != QContactLocalId(0))
   205             curr = m_manager->contact(m_contactId);
   251             curr = m_manager->contact(m_contactId);
   206         QContactName nm = curr.detail(QContactName::DefinitionName);
   252 
       
   253         if (m_nameEdit->text().isEmpty()) {
       
   254             QMessageBox::information(this, "Failed!", "You must give a name for the contact!");
       
   255             return;
       
   256         }
       
   257 
       
   258         if (m_nameEdit->text() != m_manager->synthesizedDisplayLabel(curr)) {
       
   259             // if the name has changed (ie, is different to the synthed label) then save it as a custom label.
       
   260             QString saveNameField = nameField();
       
   261             if (!saveNameField.isEmpty()) {
       
   262                 QContactName nm = curr.detail(QContactName::DefinitionName);
       
   263                 nm.setValue(saveNameField, m_nameEdit->text());
       
   264                 curr.saveDetail(&nm);
       
   265             }
       
   266         }
       
   267 
   207         QContactPhoneNumber phn = curr.detail(QContactPhoneNumber::DefinitionName);
   268         QContactPhoneNumber phn = curr.detail(QContactPhoneNumber::DefinitionName);
   208         QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName);
       
   209         QContactAddress adr = curr.detail(QContactAddress::DefinitionName);
       
   210         QContactAvatar av = curr.detail(QContactAvatar::DefinitionName);
       
   211 
       
   212         QString saveNameField = nameField();
       
   213         if (!saveNameField.isEmpty()) {
       
   214             // if the name has changed (ie, is different to the synthed label) then save it as a custom label.
       
   215             if (m_nameEdit->text() != m_manager->synthesizedDisplayLabel(curr)) {
       
   216                 nm.setValue(nameField(), m_nameEdit->text());
       
   217             }
       
   218         }
       
   219         phn.setNumber(m_phoneEdit->text());
   269         phn.setNumber(m_phoneEdit->text());
   220         em.setEmailAddress(m_emailEdit->text());
       
   221         adr.setStreet(m_addrEdit->text());
       
   222         av.setAvatar(m_newAvatarPath);
       
   223 
       
   224         QPixmap pix(m_newAvatarPath);
       
   225         av.setPixmap(pix);
       
   226 
       
   227         curr.saveDetail(&nm);
       
   228         curr.saveDetail(&phn);
   270         curr.saveDetail(&phn);
   229         curr.saveDetail(&em);
   271 
   230         curr.saveDetail(&adr);
   272         if (!m_emailEdit->isReadOnly()) {
   231         curr.saveDetail(&av);
   273             QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName);
       
   274             em.setEmailAddress(m_emailEdit->text());
       
   275             curr.saveDetail(&em);
       
   276         }
       
   277 
       
   278         if (!m_addrEdit->isReadOnly()) {
       
   279             QContactAddress adr = curr.detail(QContactAddress::DefinitionName);
       
   280             adr.setStreet(m_addrEdit->text());
       
   281             curr.saveDetail(&adr);
       
   282         }
       
   283 
       
   284         if (m_avatarBtn->isEnabled()) {
       
   285             QContactAvatar av = curr.detail(QContactAvatar::DefinitionName);
       
   286             av.setImageUrl(QUrl(m_newAvatarPath));
       
   287             curr.saveDetail(&av);
       
   288 
       
   289             QContactThumbnail thumb = curr.detail(QContactThumbnail::DefinitionName);
       
   290             QImage img(m_thumbnail);
       
   291             thumb.setThumbnail(img);
       
   292             curr.saveDetail(&thumb);
       
   293         }
   232 
   294 
   233         bool success = m_manager->saveContact(&curr);
   295         bool success = m_manager->saveContact(&curr);
   234         if (success)
   296         if (!success)
   235             QMessageBox::information(this, "Success!", "Contact saved successfully!");
   297             QMessageBox::information(this, "Failed!", QString("Failed to save contact!\n(error code %1)").arg(m_manager->error()));
   236         else
       
   237             QMessageBox::information(this, "Failed!", "Failed to save contact!");
       
   238     }
   298     }
   239 
   299 
   240     emit showListPage();
   300     emit showListPage();
   241 }
   301 }
   242 
   302