TizenRefApp-8041 Implement Select/Deselect All functionality in the SelectView 64/116664/2
authorSergei Kobec <s.kobec@samsung.com>
Fri, 24 Feb 2017 14:00:22 +0000 (16:00 +0200)
committerSergei Kobec <s.kobec@samsung.com>
Mon, 27 Feb 2017 13:36:42 +0000 (15:36 +0200)
Change-Id: Ia6f91fb6edaac5552aa751f025dcdba361dc33cd
Signed-off-by: Sergei Kobec <s.kobec@samsung.com>
alarm-app/inc/List/AlarmsView.h
alarm-app/src/List/AlarmsView.cpp
lib-apps-common/inc/Ux/MultiSelector.h
lib-apps-common/inc/Ux/SelectView.h
lib-apps-common/src/Ux/MultiSelector.cpp
lib-apps-common/src/Ux/SelectView.cpp

index 42018a1a790775eeaca41136ffb9438c686ac91c..5a00ee1e26c93feedcaf727740be64314dd1ffb9 100644 (file)
@@ -65,7 +65,7 @@ namespace List
                void onAlarmDeleted(AlarmItem *item);
                void onAddPressed();
                void onFormatChanged(system_settings_key_e key);
-               void onItemLongpressed(Evas_Object *genlist, void *genItem);
+               void onItemLongpressed(Evas_Object *genlist, Elm_Object_Item *item);
                bool onSelectFinished();
 
                Evas_Object *m_NoContents;
index 52c5637d7eef63f6064d8deeb921dc08def36d6c..dab13cd612c23c9c2b9f1bf25979a0b50f78d16c 100644 (file)
@@ -143,11 +143,11 @@ Evas_Object *AlarmsView::createContentLayout(Evas_Object *parent)
        m_Genlist = new Ui::Genlist();
        m_Genlist->create(parent);
        eext_circle_object_genlist_add(m_Genlist->getEvasObject(), surface);
-       evas_object_smart_callback_add(m_Genlist->getEvasObject(),
-                       "longpressed", makeCallback(&AlarmsView::onItemLongpressed), this);
+       evas_object_smart_callback_add(m_Genlist->getEvasObject(), "longpressed",
+                       (Evas_Smart_Cb)makeCallback(&AlarmsView::onItemLongpressed), this);
        elm_object_content_set(layout, m_Genlist->getEvasObject());
 
-       m_MultiSelector = new Ux::MultiSelector();
+       m_MultiSelector = new Ux::MultiSelector(this);
        m_MultiSelector->create(layout);
        m_MultiSelector->setStrings({ "WDS_MSG_OPT_SELECT_ALL_ABB", "WDS_MSG_OPT_DESELECT_ALL_ABB" });
        elm_object_part_content_set(layout, "elm.swallow.icon", m_MultiSelector->getEvasObject());
@@ -257,7 +257,7 @@ void AlarmsView::onFormatChanged(system_settings_key_e key)
        m_Genlist->update("elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
 }
 
-void AlarmsView::onItemLongpressed(Evas_Object *genlist, void *genItem)
+void AlarmsView::onItemLongpressed(Evas_Object *genlist, Elm_Object_Item *item)
 {
        if (getSelectMode() == Ux::SelectNone) {
                setSelectMode(Ux::SelectMulti);
@@ -270,7 +270,7 @@ void AlarmsView::onItemLongpressed(Evas_Object *genlist, void *genItem)
 
                        return onSelectFinished();
                });
-               elm_genlist_item_selected_set((Elm_Object_Item *)genItem, EINA_TRUE);
+               elm_genlist_item_selected_set(item, EINA_TRUE);
        }
 }
 
index efb9db2a3fc9d367a47defe787ef2b0bd5f28730..7810b4c62cf40bd82e708bae5f2bc2eb215dd1ac 100644 (file)
@@ -21,6 +21,7 @@
 
 namespace Ux
 {
+       class SelectView;
        class EXPORT_API MultiSelector : public Ui::Control
        {
        public:
@@ -30,7 +31,11 @@ namespace Ux
                        const char *deselectAll;    /**< "Deselect all" item text. */
                };
 
-               MultiSelector();
+               /**
+                * @brief Create selector.
+                * @param[in]   selectView  Select view.
+                */
+               explicit MultiSelector(SelectView *selectView);
 
                /**
                 * @brief Set count of selected items.
@@ -48,6 +53,7 @@ namespace Ux
                void onButtonClicked(Evas_Object *button, void *eventInfo);
 
                Strings m_Strings;
+               SelectView *m_SelectView;
        };
 }
 
index cf6fecee81fc8e6e29fd8d562a2f994c0c07fc4a..220160c0965c945140822719457b8e2a7f9a4216 100644 (file)
@@ -100,6 +100,11 @@ namespace Ux
                 */
                const SelectItems &getSelectItems() const;
 
+               /**
+                * @return Whether all items are selected.
+                */
+               bool isMaxSelected() const;
+
                /**
                 * @brief Set translatable strings for the view.
                 * @remark Should be called before create().
@@ -149,6 +154,12 @@ namespace Ux
                 */
                void setLimitCallback(LimitCallback callback);
 
+               /**
+                * @brief Select/Deselect all items.
+                * @param[in]   isSelected  Whether all items should be selected.
+                */
+               void setAllSelected(bool isSelected);
+
        protected:
                /**
                 * @brief Add selectable item to be managed by the view.
@@ -218,7 +229,6 @@ namespace Ux
 
                size_t getSelectMax() const;
                bool isLimitReached() const;
-               bool isMaxSelected() const;
 
                void updatePageTitle();
                void updatePageButtons();
index 11dc7446d1334075af7713ec4e4eb5d8369c32ee..91fba0eb79a304e8d0e625987a8f044505fddf44 100644 (file)
 #include "Ux/MultiSelector.h"
 #include "Ui/CircleMenu.h"
 #include "Utils/Callback.h"
+#include "Ux/SelectView.h"
 
 #define BUF_SIZE 8
 
 using namespace Ux;
 
-MultiSelector::MultiSelector()
-       : m_Strings { }
+MultiSelector::MultiSelector(SelectView *selectView)
+       : m_Strings { },
+         m_SelectView(selectView)
 {
 }
 
@@ -52,14 +54,22 @@ Evas_Object *MultiSelector::onCreate(Evas_Object *parent)
 
 void MultiSelector::onButtonClicked(Evas_Object *button, void *eventInfo)
 {
+       if (!m_SelectView) {
+               return;
+       }
+
        auto menu = new Ui::CircleMenu();
        menu->create(button);
 
-       menu->addItem(m_Strings.selectAll, [] {
-               //TODO React on select all event
-       });
-       menu->addItem(m_Strings.deselectAll, [] {
-               //TODO React on deselect all event
-       });
+       if (!m_SelectView->isMaxSelected()) {
+               menu->addItem(m_Strings.selectAll, [this] {
+                       m_SelectView->setAllSelected(true);
+               });
+       }
+       if (m_SelectView->getSelectCount() > 0) {
+               menu->addItem(m_Strings.deselectAll, [this] {
+                       m_SelectView->setAllSelected(false);
+               });
+       }
        menu->show();
 }
index ad1783eac417cda99c9598bd6d0cba722f37739f..b619e5c3a258970cf56192a137163217be0b2fea 100644 (file)
@@ -66,6 +66,11 @@ const SelectView::SelectItems &SelectView::getSelectItems() const
        return m_Items;
 }
 
+bool SelectView::isMaxSelected() const
+{
+       return m_VisibleSelectCount == getSelectMax();
+}
+
 void SelectView::setStrings(const Strings &strings)
 {
        m_Strings = strings;
@@ -140,6 +145,21 @@ void SelectView::setLimitCallback(LimitCallback callback)
        m_OnLimitReached = std::move(callback);
 }
 
+void SelectView::setAllSelected(bool isSelected)
+{
+       m_IsMultiChecking = true;
+       for (auto &&item : m_Items) {
+               if (!item->isExcluded() && item->isVisible()) {
+                       if (!item->setChecked(isSelected)) {
+                               break;
+                       }
+               }
+       }
+
+       m_IsMultiChecking = false;
+       updatePageTitle();
+}
+
 void SelectView::addSelectItem(SelectItem *item)
 {
        item->m_SelectView = this;
@@ -196,20 +216,20 @@ void SelectView::onTitleChanged(const char *title)
 
 Evas_Object *SelectView::createDoneButton()
 {
-       if (!getPage()) {
-               return nullptr;
+       if (auto page = getPage()) {
+               return page->addTitleButton(Ui::ButtonRight, m_Strings.buttonDone, nullptr, nullptr);
        }
 
-       return getPage()->addTitleButton(Ui::ButtonRight, m_Strings.buttonDone, nullptr, nullptr);
+       return nullptr;
 }
 
 Evas_Object *SelectView::createCancelButton()
 {
-       if (!getPage()) {
-               return nullptr;
+       if (auto page = getPage()) {
+               return page->addTitleButton(Ui::ButtonLeft, m_Strings.buttonCancel, nullptr, nullptr);
        }
 
-       return getPage()->addTitleButton(Ui::ButtonLeft, m_Strings.buttonCancel, nullptr, nullptr);
+       return nullptr;
 }
 
 size_t SelectView::getSelectMax() const
@@ -226,11 +246,6 @@ bool SelectView::isLimitReached() const
        return m_SelectLimit && m_TotalSelectCount == m_SelectLimit;
 }
 
-bool SelectView::isMaxSelected() const
-{
-       return m_VisibleSelectCount == getSelectMax();
-}
-
 void SelectView::updatePageTitle()
 {
        char buffer[TITLE_BUFFER_SIZE];
@@ -421,17 +436,7 @@ bool SelectView::onSelectAllChecked(bool isChecked)
                return true;
        }
 
-       m_IsMultiChecking = true;
-       for (auto &&item : m_Items) {
-               if (!item->isExcluded() && item->isVisible()) {
-                       if (!item->setChecked(isChecked)) {
-                               break;
-                       }
-               }
-       }
-
-       m_IsMultiChecking = false;
-       updatePageTitle();
+       setAllSelected(isChecked);
        return isChecked == isMaxSelected();
 }