TizenRefApp-5827 Integrate Select View in Details View 66/60666/3
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Tue, 1 Mar 2016 09:15:49 +0000 (11:15 +0200)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Tue, 1 Mar 2016 15:48:44 +0000 (17:48 +0200)
Change-Id: I6faeac0b279762d542da6d7bfc513c065966e14e
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-contact/inc/Contacts/Details/ActionFieldItem.h
lib-contact/inc/Contacts/Details/DetailsView.h
lib-contact/inc/Contacts/Details/FieldItem.h
lib-contact/src/Contacts/Details/ActionFieldItem.cpp
lib-contact/src/Contacts/Details/DetailsView.cpp
lib-contact/src/Contacts/Details/FieldItem.cpp

index f210804e67d10d1de7337bf769ca2d2ed2cca11c..8978b9f5cb80062b48fcb783eb166d1d4d6e1fe2 100644 (file)
@@ -58,6 +58,11 @@ namespace Contacts
                         */
                        virtual void onSelected() override;
 
+                       /**
+                        * @see SelectItem::onSelectModeChanged()
+                        */
+                       virtual void onSelectModeChanged(SelectMode selectMode) override;
+
                        /**
                         * @brief Create action button.
                         * @param[in]   parent      Parent widget
index 1d7e8de1771d34b3074cc95e26eea70ee61e4331..e252e7308e2a79fe689a9256023e565e3249036b 100644 (file)
@@ -19,7 +19,7 @@
 #define CONTACTS_DETAILS_DETAILS_VIEW_H
 
 #include "App/AppControl.h"
-#include "Contacts/Common/SelectMode.h"
+#include "Contacts/Common/SelectView.h"
 #include "Contacts/Model/Contact.h"
 #include "Ui/View.h"
 
@@ -38,7 +38,7 @@ namespace Contacts
                /**
                 * @brief Contact/My profile details view.
                 */
-               class DetailsView : public Ui::View
+               class DetailsView : public SelectView
                {
                public:
                        /**
@@ -58,29 +58,13 @@ namespace Contacts
                         */
                        DetailsView(int recordId, Type type = TypeContact, int filterType = FilterNone);
 
-                       /**
-                        * @brief Set selection callback.
-                        * @param[in]   callback    Callback to be called when selection is done
-                        */
-                       void setSelectCallback(SelectCallback callback);
-
-                       /**
-                        * @brief Set selection mode and result type.
-                        * @param[in]   mode    Selection mode
-                        */
-                       void setSelectMode(SelectMode mode);
-
                private:
                        virtual Evas_Object *onCreate(Evas_Object *parent) override;
                        virtual void onCreated() override;
-                       virtual void onPageAttached() override;
                        virtual void onMenuPressed() override;
 
-                       void createPageButtons();
-                       void destroyPageButtons();
-
-                       void updatePageTitle();
-                       void updatePageMode();
+                       virtual void onSelectAllInsert(Ui::GenlistItem *item) override;
+                       virtual void onSelectModeChanged(SelectMode selectMode) override;
 
                        FieldItem *createFieldItem(Model::ContactObject &field);
                        FieldItem *getNextFieldItem(Model::ContactFieldId fieldId);
@@ -88,30 +72,16 @@ namespace Contacts
                        FieldItem *addFieldItem(Model::ContactObject &field);
                        void removeFieldItem(FieldItem *item);
 
-                       void onItemChecked(bool isChecked);
-                       void onSingleSelected(SelectResult result);
-                       void onMultiSelected();
-
                        void onArrayUpdated(Model::ContactField &field, contacts_changed_e change);
                        void onObjectUpdated(FieldItem *item, Model::ContactField &field, contacts_changed_e change);
 
-                       void onDonePressed(Evas_Object *button, void *eventInfo);
-                       void onCancelPressed(Evas_Object *button, void *eventInfo);
-
                        int m_RecordId;
                        Model::Contact m_Contact;
-
                        int m_FilterType;
-                       SelectMode m_SelectMode;
-                       SelectCallback m_OnSelected;
-
-                       Evas_Object *m_DoneButton;
-                       Evas_Object *m_CancelButton;
 
                        Ui::Genlist *m_Genlist;
                        BasicInfoItem *m_BasicInfoItem;
                        FieldItem *m_Items[Model::FieldEnd];
-                       size_t m_SelectCount;
 
                        App::AppControl m_AppControl;
                };
index 07dabf8771f30c2e10816103cfa5badc3d3bb657..1fd663190e9ab139d07a8d3bd77449ffc5836ea3 100644 (file)
@@ -18,8 +18,7 @@
 #ifndef CONTACTS_DETAILS_FIELD_ITEM_H
 #define CONTACTS_DETAILS_FIELD_ITEM_H
 
-#include "Contacts/Common/SelectMode.h"
-#include "Ui/GenlistCheckItem.h"
+#include "Contacts/Common/SelectItem.h"
 #include <contacts.h>
 
 namespace Contacts
@@ -35,33 +34,15 @@ namespace Contacts
                /**
                 * @brief Genlist item representing ContactObject and its first field.
                 */
-               class FieldItem : public Ui::GenlistCheckItem
+               class FieldItem : public SelectItem
                {
                public:
-                       /**
-                        * @brief Called when the item (or an action) is selected in #SelectSingle mode.
-                        * @param[in]   Selection result
-                        */
-                       typedef std::function<void(SelectResult)> SelectCallback;
-
                        /**
                         * @brief Create genlist item representing ContactObject.
                         * @param[in]   object  Contact field of TypeObject type
                         */
                        FieldItem(Model::ContactObject &object);
 
-                       /**
-                        * @brief Set item selection mode and result type.
-                        * @param[in]   mode    Selection mode
-                        */
-                       void setSelectMode(SelectMode mode);
-
-                       /**
-                        * @brief Set selection callback.
-                        * @param[in]   callback    Callback to be called when item is selected.
-                        */
-                       void setSelectCallback(SelectCallback callback);
-
                        /**
                         * @return ContactField associated with the item.
                         */
@@ -72,11 +53,6 @@ namespace Contacts
                         */
                        Model::ContactObject &getObject() const;
 
-                       /**
-                        * @return Item selection mode.
-                        */
-                       SelectMode getSelectMode() const;
-
                protected:
                        friend class DetailsView;
 
@@ -96,9 +72,9 @@ namespace Contacts
                        virtual Evas_Object *getContent(Evas_Object *parent, const char *part) override;
 
                        /**
-                        * @see GenlistItem::onSelected()
+                        * @see SelectItem::getSelectResult()
                         */
-                       virtual void onSelected() override;
+                       virtual SelectResult getSelectResult() const override;
 
                        /**
                         * @see ContactField::UpdatedCallback
@@ -108,9 +84,6 @@ namespace Contacts
                private:
                        Model::ContactObject &m_Object;
                        Model::ContactField &m_Field;
-
-                       SelectMode m_SelectMode;
-                       SelectCallback m_OnSelected;
                };
        }
 }
index f703948325723334308bcdb43180058084d818c8..6f3c341f020153a783bc0a0ca2c8ec844f340494 100644 (file)
@@ -27,6 +27,9 @@
 #include "ContactsDetailsItemLayout.h"
 #include "ContactsDetailsItemLayoutMetrics.h"
 
+#define PART_ACTION_BUTTON1 "elm.swallow.icon.2"
+#define PART_ACTION_BUTTON2 "elm.swallow.end"
+
 using namespace Contacts::Details;
 using namespace Contacts::Model;
 
@@ -54,9 +57,9 @@ ActionFieldItem::ActionFieldItem(Model::ContactObject &object, ActionId actionId
 Evas_Object *ActionFieldItem::getContent(Evas_Object *parent, const char *part)
 {
        if (getSelectMode() == SelectNone) {
-               if (strcmp(part, "elm.swallow.icon.1") == 0) {
+               if (strcmp(part, PART_ACTION_BUTTON1) == 0) {
                        return createActionButton(parent, m_ActionId);
-               } else if (m_ActionId == ActionCall && strcmp(part, "elm.swallow.icon.2") == 0) {
+               } else if (m_ActionId == ActionCall && strcmp(part, PART_ACTION_BUTTON2) == 0) {
                        return createActionButton(parent, ActionMessage);
                }
        }
@@ -73,6 +76,15 @@ void ActionFieldItem::onSelected()
        }
 }
 
+void ActionFieldItem::onSelectModeChanged(SelectMode selectMode)
+{
+       Elm_Object_Item *item = getObjectItem();
+       if (item) {
+               elm_genlist_item_fields_update(item, PART_ACTION_BUTTON1, ELM_GENLIST_ITEM_FIELD_CONTENT);
+               elm_genlist_item_fields_update(item, PART_ACTION_BUTTON2, ELM_GENLIST_ITEM_FIELD_CONTENT);
+       }
+}
+
 Evas_Object *ActionFieldItem::createActionButton(Evas_Object *parent, ActionId actionId)
 {
        static const int imageSize = Ui::getScaledValue(BTN_WH);
index 58342feb67932fa0222f2a1add623af795dbf878..2ca5db6fac085adec98ee96d0a36b344b53f8e56 100644 (file)
@@ -63,35 +63,11 @@ namespace
 }
 
 DetailsView::DetailsView(int recordId, Type type, int filterType)
-       : m_RecordId(recordId), m_Contact(ContactObjectType(type)),
-         m_FilterType(filterType), m_SelectMode(SelectNone),
-         m_DoneButton(nullptr), m_CancelButton(nullptr),
-         m_Genlist(nullptr), m_BasicInfoItem(nullptr), m_Items{nullptr}, m_SelectCount(0)
+       : m_RecordId(recordId), m_Contact(ContactObjectType(type)), m_FilterType(filterType),
+         m_Genlist(nullptr), m_BasicInfoItem(nullptr), m_Items{nullptr}
 {
 }
 
-void DetailsView::setSelectCallback(SelectCallback callback)
-{
-       m_OnSelected = std::move(callback);
-}
-
-void DetailsView::setSelectMode(SelectMode mode)
-{
-       m_SelectMode = mode;
-
-       if (m_BasicInfoItem) {
-               m_BasicInfoItem->setSelectMode(mode);
-
-               auto item = m_BasicInfoItem->getNextItem();
-               for (; item; item = item->getNextItem()) {
-                       FieldItem *fieldItem = static_cast<FieldItem *>(item);
-                       fieldItem->setSelectMode(mode);
-               }
-       }
-
-       updatePageMode();
-}
-
 Evas_Object *DetailsView::onCreate(Evas_Object *parent)
 {
        elm_theme_extension_add(nullptr, App::getResourcePath(DETAILS_ITEM_LAYOUT_EDJ).c_str());
@@ -109,7 +85,7 @@ void DetailsView::onCreated()
        RETM_IF_ERR(err, "Contact::initialize() failed.");
 
        m_BasicInfoItem = new BasicInfoItem(m_Contact);
-       m_BasicInfoItem->setSelectMode(m_SelectMode);
+       m_BasicInfoItem->setSelectMode(getSelectMode());
        m_Genlist->insert(m_BasicInfoItem);
 
        for (auto &&field : m_Contact) {
@@ -141,14 +117,9 @@ void DetailsView::onCreated()
        }
 }
 
-void DetailsView::onPageAttached()
-{
-       updatePageMode();
-}
-
 void DetailsView::onMenuPressed()
 {
-       if (m_SelectMode != SelectNone) {
+       if (getSelectMode() != SelectNone) {
                return;
        }
 
@@ -186,72 +157,15 @@ void DetailsView::onMenuPressed()
        menu->show();
 }
 
-void DetailsView::createPageButtons()
+void DetailsView::onSelectAllInsert(Ui::GenlistItem *item)
 {
-       m_DoneButton = elm_button_add(getEvasObject());
-       elm_object_style_set(m_DoneButton, "naviframe/title_right");
-       elm_object_translatable_text_set(m_DoneButton, "IDS_PB_BUTTON_DONE_ABB3");
-       evas_object_smart_callback_add(m_DoneButton, "clicked",
-                       makeCallback(&DetailsView::onDonePressed), this);
-
-       m_CancelButton = elm_button_add(getEvasObject());
-       elm_object_style_set(m_CancelButton, "naviframe/title_left");
-       elm_object_translatable_text_set(m_CancelButton, "IDS_PB_BUTTON_CANCEL");
-       evas_object_smart_callback_add(m_CancelButton, "clicked",
-                       makeCallback(&DetailsView::onCancelPressed), this);
+       m_Genlist->insert(item, nullptr, m_BasicInfoItem, Ui::Genlist::After);
 }
 
-void DetailsView::destroyPageButtons()
+void DetailsView::onSelectModeChanged(SelectMode selectMode)
 {
-       evas_object_del(m_DoneButton);
-       evas_object_del(m_CancelButton);
-
-       m_DoneButton = nullptr;
-       m_CancelButton = nullptr;
-}
-
-void DetailsView::updatePageTitle()
-{
-       Ui::NavigatorPage *page = getPage();
-       switch (m_SelectMode) {
-               case SelectNone:
-                       page->setTitle(nullptr);
-                       break;
-
-               case SelectSingle:
-                       page->setTitle("IDS_PB_HEADER_SELECT");
-                       break;
-
-               case SelectMulti:
-               {
-                       char title[TITLE_SIZE];
-                       snprintf(title, TITLE_SIZE, _("IDS_PB_HEADER_PD_SELECTED_ABB"), m_SelectCount);
-                       page->setTitle(title);
-               }
-                       break;
-       }
-}
-
-void DetailsView::updatePageMode()
-{
-       Ui::NavigatorPage *page = getPage();
-       if (!page) {
-               return;
-       }
-
-       updatePageTitle();
-
-       switch (m_SelectMode) {
-               case SelectNone:
-               case SelectSingle:
-                       destroyPageButtons();
-                       break;
-
-               case SelectMulti:
-                       createPageButtons();
-                       page->setContent("title_right_btn", m_DoneButton);
-                       page->setContent("title_left_btn", m_CancelButton);
-                       break;
+       if (m_BasicInfoItem) {
+               m_BasicInfoItem->setSelectMode(selectMode);
        }
 }
 
@@ -274,10 +188,6 @@ FieldItem *DetailsView::createFieldItem(ContactObject &field)
                item = new FieldItem(field);
        }
 
-       item->setSelectMode(m_SelectMode);
-       item->setSelectCallback(std::bind(&DetailsView::onSingleSelected, this, _1));
-       item->setCheckCallback(std::bind(&DetailsView::onItemChecked, this, _1));
-
        return item;
 }
 
@@ -298,6 +208,7 @@ FieldItem *DetailsView::addFieldItem(ContactObject &field)
 
        FieldItem *item = createFieldItem(field);
        m_Genlist->insert(item, nullptr, getNextFieldItem(fieldId));
+       onItemInserted(item);
 
        if (!m_Items[fieldId]) {
                m_Items[fieldId] = item;
@@ -312,6 +223,7 @@ FieldItem *DetailsView::addFieldItem(ContactObject &field)
 void DetailsView::removeFieldItem(FieldItem *item)
 {
        ContactFieldId fieldId = ContactFieldId(item->getObject().getId());
+       onItemRemove(item);
 
        if (item == m_Items[fieldId]) {
                FieldItem *nextItem = static_cast<FieldItem *>(item->getNextItem());
@@ -328,37 +240,6 @@ void DetailsView::removeFieldItem(FieldItem *item)
        delete item;
 }
 
-void DetailsView::onItemChecked(bool isChecked)
-{
-       m_SelectCount += isChecked ? 1 : -1;
-       updatePageTitle();
-}
-
-void DetailsView::onSingleSelected(SelectResult result)
-{
-       if (!m_OnSelected || m_OnSelected({ &result, 1 })) {
-               delete this;
-       }
-}
-
-void DetailsView::onMultiSelected()
-{
-       std::vector<SelectResult> results;
-
-       auto item = m_BasicInfoItem->getNextItem();
-       for (; item; item = item->getNextItem()) {
-               FieldItem *fieldItem = static_cast<FieldItem *>(item);
-               if (fieldItem && fieldItem->isChecked()) {
-                       ContactObject &object = fieldItem->getObject();
-                       results.push_back({ object.getSubType(), object.getRecordId()});
-               }
-       }
-
-       if (!m_OnSelected || m_OnSelected({ results.data(), results.size() })) {
-               delete this;
-       }
-}
-
 void DetailsView::onArrayUpdated(ContactField &field, contacts_changed_e change)
 {
        if (change == CONTACTS_CHANGE_INSERTED) {
@@ -386,13 +267,3 @@ void DetailsView::onObjectUpdated(FieldItem *item, ContactField &field, contacts
                }
        }
 }
-
-void DetailsView::onDonePressed(Evas_Object *button, void *eventInfo)
-{
-       onMultiSelected();
-}
-
-void DetailsView::onCancelPressed(Evas_Object *button, void *eventInfo)
-{
-       delete this;
-}
index dfc05b1cc8d93ba754821b9617388adb615722fa..78f3b603c24a2b6d8bc23b706a74f74e04ef830d 100644 (file)
@@ -31,22 +31,10 @@ using namespace std::placeholders;
 #define DATE_BUFFER_SIZE 32
 
 FieldItem::FieldItem(ContactObject &object)
-       : m_Object(object), m_Field(*object.getField(0)),
-         m_SelectMode(SelectNone)
+       : m_Object(object), m_Field(*object.getField(0))
 {
 }
 
-void FieldItem::setSelectMode(SelectMode mode)
-{
-       m_SelectMode = mode;
-       elm_genlist_item_fields_update(getObjectItem(), "*", ELM_GENLIST_ITEM_FIELD_CONTENT);
-}
-
-void FieldItem::setSelectCallback(SelectCallback callback)
-{
-       m_OnSelected = std::move(callback);
-}
-
 ContactObject &FieldItem::getObject() const
 {
        return m_Object;
@@ -57,11 +45,6 @@ ContactField &FieldItem::getField() const
        return m_Field;
 }
 
-SelectMode FieldItem::getSelectMode() const
-{
-       return m_SelectMode;
-}
-
 Elm_Genlist_Item_Class *FieldItem::getItemClass() const
 {
        static Elm_Genlist_Item_Class itc = createItemClass("type2");
@@ -97,7 +80,7 @@ char *FieldItem::getText(Evas_Object *parent, const char *part)
 
 Evas_Object *FieldItem::getContent(Evas_Object *parent, const char *part)
 {
-       if (m_SelectMode == SelectMulti) {
+       if (getSelectMode() == SelectMulti) {
                if (strcmp(part, "elm.swallow.end") == 0) {
                        return GenlistCheckItem::getContent(parent, part);
                }
@@ -106,15 +89,9 @@ Evas_Object *FieldItem::getContent(Evas_Object *parent, const char *part)
        return nullptr;
 }
 
-void FieldItem::onSelected()
+SelectResult FieldItem::getSelectResult() const
 {
-       if (m_SelectMode == SelectSingle) {
-               if (m_OnSelected) {
-                       m_OnSelected({ m_Object.getSubType(), m_Object.getRecordId()});
-               }
-       } else {
-               GenlistCheckItem::onSelected();
-       }
+       return { m_Object.getSubType(), m_Object.getRecordId() };
 }
 
 void FieldItem::onFieldUpdated(ContactField &field, contacts_changed_e change)