diff options
Diffstat (limited to 'lib/details/ct-detail-vibration-popup.cpp')
-rw-r--r-- | lib/details/ct-detail-vibration-popup.cpp | 267 |
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); +} |