TizenRefApp-7990 Integrate Select View with AlarmsView 66/116266/3
authorSergei Kobec <s.kobec@samsung.com>
Thu, 23 Feb 2017 12:12:47 +0000 (14:12 +0200)
committerSergei Kobec <s.kobec@samsung.com>
Mon, 27 Feb 2017 12:24:00 +0000 (14:24 +0200)
Change-Id: I9d5152e8b6ee47497b5f1ae4ae86dbc345b6f2c9
Signed-off-by: Sergei Kobec <s.kobec@samsung.com>
12 files changed:
alarm-app/inc/List/AddAlarmItem.h
alarm-app/inc/List/AlarmsView.h
alarm-app/inc/List/TitleItem.h
alarm-app/src/List/AddAlarmItem.cpp
alarm-app/src/List/AlarmItem.cpp
alarm-app/src/List/AlarmsView.cpp
alarm-app/src/List/TitleItem.cpp
lib-apps-common/inc/Ui/CheckItem.h
lib-apps-common/inc/Ux/SelectView.h
lib-apps-common/src/Ui/CheckItem.cpp
lib-apps-common/src/Ux/MultiSelector.cpp
lib-apps-common/src/Ux/SelectView.cpp

index aef29a54f09892878ef60dc161c51fc6dda0b07f..9b9dceddbc931c2df2e6c14b0acf237d6107b349 100644 (file)
@@ -23,9 +23,20 @@ namespace List
 {
        class AddAlarmItem: public Ui::GenItem
        {
+       public:
+               AddAlarmItem();
+
+               /**
+                * @brief Set button visibility.
+                * @param[in]   isVisible   Determine whether button should be visible or not.
+                */
+               void setButtonVisibility(bool isVisible);
+
        private:
                virtual Elm_Gen_Item_Class *getItemClass() const override;
                virtual Evas_Object *getContent(Evas_Object *parent, const char *part) override;
+
+               bool m_IsVisible;
        };
 }
 
index 2f9aedd312cb636569fe85be257fa68891e2311a..42018a1a790775eeaca41136ffb9438c686ac91c 100644 (file)
@@ -26,9 +26,16 @@ namespace Ui
        class Genlist;
 }
 
+namespace Ux
+{
+       class MultiSelector;
+}
+
 namespace List
 {
        class AlarmItem;
+       class TitleItem;
+       class AddAlarmItem;
        class AlarmsView: public Ux::SelectView
        {
        public:
@@ -40,9 +47,12 @@ namespace List
                virtual void onCreated() override;
                virtual void onPageAttached(Ui::NavigatorPage *page) override;
                virtual void onNavigation(bool isCurrent) override;
+               virtual void onSelectModeChanged(Ux::SelectMode selectMode) override;
+               virtual void onSelectCountChanged(size_t selectCount) override;
+               virtual Evas_Object *createDoneButton() override;
                void onUpdateFinished();
 
-               Ui::Genlist *createGenlist(Evas_Object *parent);
+               Evas_Object *createContentLayout(Evas_Object *parent);
                Evas_Object *createNoContents(Evas_Object *parent);
                Evas_Object *createAddButton(Evas_Object *parent);
                void updateEmptyState();
@@ -55,11 +65,15 @@ namespace List
                void onAlarmDeleted(AlarmItem *item);
                void onAddPressed();
                void onFormatChanged(system_settings_key_e key);
+               void onItemLongpressed(Evas_Object *genlist, void *genItem);
+               bool onSelectFinished();
 
                Evas_Object *m_NoContents;
+               Evas_Object *m_ContentLayout;
                Ui::Genlist *m_Genlist;
-               Ui::GenItem *m_TitleItem;
-               Ui::GenItem *m_AddAlarmItem;
+               TitleItem *m_TitleItem;
+               AddAlarmItem *m_AddAlarmItem;
+               Ux::MultiSelector *m_MultiSelector;
                Common::Model::AlarmProvider m_Provider;
        };
 }
index 0bd8df0adc24cdd4b1093db7872983efcfd86bee..fe61eba65872c2dfbb2cb0ae68be8f7be74f48f4 100644 (file)
@@ -23,6 +23,15 @@ namespace List
 {
        class TitleItem: public Ui::GenItem
        {
+       public:
+               TitleItem();
+
+               /**
+                * @brief Set item text visibility.
+                * @param[in]   isVisible   Determines whether title text should be visible or not.
+                */
+               void setTitleVisibility(bool isVisible);
+
        protected:
                /**
                 * @see GenItem::getItemClass()
@@ -33,6 +42,8 @@ namespace List
                 * @see GenItem::getText()
                 */
                virtual char *getText(Evas_Object *parent, const char *part) override;
+
+               bool m_IsTitleVisible;
        };
 }
 
index cbf75395990444a9727e6dc79533a96a6bd3fbae..61fd117b826d9059d9ad50cd14af6ea9159713be 100644 (file)
 
 using namespace List;
 
+AddAlarmItem::AddAlarmItem()
+       : m_IsVisible(true)
+{
+}
+
+void AddAlarmItem::setButtonVisibility(bool isVisible)
+{
+       if (m_IsVisible != isVisible) {
+               m_IsVisible = isVisible;
+               elm_genlist_item_update(getObjectItem());
+       }
+}
+
 Elm_Gen_Item_Class *AddAlarmItem::getItemClass() const
 {
        static Elm_Gen_Item_Class itc = createItemClass(STYLE_ITEM_BOTTOM_BUTTON);
@@ -27,6 +40,10 @@ Elm_Gen_Item_Class *AddAlarmItem::getItemClass() const
 
 Evas_Object *AddAlarmItem::getContent(Evas_Object *parent, const char *part)
 {
+       if (!m_IsVisible) {
+               return nullptr;
+       }
+
        Evas_Object *button = elm_button_add(parent);
        elm_object_style_set(button, "bottom");
        elm_object_translatable_text_set(button, "WDS_ALM_ACBUTTON_ADD");
index c0fab2bc3c0c6fab55e4e7741374b0e81173afca..6c0387fa680b055dfa465e3d2806835f38fb253d 100644 (file)
@@ -105,7 +105,9 @@ Evas_Object *AlarmItem::getContent(Evas_Object *parent, const char *part)
 
                return check;
        } else if (strcmp(part, "elm.swallow.center_check") == 0) {
-               SelectItem::getContent(parent, part);
+               Evas_Object *check = SelectItem::getContent(parent, part);
+               elm_object_style_set(check, "genlist/select_mode");
+               return check;
        }
 
        return nullptr;
index 048ae0ef30f7eee8e8139aea4fb845303a4a62c4..52c5637d7eef63f6064d8deeb921dc08def36d6c 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "Common/Model/Alarm.h"
+#include "Common/Model/AlarmConsumer.h"
 #include "List/AddAlarmItem.h"
 #include "List/AlarmItem.h"
 #include "List/AlarmsView.h"
 
 #include "App/Path.h"
 #include "System/Settings.h"
+#include "Ui/CircleMenu.h"
 #include "Ui/Genlist.h"
 #include "Ui/GenGroupItem.h"
 #include "Ui/Toast.h"
 #include "Ui/Window.h"
 #include "Utils/Callback.h"
+#include "Utils/Logger.h"
+#include "Ux/MultiSelector.h"
 
 #include "ListPath.h"
 
@@ -41,8 +45,15 @@ using namespace List;
 using namespace std::placeholders;
 
 AlarmsView::AlarmsView()
-       : m_Genlist(nullptr), m_TitleItem(nullptr), m_AddAlarmItem(nullptr)
+       : m_NoContents(nullptr), m_ContentLayout(nullptr), m_Genlist(nullptr),
+         m_TitleItem(nullptr), m_AddAlarmItem(nullptr), m_MultiSelector(nullptr)
 {
+       Strings strings{};
+       strings.buttonDone = "WDS_ALM_ACBUTTON_DELETE_ABB";
+       strings.titleMulti = "0";
+       strings.titleWithCount = "%d";
+       setStrings(strings);
+
        System::Settings::addCallback(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR,
                        { std::bind(&AlarmsView::onFormatChanged, this, _1), this });
 }
@@ -55,9 +66,9 @@ AlarmsView::~AlarmsView()
 Evas_Object *AlarmsView::onCreate(Evas_Object *parent)
 {
        Evas_Object *layout = elm_layout_add(parent);
-       elm_layout_theme_set(layout, "layout", "application", "default");
+       elm_layout_theme_set(layout, "layout", "bottom_button", "default");
 
-       m_Genlist = createGenlist(layout);
+       m_ContentLayout = createContentLayout(layout);
        m_NoContents = createNoContents(layout);
 
        return layout;
@@ -89,20 +100,59 @@ void AlarmsView::onNavigation(bool isCurrent)
        eext_rotary_object_event_activated_set(m_Genlist->getEvasObject(), isCurrent);
 }
 
+void AlarmsView::onSelectModeChanged(Ux::SelectMode selectMode)
+{
+       if (selectMode != Ux::SelectMulti) {
+               elm_layout_signal_emit(m_ContentLayout, "select_mode,button,hide", "");
+
+               m_TitleItem->setTitleVisibility(true);
+               m_AddAlarmItem->setButtonVisibility(true);
+       } else {
+               elm_layout_signal_emit(m_ContentLayout, "select_mode,button,show", "");
+
+               m_TitleItem->setTitleVisibility(false);
+               m_AddAlarmItem->setButtonVisibility(false);
+       }
+}
+
+void AlarmsView::onSelectCountChanged(size_t selectCount)
+{
+       m_MultiSelector->setCount(selectCount);
+}
+
+Evas_Object *AlarmsView::createDoneButton()
+{
+       Evas_Object *button = elm_button_add(getEvasObject());
+       elm_object_style_set(button, "bottom");
+       elm_object_translatable_text_set(button, "WDS_ALM_ACBUTTON_DELETE_ABB");
+       elm_object_part_content_set(getEvasObject(), "elm.swallow.button", button);
+       return button;
+}
+
 void AlarmsView::onUpdateFinished()
 {
        updateEmptyState();
 }
 
-Ui::Genlist *AlarmsView::createGenlist(Evas_Object *parent)
+Evas_Object *AlarmsView::createContentLayout(Evas_Object *parent)
 {
-       auto surface = findParent<Ui::Window>(parent)->getCircleConformant();
+       Evas_Object *layout = elm_layout_add(parent);
+       elm_layout_theme_set(layout, "layout", "select_mode", "default");
 
-       auto genlist = new Ui::Genlist();
-       genlist->create(parent);
-       eext_circle_object_genlist_add(genlist->getEvasObject(), surface);
+       auto surface = findParent<Ui::Window>(parent)->getCircleConformant();
+       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);
+       elm_object_content_set(layout, m_Genlist->getEvasObject());
+
+       m_MultiSelector = new Ux::MultiSelector();
+       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());
 
-       return genlist;
+       return layout;
 }
 
 Evas_Object *AlarmsView::createNoContents(Evas_Object *parent)
@@ -133,7 +183,7 @@ Evas_Object *AlarmsView::createAddButton(Evas_Object *parent)
 void AlarmsView::updateEmptyState()
 {
        Evas_Object *content = m_Provider.getDataList().size() > 0
-                       ? m_Genlist->getEvasObject() : m_NoContents;
+                       ? m_ContentLayout : m_NoContents;
 
        if (content != elm_object_content_get(getEvasObject())) {
                evas_object_hide(elm_object_content_unset(getEvasObject()));
@@ -206,3 +256,28 @@ 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)
+{
+       if (getSelectMode() == Ux::SelectNone) {
+               setSelectMode(Ux::SelectMulti);
+               setCancelCallback(std::bind(&AlarmsView::onSelectFinished, this));
+               setSelectCallback([this](Ux::SelectResults results) {
+                       for (auto &&result : results) {
+                               auto alarm = (Alarm *)result.value.data;
+                               AlarmConsumer::getInstance().deleteAlarm(alarm->getId(), nullptr);
+                       }
+
+                       return onSelectFinished();
+               });
+               elm_genlist_item_selected_set((Elm_Object_Item *)genItem, EINA_TRUE);
+       }
+}
+
+bool AlarmsView::onSelectFinished()
+{
+       setSelectMode(Ux::SelectNone);
+       setCancelCallback(nullptr);
+       setSelectCallback(nullptr);
+       return false;
+}
index 90372b29c8caa8eae9a3d52a46703177d3f1350b..44a5a37071637f18223d6e4f80795216fd7e2f73 100644 (file)
 
 using namespace List;
 
+TitleItem::TitleItem()
+       : m_IsTitleVisible(true)
+{
+}
+
+void TitleItem::setTitleVisibility(bool isVisible)
+{
+       if (m_IsTitleVisible != isVisible) {
+               m_IsTitleVisible = isVisible;
+
+               update("elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
+       }
+}
+
 Elm_Gen_Item_Class *TitleItem::getItemClass() const
 {
        static Elm_Gen_Item_Class itc = createItemClass("title");
@@ -27,7 +41,7 @@ Elm_Gen_Item_Class *TitleItem::getItemClass() const
 
 char *TitleItem::getText(Evas_Object *parent, const char *part)
 {
-       if (strcmp(part, "elm.text") == 0) {
+       if (m_IsTitleVisible && strcmp(part, "elm.text") == 0) {
                return strdup(_("WDS_ALM_HEADER_ALARM_ABB"));
        }
 
index c3213c0bb438d00b03be39b72ad4f54cda3dd1a9..f54c2aa63e8ca42ab658801814b91a12ed81d628 100644 (file)
@@ -91,6 +91,7 @@ namespace Ui
                virtual bool onChecked(bool isChecked) { return true; }
 
        private:
+               void onCheckChanged(Evas_Object *check, void *eventInfo);
                bool notifyCheck();
 
                std::string m_CheckPart;
index 95773139c58469e347607d54cf6af95759f89f85..cf6fecee81fc8e6e29fd8d562a2f994c0c07fc4a 100644 (file)
@@ -213,6 +213,9 @@ namespace Ux
                        CountDecrement
                };
 
+               virtual Evas_Object *createDoneButton();
+               virtual Evas_Object *createCancelButton();
+
                size_t getSelectMax() const;
                bool isLimitReached() const;
                bool isMaxSelected() const;
@@ -230,7 +233,7 @@ namespace Ux
                void updateVisibleCount(CountChange change, SelectItem *item);
                void updateVisibleSelectCount(CountChange change, SelectItem *item);
 
-               void createPageButtons(Ui::NavigatorPage *page);
+               void createPageButtons();
                void destroyPageButtons();
 
                void onItemExcluded(SelectItem *item, bool isExcluded);
index d4e846cbd82ecca30e4cdaec5ae4f54c9a143b24..66d94b70ffd2f02f74672afddcd7d3ca25f4e455 100644 (file)
@@ -98,7 +98,9 @@ Evas_Object *CheckItem::getContent(Evas_Object *parent, const char *part)
        Elm_Check *check = elm_check_add(parent);
        elm_check_state_set(check, m_IsChecked);
        elm_check_state_pointer_set(check, &m_IsChecked);
-       elm_object_signal_emit(check, "elm,event,pass,enabled", "elm");
+       evas_object_propagate_events_set(check, EINA_FALSE);
+       evas_object_smart_callback_add(check, "changed",
+                       makeCallback(&CheckItem::onCheckChanged), this);
 
        return check;
 }
@@ -108,6 +110,13 @@ void CheckItem::onSelected()
        setChecked(!m_IsChecked);
 }
 
+void CheckItem::onCheckChanged(Evas_Object *check, void *eventInfo)
+{
+       if (!notifyCheck()) {
+               elm_check_state_set(check, !m_IsChecked);
+       }
+}
+
 bool CheckItem::notifyCheck()
 {
        if (m_IsChecking) {
index ed5a7c773e29bf8f3526dcc9d9ee20f42e7653a7..11dc7446d1334075af7713ec4e4eb5d8369c32ee 100644 (file)
@@ -47,8 +47,6 @@ Evas_Object *MultiSelector::onCreate(Evas_Object *parent)
        evas_object_smart_callback_add(button, "clicked",
                        makeCallback(&MultiSelector::onButtonClicked), this);
 
-       elm_layout_content_set(parent, "elm.swallow.icon", button);
-
        return button;
 }
 
index 63e1d61a5c2b080a9d7b60b268deeea8753222f1..ad1783eac417cda99c9598bd6d0cba722f37739f 100644 (file)
@@ -194,6 +194,24 @@ void SelectView::onTitleChanged(const char *title)
        }
 }
 
+Evas_Object *SelectView::createDoneButton()
+{
+       if (!getPage()) {
+               return nullptr;
+       }
+
+       return getPage()->addTitleButton(Ui::ButtonRight, m_Strings.buttonDone, nullptr, nullptr);
+}
+
+Evas_Object *SelectView::createCancelButton()
+{
+       if (!getPage()) {
+               return nullptr;
+       }
+
+       return getPage()->addTitleButton(Ui::ButtonLeft, m_Strings.buttonCancel, nullptr, nullptr);
+}
+
 size_t SelectView::getSelectMax() const
 {
        if (m_SelectLimit && m_SelectLimit < m_VisibleCount) {
@@ -243,11 +261,6 @@ void SelectView::updatePageTitle()
 
 void SelectView::updatePageButtons()
 {
-       Ui::NavigatorPage *page = getPage();
-       if (!page) {
-               return;
-       }
-
        switch (m_SelectMode) {
                case SelectNone:
                case SelectSingle:
@@ -258,7 +271,7 @@ void SelectView::updatePageButtons()
 
                case SelectMulti:
                        if (!m_DoneButton) {
-                               createPageButtons(page);
+                               createPageButtons();
                        }
                        updateDoneButtonState();
                        break;
@@ -345,13 +358,13 @@ void SelectView::updateVisibleSelectCount(CountChange change, SelectItem *item)
        updateSelectAllState();
 }
 
-void SelectView::createPageButtons(Ui::NavigatorPage *page)
+void SelectView::createPageButtons()
 {
-       m_DoneButton = page->addTitleButton(Ui::ButtonRight, m_Strings.buttonDone,
-                       makeCallback(&SelectView::onDonePressed), this);
+       m_DoneButton = createDoneButton();
+       evas_object_smart_callback_add(m_DoneButton, "clicked", makeCallback(&SelectView::onDonePressed), this);
 
-       m_CancelButton = page->addTitleButton(Ui::ButtonLeft, m_Strings.buttonCancel,
-                       makeCallback(&SelectView::onCancelPressed), this);
+       m_CancelButton = createCancelButton();
+       evas_object_smart_callback_add(m_CancelButton, "clicked", makeCallback(&SelectView::onCancelPressed), this);
 }
 
 void SelectView::destroyPageButtons()