Implemented contact pick limit for view ModeMultiPick mode 97/58797/5
authorSergei Kobec <s.kobec@samsung.com>
Fri, 5 Feb 2016 08:44:55 +0000 (10:44 +0200)
committerSergei Kobec <s.kobec@samsung.com>
Fri, 5 Feb 2016 08:44:55 +0000 (10:44 +0200)
Change-Id: Ie700734f1ba4467741c941037d4eea2aba4ce68c
Signed-off-by: Sergei Kobec <s.kobec@samsung.com>
lib-contact/inc/Contacts/List/ListView.h
lib-contact/src/Contacts/List/ListView.cpp

index f29f703452ce5b296dd23ed9660308114f5e29b3..6ddf690659c69d38d4751bd85c62838c376f10f5 100644 (file)
@@ -51,8 +51,9 @@ namespace Contacts
                        enum Mode
                        {
                                ModeDefault,
-                               ModeSinglePick,
-                               ModeMultiPick,
+                               ModeSingleSelect,
+                               ModeMultiSelect,
+                               ModeMultiSelectWithLimit,
                                ModeMax
                        };
 
@@ -83,6 +84,13 @@ namespace Contacts
                         */
                        void setMode(Mode mode);
 
+                       /**
+                        * @brief Set item selection limit
+                        * @remark Used only in ModeMultiSelectWithLimit view mode
+                        * @param[in]   count   Maximal selectable items count
+                        */
+                       void setSelectLimit(size_t count);
+
                        /**
                         * @brief Set view result callback
                         * @remark Used in Singlepick/Multipick view modes
@@ -129,10 +137,10 @@ namespace Contacts
                        Ui::GenlistItem *getNextSectionItem(SectionId currentSection);
                        bool getSectionVisibility(Mode mode, SectionId sectionId);
 
-                       PersonItem::Mode getItemMode(Mode viewMode);
+                       PersonItem::Mode getItemMode();
 
                        void updateTitle();
-                       void updateSelectAll();
+                       void updateSelectAllState();
                        void updatePageMode();
                        void updateSectionsMode();
 
@@ -195,7 +203,8 @@ namespace Contacts
                        Mode m_Mode;
 
                        size_t m_PersonCount;
-                       size_t m_CheckedCount;
+                       size_t m_SelectCount;
+                       size_t m_SelectLimit;
 
                        ResultCallback m_OnResult;
                };
index ff2644f65344c6b949c278a6b045e3c6ad9ebbeb..ec21da9440bbfc46cad146da1a13cfa22488ed9a 100644 (file)
@@ -48,7 +48,7 @@ ListView::ListView(PersonProvider::FilterType personFilter)
          m_Sections{ nullptr },
          m_Provider(PersonProvider(personFilter)),
          m_Mode(ModeDefault),
-         m_PersonCount(0), m_CheckedCount(0)
+         m_PersonCount(0), m_SelectCount(0), m_SelectLimit(0)
 {
 }
 
@@ -69,6 +69,11 @@ void ListView::setMode(Mode mode)
        }
 }
 
+void ListView::setSelectLimit(size_t count)
+{
+       m_SelectLimit = count;
+}
+
 void ListView::setResultCallback(ResultCallback callback)
 {
        m_OnResult = std::move(callback);
@@ -113,7 +118,7 @@ void ListView::onMenuPressed()
        menu->addItem("IDS_LOGS_OPT_DELETE", [this] {
                ListView *deleteView = new ListView();
                getNavigator()->navigateTo(deleteView);
-               deleteView->setMode(ModeMultiPick);
+               deleteView->setMode(ModeMultiSelect);
                deleteView->setResultCallback([](PersonIds ids) {
                        contacts_db_delete_records(_contacts_person._uri, ids.data(), ids.size());
 
@@ -163,7 +168,7 @@ void ListView::fillFavorites()
        if (!m_Sections[SectionFavorites]) {
                //Todo Create here Favorite group
        } else {
-               setFavouriteItemsMode(getItemMode(m_Mode));
+               setFavouriteItemsMode(getItemMode());
        }
 }
 
@@ -190,7 +195,7 @@ void ListView::fillPersonList()
                        ++m_PersonCount;
                }
        } else {
-               setPersonItemsMode(getItemMode(m_Mode));
+               setPersonItemsMode(getItemMode());
        }
 }
 
@@ -254,7 +259,7 @@ bool ListView::getSectionVisibility(Mode mode, SectionId sectionId)
                        /* SectionMfc       = */ true,
                        /* SectionPerson    = */ true
                },
-               /* ModeSinglePick = */ {
+               /* ModeSingleSelect = */ {
                        /* SectionSearch    = */ true,
                        /* SectionSelectAll = */ false,
                        /* SectionMyProfile = */ true,
@@ -262,25 +267,35 @@ bool ListView::getSectionVisibility(Mode mode, SectionId sectionId)
                        /* SectionMfc       = */ false,
                        /* SectionPerson    = */ true
                },
-               /* ModeMultiPick  = */ {
+               /* ModeMultiSelect  = */ {
                        /* SectionSearch    = */ true,
                        /* SectionSelectAll = */ true,
                        /* SectionMyProfile = */ false,
                        /* SectionFavorites = */ true,
                        /* SectionMfc       = */ false,
                        /* SectionPerson    = */ true
+               },
+               /* ModeMultiSelectWithLimit  = */ {
+                       /* SectionSearch    = */ true,
+                       /* SectionSelectAll = */ false,
+                       /* SectionMyProfile = */ false,
+                       /* SectionFavorites = */ true,
+                       /* SectionMfc       = */ false,
+                       /* SectionPerson    = */ true
                }
        };
 
        return sectionVisibility[mode][sectionId];
 }
 
-PersonItem::Mode ListView::getItemMode(Mode viewMode)
+PersonItem::Mode ListView::getItemMode()
 {
-       if (viewMode == ModeMultiPick) {
-               return PersonItem::ModePick;
-       } else {
-               return PersonItem::ModeDefault;
+       switch (m_Mode) {
+               case ModeMultiSelect:
+               case ModeMultiSelectWithLimit:
+                       return PersonItem::ModePick;
+               default:
+                       return PersonItem::ModeDefault;
        }
 }
 
@@ -290,13 +305,20 @@ void ListView::updateTitle()
                case ModeDefault:
                        getPage()->setTitle("IDS_PB_TAB_CONTACTS");
                        break;
-               case ModeSinglePick:
+               case ModeSingleSelect:
                        getPage()->setTitle("IDS_PB_HEADER_SELECT_CONTACT_ABB2");
                        break;
-               case ModeMultiPick:
+               case ModeMultiSelect:
+               {
+                       char title[TITLE_SIZE];
+                       snprintf(title, TITLE_SIZE, _("IDS_PB_HEADER_PD_SELECTED_ABB"), m_SelectCount);
+                       getPage()->setTitle(title);
+                       break;
+               }
+               case ModeMultiSelectWithLimit:
                {
                        char title[TITLE_SIZE];
-                       snprintf(title, TITLE_SIZE, _("IDS_PB_HEADER_PD_SELECTED_ABB"), m_CheckedCount);
+                       snprintf(title, TITLE_SIZE, "%zu/%zu", m_SelectCount, m_SelectLimit);
                        getPage()->setTitle(title);
                        break;
                }
@@ -305,10 +327,12 @@ void ListView::updateTitle()
        }
 }
 
-void ListView::updateSelectAll()
+void ListView::updateSelectAllState()
 {
        auto selectAllItem = static_cast<SelectAllItem *>(m_Sections[SectionSelectAll]);
-       selectAllItem->setChecked(m_CheckedCount == m_PersonCount);
+       if (selectAllItem) {
+               selectAllItem->setChecked(m_SelectCount == m_PersonCount);
+       }
 }
 
 void ListView::updatePageMode()
@@ -321,12 +345,13 @@ void ListView::updatePageMode()
                        deleteDoneButton();
                        createNewContactButton();
                        break;
-               case ModeSinglePick:
+               case ModeSingleSelect:
                        deleteCancelButton();
                        deleteDoneButton();
                        deleteNewContactButton();
                        break;
-               case ModeMultiPick:
+               case ModeMultiSelect:
+               case ModeMultiSelectWithLimit:
                        createCancelButton();
                        createDoneButton();
                        deleteNewContactButton();
@@ -495,7 +520,7 @@ PersonItem *ListView::createPersonItem(PersonPtr person)
 {
        using namespace std::placeholders;
 
-       PersonItem *item = new PersonItem(std::move(person), getItemMode(m_Mode));
+       PersonItem *item = new PersonItem(std::move(person), getItemMode());
 
        m_Provider.setChangeCallback(item->getPerson(),
                        std::bind(&ListView::onPersonChanged, this, _1, _2, item));
@@ -623,7 +648,7 @@ void ListView::onPersonItemInserted(PersonItem *item)
 {
        ++m_PersonCount;
 
-       updateSelectAll();
+       updateSelectAllState();
        updateTitle();
 }
 
@@ -631,10 +656,10 @@ void ListView::onPersonItemDelete(PersonItem *item)
 {
        --m_PersonCount;
        if (item->isChecked()) {
-               --m_CheckedCount;
+               --m_SelectCount;
        }
 
-       updateSelectAll();
+       updateSelectAllState();
        updateTitle();
 }
 
@@ -672,16 +697,21 @@ void ListView::onSelectAllChecked()
                }
        }
 
-       m_CheckedCount = checked ? m_PersonCount : 0;
+       m_SelectCount = checked ? m_PersonCount : 0;
        updateTitle();
 }
 
 void ListView::onItemChecked(PersonItem *item)
 {
-       size_t checkCount = item->isChecked() ? ++m_CheckedCount : m_CheckedCount--;
+       if (m_Mode == ModeMultiSelectWithLimit && m_SelectCount == m_SelectLimit && item->isChecked()) {
+               item->setChecked(false);
+               return;
+       }
+
+       size_t checkCount = item->isChecked() ? ++m_SelectCount : m_SelectCount--;
 
        if (checkCount == m_PersonCount) {
-               updateSelectAll();
+               updateSelectAllState();
        }
 
        updateTitle();
@@ -690,9 +720,10 @@ void ListView::onItemChecked(PersonItem *item)
 void ListView::onItemSelected(PersonItem *item)
 {
        switch (m_Mode) {
-               case ModeDefault:    launchPersonDetail(item); break;
-               case ModeSinglePick: onPersonSelected(item->getPerson()); break;
-               case ModeMultiPick:  onItemChecked(item); break;
+               case ModeDefault:           launchPersonDetail(item); break;
+               case ModeSingleSelect:        onPersonSelected(item->getPerson()); break;
+               case ModeMultiSelect:
+               case ModeMultiSelectWithLimit:  onItemChecked(item); break;
                default: break;
        }
 }