summaryrefslogtreecommitdiff
path: root/lib/details/ct-detail-vibration-popup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/details/ct-detail-vibration-popup.cpp')
-rw-r--r--lib/details/ct-detail-vibration-popup.cpp267
1 files changed, 267 insertions, 0 deletions
diff --git a/lib/details/ct-detail-vibration-popup.cpp b/lib/details/ct-detail-vibration-popup.cpp
new file mode 100644
index 0000000..26c7101
--- /dev/null
+++ b/lib/details/ct-detail-vibration-popup.cpp
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ct-detail-vibration-popup.h"
+#include "ct-detail-vibration.h"
+#include "phone.h"
+#include "phone-common.h"
+#include "phone-text.h"
+
+typedef struct
+{
+ int id;
+ Evas_Object *radio_group;
+} ct_detail_vibration_item;
+
+typedef struct
+{
+ Evas_Object *parent;
+ Evas_Object *popup;
+ Evas_Object *genlist;
+ Evas_Object *radio_group;
+
+ ct_vibration_set_result_cb result_cb;
+ void *result_cb_data;
+
+ int vibr_id;
+ int prev_vibr_id;
+
+ unsigned item_count;
+ ct_detail_vibration_item *items;
+} ct_detail_vibration_data;
+
+static void detail_vibration_destroy(ct_detail_vibration_data *cvibr_d);
+
+static void detail_vibration_create_items(ct_detail_vibration_data *cvibr_d);
+
+static Evas_Object * detail_vibration_create_popup(ct_detail_vibration_data *cvibr_d);
+static Evas_Object * detail_vibration_create_genlist(ct_detail_vibration_data *cvibr_d);
+static Evas_Object * detail_vibration_create_radio_group(ct_detail_vibration_data *cvibr_d);
+
+static void detail_vibration_gl_fill(ct_detail_vibration_data *cvibr_d);
+static void detail_vibration_gl_sel_cb(void *data, Evas_Object *obj, void *event_info);
+static char * detail_vibration_gl_text_get(void *data, Evas_Object *obj, const char *part);
+static Evas_Object * detail_vibration_gl_content_get(void *data, Evas_Object *obj, const char *part);
+
+static void detail_vibration_ok_cb(void *data, Evas_Object *obj, void *event_info);
+static void detail_vibration_destroy_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+Evas_Object * ct_detail_vibration_popup_create(Evas_Object *parent, const char *vibration_path,
+ ct_vibration_set_result_cb result_cb, void *result_cb_data)
+{
+ PH_TRACE;
+ p_retvm_if(NULL == parent, NULL, "parent is NULL");
+ ct_detail_vibration_data *cvibr_d = (ct_detail_vibration_data *)
+ calloc(1, sizeof(ct_detail_vibration_data));
+ cvibr_d->parent = parent;
+ cvibr_d->result_cb = result_cb;
+ cvibr_d->result_cb_data = result_cb_data;
+ cvibr_d->prev_vibr_id = ct_detail_vibration_get_msgid(vibration_path);
+ cvibr_d->vibr_id = cvibr_d->prev_vibr_id;
+
+ cvibr_d->popup = detail_vibration_create_popup(cvibr_d);
+ if(!cvibr_d->popup)
+ {
+ detail_vibration_destroy(cvibr_d);
+ return NULL;
+ }
+
+ cvibr_d->genlist = detail_vibration_create_genlist(cvibr_d);
+ if(!cvibr_d->genlist)
+ {
+ evas_object_del(cvibr_d->popup);
+ return NULL;
+ }
+
+ cvibr_d->radio_group = detail_vibration_create_radio_group(cvibr_d);
+ if(!cvibr_d->radio_group)
+ {
+ evas_object_del(cvibr_d->popup);
+ return NULL;
+ }
+
+ detail_vibration_create_items(cvibr_d);
+ detail_vibration_gl_fill(cvibr_d);
+
+ return cvibr_d->popup;
+}
+
+static void detail_vibration_destroy(ct_detail_vibration_data *cvibr_d)
+{
+ PH_TRACE;
+ p_retm_if(NULL == cvibr_d, "cvibr_d is NULL");
+
+ free(cvibr_d->items);
+ free(cvibr_d);
+}
+
+static void detail_vibration_create_items(ct_detail_vibration_data *cvibr_d)
+{
+ PH_TRACE;
+ p_retm_if(NULL == cvibr_d, "cvibr_d is NULL");
+
+ cvibr_d->item_count = CTTEXT_VIBRATION_MAX;
+ cvibr_d->items = (ct_detail_vibration_item *)
+ calloc(cvibr_d->item_count, sizeof(ct_detail_vibration_item));
+
+ for(unsigned i = 0; i < cvibr_d->item_count; ++i)
+ {
+ cvibr_d->items[i].id = i;
+ cvibr_d->items[i].radio_group = cvibr_d->radio_group;
+ }
+}
+
+static Evas_Object * detail_vibration_create_popup(ct_detail_vibration_data *cvibr_d)
+{
+ PH_TRACE;
+ p_retvm_if(NULL == cvibr_d, NULL, "cvibr_d is NULL");
+
+ Evas_Object *popup = elm_popup_add(cvibr_d->parent);
+ p_retvm_if(NULL == popup, NULL, "elm_popup_add() failed");
+
+ elm_object_part_text_set(popup, "title,text",
+ T_(CT_GET_TEXT_BASIC, CTTEXT_VIBRATION_PATTERN));
+ bool success = phone_popup_add_button(popup, S_(PH_SYS_SK_OK),
+ detail_vibration_ok_cb, cvibr_d) != NULL
+ && phone_popup_add_button(popup, S_(PH_SYS_SK_CANCEL),
+ NULL, NULL) != NULL;
+
+ if(!success)
+ {
+ evas_object_del(popup);
+ return NULL;
+ }
+
+ elm_object_style_set(popup, "content_no_vhpad");
+ evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL,
+ detail_vibration_destroy_cb, cvibr_d);
+ evas_object_show(popup);
+
+ return popup;
+}
+
+static Evas_Object * detail_vibration_create_genlist(ct_detail_vibration_data *cvibr_d)
+{
+ PH_TRACE;
+ p_retvm_if(NULL == cvibr_d, NULL, "cvibr_d is NULL");
+
+ Evas_Object *genlist = elm_genlist_add(cvibr_d->popup);
+ p_retvm_if(NULL == genlist, NULL, "elm_genlist_add() failed");
+
+ elm_object_content_set(cvibr_d->popup, genlist);
+ evas_object_smart_callback_add(genlist, "selected", detail_vibration_gl_sel_cb, cvibr_d);
+
+ return genlist;
+}
+
+static Evas_Object * detail_vibration_create_radio_group(ct_detail_vibration_data *cvibr_d)
+{
+ PH_TRACE;
+ p_retvm_if(NULL == cvibr_d, NULL, "cvibr_d is NULL");
+
+ Evas_Object *radio = elm_radio_add(cvibr_d->genlist);
+ p_retvm_if(NULL == radio, NULL, "elm_radio_add() failed");
+
+ elm_radio_value_pointer_set(radio, &cvibr_d->vibr_id);
+ elm_radio_state_value_set(radio, -1);
+ elm_radio_value_set(radio, cvibr_d->prev_vibr_id);
+ evas_object_hide(radio);
+
+ return radio;
+}
+
+static void detail_vibration_gl_sel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_TRACE;
+ p_retm_if(NULL == data, "data is NULL");
+ p_retm_if(NULL == event_info, "event_info is NULL");
+
+ ct_detail_vibration_data *cvibr_d = (ct_detail_vibration_data *) data;
+ Elm_Object_Item *item = (Elm_Object_Item *) event_info;
+ ct_detail_vibration_item *item_data = (ct_detail_vibration_item *)
+ elm_object_item_data_get(item);
+ p_retm_if(NULL == item_data, "item_data is NULL");
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ elm_radio_value_set(cvibr_d->radio_group, item_data->id);
+ //TODO: play selected vibration pattern
+}
+
+static void detail_vibration_gl_fill(ct_detail_vibration_data *cvibr_d)
+{
+ PH_TRACE;
+ p_retm_if(NULL == cvibr_d, "cvibr_d is NULL");
+
+ Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
+ itc->item_style = "1text.1icon.2/popup";
+ itc->func.text_get = detail_vibration_gl_text_get;
+ itc->func.content_get = detail_vibration_gl_content_get;
+
+ ct_detail_vibration_item *item = cvibr_d->items;
+ ct_detail_vibration_item *end = item + cvibr_d->item_count;
+ for(; item != end; ++item)
+ {
+ elm_genlist_item_append(cvibr_d->genlist, itc, item,
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+
+ elm_genlist_item_class_free(itc);
+}
+
+static char * detail_vibration_gl_text_get(void *data, Evas_Object *obj, const char *part)
+{
+ PH_TRACE;
+ p_retvm_if(NULL == data, NULL, "data is NULL");
+ ct_detail_vibration_item *item_data = (ct_detail_vibration_item *) data;
+ return strdup(T_(CT_GET_TEXT_VIBRATION, item_data->id));
+}
+
+static Evas_Object * detail_vibration_gl_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ PH_TRACE;
+ p_retvm_if(NULL == data, NULL, "data is NULL");
+ ct_detail_vibration_item *item_data = (ct_detail_vibration_item *) data;
+
+ Evas_Object *radio = elm_radio_add(obj);
+ p_retvm_if(NULL == radio, NULL, "elm_radio_add() failed");
+ elm_radio_state_value_set(radio, item_data->id);
+ elm_radio_group_add(radio, item_data->radio_group);
+ return radio;
+}
+
+static void detail_vibration_ok_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_TRACE;
+ p_retm_if(NULL == data, "data is NULL");
+ ct_detail_vibration_data *cvibr_d = (ct_detail_vibration_data *) data;
+
+ if(cvibr_d->vibr_id != cvibr_d->prev_vibr_id)
+ {
+ if(cvibr_d->result_cb)
+ {
+ cvibr_d->result_cb(cvibr_d->result_cb_data,
+ ct_detail_vibration_get_path(cvibr_d->vibr_id));
+ }
+ }
+}
+
+static void detail_vibration_destroy_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ PH_TRACE;
+ p_retm_if(NULL == data, "data is NULL");
+ ct_detail_vibration_data *cvibr_d = (ct_detail_vibration_data *) data;
+ detail_vibration_destroy(cvibr_d);
+}