14 * Description: |
14 * Description: |
15 * |
15 * |
16 */ |
16 */ |
17 |
17 |
18 #include "cntgroupmemberview.h" |
18 #include "cntgroupmemberview.h" |
|
19 #include "cntfetchcontactsview.h" |
19 #include "cntcontactcardheadingitem.h" |
20 #include "cntcontactcardheadingitem.h" |
20 #include "cntgroupselectionpopup.h" |
|
21 #include "qtpbkglobal.h" |
21 #include "qtpbkglobal.h" |
22 #include "cntimagelabel.h" |
22 #include "cntimagelabel.h" |
|
23 #include "cntimageutility.h" |
23 #include <hbnotificationdialog.h> |
24 #include <hbnotificationdialog.h> |
|
25 #include <hbmessagebox.h> |
24 #include <hbmenu.h> |
26 #include <hbmenu.h> |
25 #include <hblistview.h> |
27 #include <hblistview.h> |
26 #include <hblistviewitem.h> |
28 #include <hblistviewitem.h> |
27 #include <hbframebackground.h> |
29 #include <hbframebackground.h> |
|
30 #include <hbindexfeedback.h> |
|
31 #include <hbscrollbar.h> |
28 #include <hbview.h> |
32 #include <hbview.h> |
29 #include <hbaction.h> |
33 #include <hbaction.h> |
30 #include <hblabel.h> |
34 #include <hblabel.h> |
|
35 #include <hbparameterlengthlimiter.h> |
31 #include <thumbnailmanager_qt.h> |
36 #include <thumbnailmanager_qt.h> |
32 #include <mobcntmodel.h> |
37 #include <mobcntmodel.h> |
33 #include <hbmainwindow.h> |
38 #include <hbmainwindow.h> |
34 |
39 |
35 |
|
36 #include <QGraphicsLinearLayout> |
|
37 |
|
38 #include <hbdocumentloader.h> |
|
39 #include "cntdocumentloader.h" |
40 #include "cntdocumentloader.h" |
40 |
41 |
41 const char *CNT_GROUPMEMBERVIEW_XML = ":/xml/contacts_groupmembers.docml"; |
42 const char *CNT_GROUPMEMBERVIEW_XML = ":/xml/contacts_groupmembers.docml"; |
42 |
43 |
43 /*! |
44 /*! |
86 SLOT(showContextMenu(HbAbstractViewItem*,QPointF))); |
90 SLOT(showContextMenu(HbAbstractViewItem*,QPointF))); |
87 connect(mListView, SIGNAL(activated (const QModelIndex&)), this, |
91 connect(mListView, SIGNAL(activated (const QModelIndex&)), this, |
88 SLOT(showContactView(const QModelIndex&))); |
92 SLOT(showContactView(const QModelIndex&))); |
89 |
93 |
90 mHeadingItem = static_cast<CntContactCardHeadingItem*>( mDocument->findWidget("editViewHeading") ); |
94 mHeadingItem = static_cast<CntContactCardHeadingItem*>( mDocument->findWidget("editViewHeading") ); |
|
95 connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawImageMenu(const QPointF&))); |
91 |
96 |
92 // menu actions |
97 // menu actions |
93 mEditGroupAction = static_cast<HbAction*>( mDocument->findObject("cnt:editgroupdetails")); |
98 mEditGroupAction = static_cast<HbAction*>( mDocument->findObject("cnt:editgroupdetails")); |
94 connect(mEditGroupAction, SIGNAL(triggered()), this, SLOT(editGroup())); |
99 connect(mEditGroupAction, SIGNAL(triggered()), this, SLOT(editGroup())); |
95 |
100 |
103 |
108 |
104 // thumbnail manager |
109 // thumbnail manager |
105 mThumbnailManager = new ThumbnailManager(this); |
110 mThumbnailManager = new ThumbnailManager(this); |
106 mThumbnailManager->setMode(ThumbnailManager::Default); |
111 mThumbnailManager->setMode(ThumbnailManager::Default); |
107 mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); |
112 mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); |
108 mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailMedium); |
113 mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailLarge); |
109 |
114 |
110 connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), |
115 connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), |
111 this, SLOT(thumbnailReady(QPixmap, void*, int, int))); |
116 this, SLOT(thumbnailReady(QPixmap, void*, int, int))); |
112 } |
117 } |
113 |
118 |
164 QList<QContactAvatar> details = mGroupContact->details<QContactAvatar>(); |
180 QList<QContactAvatar> details = mGroupContact->details<QContactAvatar>(); |
165 for (int i = 0;i < details.count();i++) |
181 for (int i = 0;i < details.count();i++) |
166 { |
182 { |
167 if (details.at(i).imageUrl().isValid()) |
183 if (details.at(i).imageUrl().isValid()) |
168 { |
184 { |
169 mThumbnailManager->getThumbnail(details.at(i).imageUrl().toString()); |
185 mAvatar = new QContactAvatar(details.at(i)); |
|
186 mThumbnailManager->getThumbnail(mAvatar->imageUrl().toString()); |
170 break; |
187 break; |
171 } |
188 } |
172 } |
189 } |
173 |
190 |
174 // create list & model |
191 // create list & model |
175 mListView->setFrictionEnabled(true); |
192 mListView->setFrictionEnabled(true); |
176 mListView->setScrollingStyle(HbScrollArea::PanOrFlick); |
193 mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); |
|
194 mListView->verticalScrollBar()->setInteractive(true); |
177 mListView->setUniformItemSizes(true); |
195 mListView->setUniformItemSizes(true); |
178 mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); |
196 mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); |
|
197 HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView); |
|
198 indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); |
|
199 indexFeedback->setItemView(mListView); |
179 |
200 |
180 HbFrameBackground frame; |
201 HbFrameBackground frame; |
181 frame.setFrameGraphicsName("qtg_fr_list_normal"); |
202 frame.setFrameGraphicsName("qtg_fr_list_normal"); |
182 frame.setFrameType(HbFrameDrawer::NinePieces); |
203 frame.setFrameType(HbFrameDrawer::NinePieces); |
183 mListView->itemPrototypes().first()->setDefaultFrame(frame); |
204 mListView->itemPrototypes().first()->setDefaultFrame(frame); |
199 |
220 |
200 QList<QContactSortOrder> sortOrders; |
221 QList<QContactSortOrder> sortOrders; |
201 sortOrders.append(sortOrderFirstName); |
222 sortOrders.append(sortOrderFirstName); |
202 sortOrders.append(sortOrderLastName); |
223 sortOrders.append(sortOrderLastName); |
203 |
224 |
204 mModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), rFilter, sortOrders, false); |
225 mModel = new MobCntModel(getContactManager(), rFilter, sortOrders, false); |
205 mListView->setModel(mModel); |
226 mListView->setModel(mModel); |
206 |
227 |
207 if (aArgs.value(ESelectedAction).toString() == "save") |
228 if (aArgs.value(ESelectedAction).toString() == "save") |
208 { |
229 { |
209 QString name = mViewManager->contactManager(SYMBIAN_BACKEND)->synthesizedDisplayLabel(*mGroupContact); |
230 QString name = getContactManager()->synthesizedDisplayLabel(*mGroupContact); |
210 HbNotificationDialog::launchDialog(hbTrId("Group \"%1\" saved").arg(name)); |
231 HbNotificationDialog::launchDialog(hbTrId("Group \"%1\" saved").arg(name)); |
211 } |
232 } |
|
233 |
|
234 mFetchView = new CntFetchContacts(mViewManager->contactManager( SYMBIAN_BACKEND )); |
|
235 connect(mFetchView, SIGNAL(clicked()), this, SLOT(handleManageMembers())); |
212 } |
236 } |
213 |
237 |
214 void CntGroupMemberView::deactivate() |
238 void CntGroupMemberView::deactivate() |
215 { |
239 { |
216 |
240 |
217 } |
241 } |
218 |
242 |
219 void CntGroupMemberView::showPreviousView() |
243 void CntGroupMemberView::showPreviousView() |
220 { |
244 { |
|
245 //save an avatar |
|
246 if (mIsPreviousImageEditorView) |
|
247 { |
|
248 if (!mAvatar->imageUrl().isEmpty()) |
|
249 { |
|
250 mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact); |
|
251 } |
|
252 } |
|
253 |
221 CntViewParameters viewParameters; |
254 CntViewParameters viewParameters; |
222 mViewManager->back(viewParameters); |
255 mViewManager->back(viewParameters); |
223 } |
256 } |
224 |
257 |
225 void CntGroupMemberView::openGroupActions() |
258 void CntGroupMemberView::openGroupActions() |
232 mViewManager->changeView(viewParameters); |
265 mViewManager->changeView(viewParameters); |
233 } |
266 } |
234 |
267 |
235 void CntGroupMemberView::manageMembers() |
268 void CntGroupMemberView::manageMembers() |
236 { |
269 { |
237 // save the group here |
270 QContactRelationshipFilter membersFilter; |
238 CntGroupSelectionPopup *groupSelectionPopup = |
271 membersFilter.setRelationshipType(QContactRelationship::HasMember); |
239 new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), mGroupContact); |
272 membersFilter.setRelatedContactRole(QContactRelationshipFilter::First); |
240 mListView->setModel(0); |
273 membersFilter.setRelatedContactId(mGroupContact->id()); |
241 groupSelectionPopup->populateListOfContact(); |
274 mOriginalGroupMembers = getContactManager()->contactIds(membersFilter); |
242 |
275 |
243 HbAction* action = groupSelectionPopup->exec(); |
276 QSet<QContactLocalId> contactsSet = mOriginalGroupMembers.toSet(); |
244 if (action == groupSelectionPopup->primaryAction()) |
277 QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); |
245 { |
278 QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); |
246 groupSelectionPopup->saveOldGroup(); |
279 mFetchView->setDetails(HbParameterLengthLimiter(hbTrId("txt_phob_subtitle_1_group")).arg(groupName), |
247 } |
280 hbTrId("Save")); |
248 delete groupSelectionPopup; |
281 mFetchView->displayContacts(CntFetchContacts::popup, |
249 mListView->setModel(mModel); |
282 HbAbstractItemView::MultiSelection, |
|
283 contactsSet); |
|
284 } |
|
285 |
|
286 void CntGroupMemberView::handleManageMembers() |
|
287 { |
|
288 QSet<QContactLocalId> selectedContacts = mFetchView->getSelectedContacts(); |
|
289 |
|
290 if (mFetchView->wasCanceled()) { |
|
291 delete mFetchView; |
|
292 mFetchView = 0; |
|
293 return; |
|
294 } |
|
295 |
|
296 QList<QContactRelationship> removedMemberships; |
|
297 QList<QContactRelationship> addedMemberships; |
|
298 |
|
299 QSet<QContactLocalId> removedMembers = mOriginalGroupMembers.toSet() - selectedContacts; |
|
300 |
|
301 // TODO Notice the duplication with these loops. Refactor to use one only |
|
302 foreach (QContactLocalId id, removedMembers) { |
|
303 QContact contact = getContactManager()->contact(id); |
|
304 |
|
305 // new contact added to the group |
|
306 QContactRelationship membership; |
|
307 membership.setRelationshipType(QContactRelationship::HasMember); |
|
308 membership.setFirst(mGroupContact->id()); |
|
309 membership.setSecond(contact.id()); |
|
310 removedMemberships.append(membership); |
|
311 } |
|
312 |
|
313 QSet<QContactLocalId> addedMembers = selectedContacts - mOriginalGroupMembers.toSet(); |
|
314 foreach (QContactLocalId id, addedMembers) { |
|
315 QContact contact = getContactManager()->contact(id); |
|
316 |
|
317 // new contact added to the group |
|
318 QContactRelationship membership; |
|
319 membership.setRelationshipType(QContactRelationship::HasMember); |
|
320 membership.setFirst(mGroupContact->id()); |
|
321 membership.setSecond(contact.id()); |
|
322 addedMemberships.append(membership); |
|
323 } |
|
324 |
|
325 if (!addedMemberships.isEmpty()) { |
|
326 getContactManager()->saveRelationships(&addedMemberships); |
|
327 } |
|
328 |
|
329 if (!removedMemberships.isEmpty()) { |
|
330 getContactManager()->removeRelationships(removedMemberships); |
|
331 } |
250 } |
332 } |
251 |
333 |
252 void CntGroupMemberView::editGroup() |
334 void CntGroupMemberView::editGroup() |
253 { |
335 { |
254 CntViewParameters viewParameters; |
336 CntViewParameters viewParameters; |
259 mViewManager->changeView(viewParameters); |
341 mViewManager->changeView(viewParameters); |
260 } |
342 } |
261 |
343 |
262 void CntGroupMemberView::deleteGroup() |
344 void CntGroupMemberView::deleteGroup() |
263 { |
345 { |
264 // the delete command |
346 QString groupName = mGroupContact->displayLabel(); |
265 HbDialog popup; |
347 HbLabel *headingLabel = new HbLabel(); |
266 |
348 headingLabel->setPlainText(HbParameterLengthLimiter(hbTrId("txt_phob_dialog_delete_1_group")).arg(groupName)); |
267 // disable dismissing & timout |
349 |
268 popup.setDismissPolicy(HbDialog::NoDismiss); |
350 HbMessageBox::question(hbTrId("txt_phob_dialog_only_group_will_be_removed_contac"), this, SLOT(handleDeleteGroup(HbAction*)), |
269 popup.setTimeout(HbDialog::NoTimeout); |
351 hbTrId("txt_phob_button_delete"), hbTrId("txt_common_button_cancel"), headingLabel); |
270 |
352 } |
271 QString groupName = mGroupContact->displayLabel(); |
353 |
272 HbLabel *headingLabel = new HbLabel(hbTrId("Delete %1 group?").arg(groupName), &popup); |
354 void CntGroupMemberView::handleDeleteGroup(HbAction *action) |
273 headingLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); |
355 { |
274 popup.setHeadingWidget(headingLabel); |
356 HbDialog *popup = static_cast<HbDialog*>(sender()); |
275 |
357 |
276 // Set a label widget as content widget in the dialog |
358 if (popup && action == popup->actions().first()) |
277 HbLabel *label = new HbLabel(&popup); |
359 { |
278 label->setPlainText("Only group will be removed, contacts can be found from All contacts list"); |
360 getContactManager()->removeContact(mGroupContact->localId()); |
279 label->setTextWrapping(Hb::TextWordWrap); |
361 showPreviousView(); |
280 label->setElideMode(Qt::ElideNone); |
362 } |
281 label->setFontSpec(HbFontSpec(HbFontSpec::Secondary)); |
|
282 popup.setContentWidget(label); |
|
283 |
|
284 // Sets the primary action and secondary action |
|
285 popup.setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"),&popup)); |
|
286 popup.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"),&popup)); |
|
287 |
|
288 HbAction* action = popup.exec(); |
|
289 if (action == popup.primaryAction()) |
|
290 { |
|
291 mViewManager->contactManager(SYMBIAN_BACKEND)->removeContact(mGroupContact->localId()); |
|
292 showPreviousView(); |
|
293 } |
|
294 } |
363 } |
295 |
364 |
296 /*! |
365 /*! |
297 Called when a list item is longpressed |
366 Called when a list item is longpressed |
298 */ |
367 */ |
299 void CntGroupMemberView::showContextMenu(HbAbstractViewItem *aItem, const QPointF &aCoords) |
368 void CntGroupMemberView::showContextMenu(HbAbstractViewItem *aItem, const QPointF &aCoords) |
300 { |
369 { |
|
370 QVariant data( aItem->modelIndex().row() ); |
|
371 |
301 QModelIndex index = aItem->modelIndex(); |
372 QModelIndex index = aItem->modelIndex(); |
302 |
373 |
303 HbMenu *menu = new HbMenu(); |
374 HbMenu *menu = new HbMenu(); |
|
375 menu->setAttribute(Qt::WA_DeleteOnClose); |
|
376 menu->setPreferredPos( aCoords ); |
|
377 |
304 HbAction *removeFromGroupAction = 0; |
378 HbAction *removeFromGroupAction = 0; |
305 HbAction *openContactAction = 0; |
379 HbAction *openContactAction = 0; |
306 HbAction *editContactAction = 0; |
380 HbAction *editContactAction = 0; |
307 |
381 |
308 openContactAction = menu->addAction(hbTrId("txt_common_menu_open")); |
382 openContactAction = menu->addAction(hbTrId("txt_common_menu_open")); |
309 editContactAction = menu->addAction(hbTrId("txt_common_menu_edit")); |
383 editContactAction = menu->addAction(hbTrId("txt_common_menu_edit")); |
310 removeFromGroupAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_group")); |
384 removeFromGroupAction = menu->addAction(hbTrId("txt_phob_menu_remove_from_group")); |
311 |
385 |
312 |
386 openContactAction->setData( data ); |
313 HbAction *selectedAction = menu->exec(aCoords); |
387 editContactAction->setData( data ); |
314 |
388 removeFromGroupAction->setData( data ); |
315 if (selectedAction) |
389 |
316 { |
390 menu->open(this, SLOT(handleMenu(HbAction*))); |
317 if (selectedAction == removeFromGroupAction) |
391 } |
|
392 |
|
393 void CntGroupMemberView::handleMenu(HbAction* action) |
|
394 { |
|
395 int row = action->data().toInt(); |
|
396 HbMenu *menuItem = static_cast<HbMenu*>(sender()); |
|
397 QModelIndex index = mModel->index(row, 0); |
|
398 |
|
399 int id = index.data(Qt::UserRole).toInt(); |
|
400 |
|
401 if ( action == menuItem->actions().first() ) |
318 { |
402 { |
319 removeFromGroup(index); |
403 showContactView(index); |
320 } |
404 } |
321 else if (selectedAction == editContactAction) |
405 else if (action == menuItem->actions().at(1)) |
322 { |
406 { |
323 editContact(index); |
407 editContact(index); |
324 } |
408 } |
325 else if (selectedAction == openContactAction) |
409 else if (action == menuItem->actions().at(2)) |
326 { |
410 { |
327 showContactView(index); |
411 removeFromGroup(index); |
328 } |
412 } |
329 } |
413 } |
330 menu->deleteLater(); |
414 |
331 } |
|
332 |
415 |
333 /*! |
416 /*! |
334 Called after user clicked on the listview. |
417 Called after user clicked on the listview. |
335 */ |
418 */ |
336 void CntGroupMemberView::showContactView(const QModelIndex &index) |
419 void CntGroupMemberView::showContactView(const QModelIndex &index) |
395 viewParameters.insert(EViewId, imageEditorView ); |
478 viewParameters.insert(EViewId, imageEditorView ); |
396 |
479 |
397 mViewManager->changeView( viewParameters ); |
480 mViewManager->changeView( viewParameters ); |
398 } |
481 } |
399 |
482 |
|
483 QContactManager* CntGroupMemberView::getContactManager() |
|
484 { |
|
485 if (!mViewManager) return NULL; |
|
486 |
|
487 return mViewManager->contactManager(SYMBIAN_BACKEND); |
|
488 } |
|
489 |
|
490 /*! |
|
491 Draw the image specific content menu |
|
492 */ |
|
493 void CntGroupMemberView::drawImageMenu(const QPointF &aCoords) |
|
494 { |
|
495 HbMenu *menu = new HbMenu(); |
|
496 HbAction *changeImageAction = menu->addAction(hbTrId("txt_phob_menu_change_picture")); |
|
497 HbAction *removeAction = menu->addAction(hbTrId("txt_phob_menu_remove_image")); |
|
498 menu->setPreferredPos(aCoords); |
|
499 menu->open(this, SLOT(handleImageMenu(HbAction*))); |
|
500 } |
|
501 |
|
502 void CntGroupMemberView::handleImageMenu(HbAction* action) |
|
503 { |
|
504 HbMenu *menuItem = static_cast<HbMenu*>(sender()); |
|
505 if ( action == menuItem->actions().first() ) { |
|
506 changeImage(); |
|
507 } |
|
508 else if (action == menuItem->actions().at(1)) { |
|
509 removeImage(); |
|
510 } |
|
511 } |
|
512 |
|
513 void CntGroupMemberView::changeImage() |
|
514 { |
|
515 CntViewParameters viewParameters; |
|
516 viewParameters.insert(EViewId, imageEditorView); |
|
517 QVariant var; |
|
518 var.setValue(*mGroupContact); |
|
519 viewParameters.insert(ESelectedContact, var); |
|
520 mViewManager->changeView(viewParameters); |
|
521 } |
|
522 |
|
523 void CntGroupMemberView::removeImage() |
|
524 { |
|
525 if (mAvatar) |
|
526 { |
|
527 if (!mAvatar->imageUrl().isEmpty()) |
|
528 { |
|
529 mGroupContact->removeDetail(mAvatar); |
|
530 // Check if image removable. |
|
531 CntImageUtility imageUtility; |
|
532 if(imageUtility.isImageRemovable(mAvatar->imageUrl().toString())) |
|
533 { |
|
534 imageUtility.removeImage(mAvatar->imageUrl().toString()); |
|
535 } |
|
536 mViewManager->contactManager( SYMBIAN_BACKEND )->saveContact(mGroupContact); |
|
537 mHeadingItem->setIcon(HbIcon("qtg_large_avatar")); |
|
538 |
|
539 } |
|
540 } |
|
541 } |
|
542 |
400 |
543 |
401 |
544 |
402 // end of file |
545 // end of file |