*/
virtual void onSelected() override;
+ /**
+ * @see SelectItem::onSelectModeChanged()
+ */
+ virtual void onSelectModeChanged(SelectMode selectMode) override;
+
/**
* @brief Create action button.
* @param[in] parent Parent widget
#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"
/**
* @brief Contact/My profile details view.
*/
- class DetailsView : public Ui::View
+ class DetailsView : public SelectView
{
public:
/**
*/
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);
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;
};
#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
/**
* @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.
*/
*/
Model::ContactObject &getObject() const;
- /**
- * @return Item selection mode.
- */
- SelectMode getSelectMode() const;
-
protected:
friend class DetailsView;
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
private:
Model::ContactObject &m_Object;
Model::ContactField &m_Field;
-
- SelectMode m_SelectMode;
- SelectCallback m_OnSelected;
};
}
}
#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;
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);
}
}
}
}
+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);
}
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());
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) {
}
}
-void DetailsView::onPageAttached()
-{
- updatePageMode();
-}
-
void DetailsView::onMenuPressed()
{
- if (m_SelectMode != SelectNone) {
+ if (getSelectMode() != SelectNone) {
return;
}
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);
}
}
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;
}
FieldItem *item = createFieldItem(field);
m_Genlist->insert(item, nullptr, getNextFieldItem(fieldId));
+ onItemInserted(item);
if (!m_Items[fieldId]) {
m_Items[fieldId] = item;
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());
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) {
}
}
}
-
-void DetailsView::onDonePressed(Evas_Object *button, void *eventInfo)
-{
- onMultiSelected();
-}
-
-void DetailsView::onCancelPressed(Evas_Object *button, void *eventInfo)
-{
- delete this;
-}
#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;
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");
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);
}
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)