};
/**
+ * @brief Person ID list
+ */
+ typedef std::vector<int> PersonIds;
+
+ /**
+ * @brief Callback, that invokes when all results are prepared
+ * @details Invokes on view close
+ */
+ typedef std::function<void(PersonIds)> ResultCallback;
+
+ /**
* @brief Create new person list view
* @param]in] personFilter Defines how to filter person list
*/
*/
void setMode(Mode mode);
+ /**
+ * @brief Set view result callback
+ * @remark Used in Singlepick/Multipick view modes
+ * @param[in] callback Done pressed callback
+ */
+ void setResultCallback(ResultCallback callback);
+
+ /**
+ * @brief Unset view result callback
+ */
+ void unsetResultCallback();
+
private:
enum SectionId
{
void createNewContactButton();
void deleteNewContactButton();
+ void createCancelButton();
+ void createDoneButton();
void insertMyProfileGroupItem();
void updateMyProfileItem(const char *view_uri);
void deletePersonItem(PersonItem *item);
PersonItem *getNextPersonItem(PersonGroupItem *group, const Model::Person &person);
+ PersonIds getCheckedPersonIds();
+
void launchPersonDetail(PersonItem *item);
void onIndexChanged(Evas_Object *index, Elm_Object_Item *indexItem);
void onIndexSelected(Evas_Object *index, Elm_Object_Item *indexItem);
void onCreatePressed();
+ void onDonePressed(Evas_Object *button, void *eventInfo);
void onPersonInserted(Model::PersonPtr person);
void onPersonChanged(Model::PersonPtr person, contacts_changed_e changeType, PersonItem *item);
Ui::Genlist *m_Genlist;
Evas_Object *m_Index;
+ Evas_Object *m_CancelButton;
+ Evas_Object *m_DoneButton;
Ui::GenlistGroupItem *m_Sections[SectionMax];
std::map<Utils::UniString, PersonGroupItem *> m_PersonGroups;
size_t m_PersonCount;
size_t m_CheckedCount;
+
+ ResultCallback m_OnResult;
};
}
}
#include <app_i18n.h>
#include <functional>
-#define TITLE_SIZE 32
+#define TITLE_SIZE 32
+#define PART_TITLE_RIGHT "title_right_btn"
+#define PART_TITLE_LEFT "title_left_btn"
using namespace Contacts;
using namespace Contacts::List;
ListView::ListView(PersonProvider::FilterType personFilter)
: m_Genlist(nullptr), m_Index(nullptr),
+ m_CancelButton(nullptr), m_DoneButton(nullptr),
m_Sections{ nullptr },
m_Provider(PersonProvider(personFilter)),
m_ViewMode(ModeDefault),
}
}
+void ListView::setResultCallback(ResultCallback callback)
+{
+ m_OnResult = std::move(callback);
+}
+
+void ListView::unsetResultCallback()
+{
+ m_OnResult = nullptr;
+}
+
Evas_Object *ListView::onCreate(Evas_Object *parent)
{
Evas_Object *layout = elm_layout_add(parent);
ListView *deleteView = new ListView();
getNavigator()->navigateTo(deleteView);
deleteView->setMode(ModeMultipick);
+ deleteView->setResultCallback([](PersonIds ids) {
+ contacts_db_delete_records(_contacts_person._uri, ids.data(), ids.size());
+ });
});
menu->addItem("IDS_PB_OPT_SETTINGS", [this] {
void ListView::updateTitle()
{
switch (m_ViewMode) {
- case ModeDefault: getPage()->setTitle("IDS_PB_TAB_CONTACTS"); break;
- case ModeMultipick: {
+ case ModeDefault:
+ getPage()->setTitle("IDS_PB_TAB_CONTACTS");
+
+ evas_object_del(m_CancelButton);
+ evas_object_del(m_DoneButton);
+ m_CancelButton = nullptr;
+ m_DoneButton = nullptr;
+ break;
+ case ModeMultipick:
+ {
char title[TITLE_SIZE];
snprintf(title, TITLE_SIZE, _("IDS_PB_HEADER_PD_SELECTED_ABB"), m_CheckedCount);
getPage()->setTitle(title);
+
+ createCancelButton();
+ createDoneButton();
break;
}
default: break;
//Todo
}
+void ListView::createCancelButton()
+{
+ 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",
+ [](void *self, Evas_Object *obj, void *eventInfo) {
+ delete static_cast<ListView *>(self);
+ },
+ this);
+
+ getPage()->setContent(PART_TITLE_LEFT, m_CancelButton);
+}
+
+void ListView::createDoneButton()
+{
+ Evas_Object *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(&ListView::onDonePressed), this);
+
+ getPage()->setContent(PART_TITLE_RIGHT, m_DoneButton);
+}
+
void ListView::insertMyProfileGroupItem()
{
auto group = new GroupItem("IDS_PB_HEADER_ME");
return nullptr;
}
+ListView::PersonIds ListView::getCheckedPersonIds()
+{
+ PersonIds ids;
+ for (auto &&group : m_PersonGroups) {
+ for (auto &&item : *group.second) {
+ PersonItem *personItem = static_cast<PersonItem *>(item);
+ if (personItem->isChecked()) {
+ ids.push_back(personItem->getPerson().getId());
+ }
+ }
+ }
+
+ return ids;
+}
+
void ListView::launchPersonDetail(PersonItem *item)
{
int id = 0;
getNavigator()->navigateTo(new Input::InputView());
}
+void ListView::onDonePressed(Evas_Object *button, void *eventInfo)
+{
+ if (m_OnResult) {
+ m_OnResult(getCheckedPersonIds());
+ }
+
+ delete this;
+}
+
void ListView::onPersonInserted(PersonPtr person)
{
insertPersonItem(createPersonItem(std::move(person)));