diff options
Diffstat (limited to 'main/src/control/ivug-popup.c')
-rwxr-xr-x | main/src/control/ivug-popup.c | 643 |
1 files changed, 643 insertions, 0 deletions
diff --git a/main/src/control/ivug-popup.c b/main/src/control/ivug-popup.c new file mode 100755 index 0000000..78c9d5e --- /dev/null +++ b/main/src/control/ivug-popup.c @@ -0,0 +1,643 @@ +/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.tizenopensource.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 "ivug-popup.h" +#include "ivug-vibration.h" + +#define NOTIFY_TIMEOUT 3.0 + +#define IVUG_POPUP_EDJ_NAME EDJ_PATH"/ivug-popup.edj" + +typedef struct _Ivug_Popup +{ + Evas_Object *parent; + Evas_Object *popup; + Evas_Object *layout; + + Evas_Object *obj; + + int selected_index; + + Popup_Response response; + + int haptic_handle; + + Evas_Smart_Cb callback; + void *data; + +}Ivug_Popup; + +typedef struct +{ + int index; + char *name; + Evas_Object *radio_main; + Ivug_Popup *p_iv_popup; +} ivug_radio_popup_item; + +static Ivug_Popup * ivug_popup_create() +{ + Ivug_Popup *iv_popup = calloc(1, sizeof(Ivug_Popup)); + + iv_popup->haptic_handle = INVALID_HAPTIC_HANDLE; + + return iv_popup; +} + +static void ivug_popup_delete(Ivug_Popup *iv_popup) +{ + if ( iv_popup->haptic_handle != INVALID_HAPTIC_HANDLE ) + { + ivug_vibration_stop(iv_popup->haptic_handle); + ivug_vibration_delete(iv_popup->haptic_handle); + + iv_popup->haptic_handle = INVALID_HAPTIC_HANDLE; + } + + if(iv_popup->popup) + { + evas_object_del(iv_popup->popup); + iv_popup->popup = NULL; + } + + if(iv_popup->layout) + { + evas_object_del(iv_popup->layout); + iv_popup->layout = NULL; + } + + free(iv_popup); +} + +static void _on_popup_response(void *data, Evas_Object *obj, void *event_info ) +{ + IV_ASSERT(data != NULL); + + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + Popup_Response response = (Popup_Response)evas_object_data_get(obj, "response"); + MSG_IMAGEVIEW_HIGH("response callback=%d", response); + + if(iv_popup->callback) + { + iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)response); + } + + ivug_popup_delete(iv_popup); +} + + +static void _on_ctxpopup_dismissed( void *data, Evas_Object *obj, void *event_info ) +{ +// Triggered when clicked outside ctxpopup + MSG_IMAGEVIEW_HIGH("Dismissed response"); + + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + + ivug_popup_delete(iv_popup); +} + +Evas_Object* +ivug_deletepopup_show(Evas_Object* parent, const char* title, + const char* contents, Evas_Smart_Cb response, void* user_data) +{ + Evas_Object *popup; + Evas_Object *btn_delete; + Evas_Object *btn_cancel; + //create popup + + IV_ASSERT(response != NULL); + + Ivug_Popup *iv_popup = ivug_popup_create(); + + popup = elm_popup_add(parent); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, contents); + elm_object_part_text_set(popup, "title,text", title); + + btn_delete = elm_button_add(popup); + elm_object_style_set(btn_delete, "popup_button/default"); + elm_object_text_set(btn_delete, IDS_DELETE); + elm_object_part_content_set(popup, "button1", btn_delete); + evas_object_data_set(btn_delete, "response", (void *)POPUP_RESPONSE_OK); + evas_object_smart_callback_add(btn_delete, "clicked", _on_popup_response, iv_popup); + + btn_cancel = elm_button_add(popup); + elm_object_style_set(btn_cancel, "popup_button/default"); + elm_object_text_set(btn_cancel, IDS_CANCEL); + elm_object_part_content_set(popup, "button2", btn_cancel); + evas_object_data_set(btn_cancel, "response", (void *)POPUP_RESPONSE_CANCEL); + evas_object_smart_callback_add(btn_cancel, "clicked", _on_popup_response, iv_popup); + + iv_popup->popup = popup; + iv_popup->callback = response; + iv_popup->data = user_data; + + evas_object_show(popup); + + return popup; +} + + +Evas_Object* +ivug_2btn_popup_show(Evas_Object* parent, const char* title, + const char* contents, Evas_Smart_Cb response, void* user_data) +{ + IV_ASSERT(response != NULL); + + Ivug_Popup *iv_popup = ivug_popup_create(); + + Evas_Object *popup; + Evas_Object *btn_yes; + Evas_Object *btn_no; + //create popup + + popup = elm_popup_add(parent); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, contents); + if(title) + { + elm_object_part_text_set(popup, "title,text", title); + } + + btn_yes = elm_button_add(popup); + elm_object_style_set(btn_yes, "popup_button/default"); + elm_object_text_set(btn_yes, IDS_YES); + elm_object_part_content_set(popup, "button1", btn_yes); + evas_object_data_set(btn_yes, "response", (void *)POPUP_RESPONSE_OK); + evas_object_smart_callback_add(btn_yes, "clicked", _on_popup_response, iv_popup); + + btn_no = elm_button_add(popup); + elm_object_style_set(btn_no, "popup_button/default"); + elm_object_text_set(btn_no, IDS_NO); + elm_object_part_content_set(popup, "button2", btn_no); + evas_object_data_set(btn_no, "response", (void *)POPUP_RESPONSE_CANCEL); + evas_object_smart_callback_add(btn_no, "clicked", _on_popup_response, iv_popup); + + iv_popup->popup = popup; + iv_popup->callback = response; + iv_popup->data = user_data; + + evas_object_show(popup); + evas_object_layer_set(popup, EVAS_LAYER_MAX); + + return popup; +}
+
+Evas_Object*
+ivug_1btn_popup_show(Evas_Object* parent, const char* title,
+ const char* contents, Evas_Smart_Cb response, void* user_data)
+{
+ IV_ASSERT(response != NULL);
+
+ Ivug_Popup *iv_popup = ivug_popup_create();
+
+ Evas_Object *popup;
+ Evas_Object *btn_yes;
+ //create popup
+
+ popup = elm_popup_add(parent);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, contents);
+ if(title)
+ {
+ elm_object_part_text_set(popup, "title,text", title);
+ }
+
+ btn_yes = elm_button_add(popup);
+ elm_object_style_set(btn_yes, "popup_button/default");
+ elm_object_text_set(btn_yes, IDS_OK);
+ elm_object_part_content_set(popup, "button1", btn_yes);
+ evas_object_data_set(btn_yes, "response", (void *)POPUP_RESPONSE_OK);
+ evas_object_smart_callback_add(btn_yes, "clicked", _on_popup_response, iv_popup);
+
+ iv_popup->popup = popup;
+ iv_popup->callback = response;
+ iv_popup->data = user_data;
+
+ evas_object_show(popup);
+ evas_object_layer_set(popup, EVAS_LAYER_MAX);
+
+ return popup;
+}
+
+static void _on_longpress_popup_selected(void *data, Evas_Object *obj, void *event_info) +{ + IV_ASSERT(data != NULL); + + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + + const char *label = elm_object_item_text_get((Elm_Object_Item *)event_info); + if(label == NULL) + { + MSG_MAIN_ERROR("label is NULL"); + ivug_popup_delete(iv_popup); + return; + } + MSG_MAIN_HIGH("text(%s) is clicked", label); + + Longpress_Popup_Response response = LPPOPUP_RESPONSE_NONE; + if(strncmp(label, IDS_COPY, strlen(label)) == 0) + { + response = LPPOPUP_RESPONSE_COPY; + } + else + { + MSG_MAIN_WARN("Unknown Share type : %s", label); + } + MSG_MAIN_HIGH("response=%d", response); + + if(iv_popup->callback) + { + iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)response); + } + + ivug_popup_delete(iv_popup); +} + +Evas_Object* +ivug_longpress_popup_show(Evas_Object *parent, int x, int y, Evas_Smart_Cb response, void *data) +{ + Ivug_Popup *iv_popup = ivug_popup_create(); + + Evas_Object* ctx_popup = NULL; + + ctx_popup = elm_ctxpopup_add(parent); + + elm_ctxpopup_item_append(ctx_popup, IDS_COPY, NULL, _on_longpress_popup_selected, iv_popup); + + evas_object_smart_callback_add(ctx_popup, "dismissed", _on_ctxpopup_dismissed, iv_popup); + + evas_object_move(ctx_popup, x, y); + + iv_popup->popup = ctx_popup; + iv_popup->callback = response; + iv_popup->data = data; + + evas_object_show(ctx_popup); + + return ctx_popup; +} + +void +_ivug_rename_enter_click_cb(void *data, Evas_Object *obj, void *event_info) +{ + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + IV_ASSERT(iv_popup != NULL); + + Evas_Object *entry = iv_popup->obj; + + char *name = elm_entry_markup_to_utf8 ( elm_entry_entry_get(entry) ); + + MSG_IMAGEVIEW_HIGH("name = %s", name); + + if(name) + { + char *new_name = NULL; + new_name = ivug_strip_string(name); + if(new_name == NULL) + { + MSG_IMAGEVIEW_ERROR( "rename failed"); + free(name); + ecore_imf_context_input_panel_hide(elm_entry_imf_context_get(entry)); + return; + } + elm_object_text_set(entry, new_name); + if(iv_popup->callback) + { + iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)POPUP_RESPONSE_OK); + } + ivug_popup_delete(iv_popup); + } + else + { + //ecore_imf_context_input_panel_hide(elm_entry_imf_context_get(entry)); + } +} + +void +_ivug_rename_entry_changed(void *data, Evas_Object *obj, void *event_info) +{ + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + IV_ASSERT(iv_popup != NULL); + + Evas_Object *entry = iv_popup->obj; + Evas_Object *btn_ok = elm_object_part_content_get(iv_popup->popup, "button1"); + + char *content = elm_entry_markup_to_utf8 ( elm_entry_entry_get(entry) ); + + if (strlen(content) == 0) + { + MSG_IMAGEVIEW_HIGH("ISF1 : %s", content); + elm_object_disabled_set(btn_ok, EINA_TRUE); + } + else + { + MSG_IMAGEVIEW_HIGH("ISF : %s", content); + elm_object_disabled_set(btn_ok, EINA_FALSE); + } + free(content); +} + +void +_ivug_rename_maxlength_reached(void *data, Evas_Object *obj, void *event_info) +{ + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + IV_ASSERT(iv_popup != NULL); + + if ( iv_popup->haptic_handle == INVALID_HAPTIC_HANDLE ) + { + iv_popup->haptic_handle = ivug_vibration_create(); + } + else + { + ivug_vibration_stop(iv_popup->haptic_handle); + } + + ivug_vibration_play(iv_popup->haptic_handle ,VIBRATION_DURATION); + +} + +Evas_Object *ivug_rename_popup_show(Evas_Object *parent, const char *filename, Evas_Smart_Cb response, void *data) +{ + Evas_Object *popup = NULL; + Evas_Object *entry = NULL; + Evas_Object *layout = NULL; + + Ivug_Popup *iv_popup = ivug_popup_create(); + + popup = elm_popup_add(parent); + if(!popup) + { + MSG_IMAGEVIEW_ERROR("popup is NULL"); + goto ENTRY_POPUP_FREE; + } + //evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + //elm_object_style_set(popup, "menustyle"); + elm_object_part_text_set(popup, "title,text", "Rename"); + + layout = elm_layout_add(popup); + if(!layout) + { + MSG_IMAGEVIEW_ERROR("layout is NULL"); + goto ENTRY_POPUP_FREE; + } + if(elm_layout_file_set(layout, IVUG_POPUP_EDJ_NAME, "popup_entryview") == EINA_FALSE) + { + MSG_IMAGEVIEW_ERROR("elm_layout_file_set error");; + goto ENTRY_POPUP_FREE; + } + //evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + entry = elm_entry_add(popup); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_object_text_set(entry, filename); + elm_entry_cursor_end_set(entry); + elm_object_part_content_set(layout, "elm.swallow.content", entry); + elm_object_content_set(popup, layout); + + evas_object_smart_callback_add(entry, "activated", _ivug_rename_enter_click_cb, iv_popup); + evas_object_smart_callback_add(entry, "changed", _ivug_rename_entry_changed, iv_popup); + + static Elm_Entry_Filter_Limit_Size limit_filter_data; + limit_filter_data.max_char_count = 64; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_smart_callback_add(entry, "maxlength,reached", _ivug_rename_maxlength_reached, (void *)iv_popup); + + evas_object_show(layout); + + Evas_Object *btn_ok = elm_button_add(popup); + elm_object_style_set(btn_ok, "popup_button/default"); + elm_object_text_set(btn_ok, IDS_OK); + elm_object_part_content_set(popup, "button1", btn_ok); + evas_object_data_set(btn_ok, "response", (void *)POPUP_RESPONSE_OK); + evas_object_smart_callback_add(btn_ok, "clicked", _ivug_rename_enter_click_cb, iv_popup); + + Evas_Object *btn_cancel = elm_button_add(popup); + elm_object_style_set(btn_cancel, "popup_button/default"); + elm_object_text_set(btn_cancel, IDS_CANCEL); + elm_object_part_content_set(popup, "button2", btn_cancel); + evas_object_data_set(btn_cancel, "response", (void *)POPUP_RESPONSE_CANCEL); + evas_object_smart_callback_add(btn_cancel, "clicked", _on_popup_response, iv_popup); + + iv_popup->popup = popup; + iv_popup->callback = response; + iv_popup->data = data; + iv_popup->obj = entry; + + evas_object_show(popup); + + return popup; + +ENTRY_POPUP_FREE: + if(popup) + { + evas_object_del(popup); + } + if(layout) + { + evas_object_del(layout); + } + if(entry) + { + evas_object_del(entry); + } + return NULL; +} + +static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + IV_ASSERT(data != NULL); + + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + Popup_Response response = (Popup_Response)evas_object_data_get(obj, "response"); + MSG_IMAGEVIEW_HIGH("response callback=%d", response); + + if(iv_popup->callback) + { + iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)response); + } + + ivug_popup_delete(iv_popup); +} + +static char * +_gl_text_get(void *data, Evas_Object *obj, const char *part) +{ + ivug_radio_popup_item *popup_item = (ivug_radio_popup_item *)data; + //int index = popup_item->index; + + if (strcmp(part, "elm.text") == 0) + { + return strdup(popup_item->name); + } + return NULL; +} + +static Evas_Object * +_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ + ivug_radio_popup_item *popup_item = (ivug_radio_popup_item *)data; + + Evas_Object *radio; + Evas_Object *radio_main = popup_item->radio_main; + int index = popup_item->index; + int selected_index = popup_item->p_iv_popup->selected_index; + + if (strcmp(part, "elm.icon") == 0 || strcmp(part, "elm.swallow.icon") == 0) + { + radio = elm_radio_add(obj); + elm_radio_state_value_set(radio, index); + elm_radio_group_add(radio, radio_main); + if (index == selected_index) + elm_radio_value_set(radio, selected_index); + evas_object_size_hint_weight_set(radio, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(radio, EVAS_HINT_FILL, EVAS_HINT_FILL); + + return radio; + } + + return NULL; +} + +static void +_gl_del(void *data, Evas_Object *obj) +{ + ivug_radio_popup_item *popup_item = (ivug_radio_popup_item *)data; + + if(popup_item->name) + { + free(popup_item->name); + popup_item->name = NULL; + } + + free(popup_item); + + return; +} + +static void +_gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + IV_ASSERT(data != NULL); + + Ivug_Popup *iv_popup = (Ivug_Popup *)data; + + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + ivug_radio_popup_item *popup_item = NULL; + + MSG_IMAGEVIEW_HIGH("_gl_sel"); + + if (item) + { + popup_item = (ivug_radio_popup_item *)elm_object_item_data_get(item); + iv_popup->selected_index = popup_item->index; + elm_genlist_item_update(item); + + if(iv_popup->callback) + { + iv_popup->callback(iv_popup->data, iv_popup->popup, (void *)iv_popup->selected_index); + } + + ivug_popup_delete(iv_popup); + } +} + +Evas_Object *ivug_radio_popoup_show(Evas_Object *parent, char *title, + int selected_index, Eina_List *name_list, Evas_Smart_Cb response, void *data) +{ +#define GET_POPUP_HEIGHT(icnt) (((113*icnt-1) > 408) ? (408) : (113*icnt-1)) +#define GET_POPUP_WIDTH(icnt) (614) + + Evas_Object *popup; + int index = 0; + Elm_Object_Item *item; + Evas_Object *genlist; + Evas_Object *btn_close; + Evas_Object *radio_main; + + static Elm_Genlist_Item_Class itc = {0,}; + + ivug_radio_popup_item *popup_item; + + Ivug_Popup *iv_popup = ivug_popup_create(); + + popup = elm_popup_add(parent); + elm_object_style_set(popup, "min_menustyle"); + elm_object_part_text_set(popup, "title,text", title); + evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, iv_popup); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + btn_close = elm_button_add(popup); + elm_object_style_set(btn_close, "popup_button/default"); + elm_object_text_set(btn_close, IDS_CLOSE); + elm_object_part_content_set(popup, "button1", btn_close); + evas_object_data_set(btn_close, "response", (void *)POPUP_RESPONSE_OK); + evas_object_smart_callback_add(btn_close, "clicked", _on_popup_response, iv_popup); + + itc.item_style = "1text.1icon.2"; + itc.func.text_get = _gl_text_get; + itc.func.content_get = _gl_content_get; + itc.func.state_get = NULL; + itc.func.del = _gl_del; + + genlist = elm_genlist_add(popup); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_propagate_events_set(genlist, EINA_FALSE); + + radio_main = elm_radio_add(genlist); + elm_radio_state_value_set(radio_main, -1); + elm_radio_value_set(radio_main, -1); + evas_object_propagate_events_set(radio_main, EINA_FALSE); + + Eina_List *l = NULL; + char *name = NULL; + + EINA_LIST_FOREACH(name_list, l, name) + { + popup_item = calloc(1, sizeof(ivug_radio_popup_item)); + popup_item->index = index++; + popup_item->name = strdup(name); + popup_item->radio_main = radio_main; + popup_item->p_iv_popup = iv_popup; + + item = elm_genlist_item_append(genlist, &itc, (void *)popup_item, NULL, + ELM_GENLIST_ITEM_NONE, _gl_sel, iv_popup); + } + + Evas_Object *box; + box = elm_box_add(popup); + evas_object_size_hint_min_set(box, GET_POPUP_WIDTH(index-1) * elm_config_scale_get(), GET_POPUP_HEIGHT(index-1) * elm_config_scale_get()); + evas_object_show(genlist); + elm_box_pack_end(box, genlist); + elm_object_content_set(popup, box); + //elm_object_content_set(popup, genlist); + + iv_popup->popup = popup; + iv_popup->callback = response; + iv_popup->data = data; + iv_popup->obj = radio_main; + iv_popup->selected_index = selected_index; + + evas_object_show(popup); + + return popup; +} + + |