From 2374802242cecda456ca133bbb0e2dac41e21cc4 Mon Sep 17 00:00:00 2001 From: Seunggyun Kim Date: Tue, 7 Sep 2010 11:00:44 +0900 Subject: [PATCH] [elm_genlist] add rename mode in edit mode --- src/lib/Elementary.h.in | 12 +- src/lib/elm_genlist.c | 288 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 272 insertions(+), 28 deletions(-) diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index 977522e..41f753b 100644 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -1151,7 +1151,8 @@ extern "C" { ELM_GENLIST_EDIT_MODE_REORDER = (1 << 0), ELM_GENLIST_EDIT_MODE_INSERT = (1 << 1), ELM_GENLIST_EDIT_MODE_DELETE = (1 << 2), - ELM_GENLIST_EDIT_MODE_SELECTALL = (1 << 3) + ELM_GENLIST_EDIT_MODE_SELECT = (1 << 3), + ELM_GENLIST_EDIT_MODE_SELECTALL = (1 << 4) }Elm_Genlist_Edit_Mode; typedef struct _Elm_Genlist_Item_Class Elm_Genlist_Item_Class; typedef struct _Elm_Genlist_Item Elm_Genlist_Item; @@ -1159,12 +1160,13 @@ extern "C" { typedef struct _Elm_Genlist_Item_Class_Func Elm_Genlist_Item_Class_Func; typedef struct _Elm_Genlist_Edit_Class Elm_Genlist_Edit_Class; typedef char *(*GenlistItemLabelGetFunc) (const void *data, Evas_Object *obj, const char *part); - typedef char *(*GenlistItemLabelChangedFunc) (const void *data, Evas_Object *obj, const char *text, const int sub_text); + typedef char *(*GenlistItemLabelChangedFunc) (const void *data, Elm_Genlist_Item *it, const char *text, const int sub_text ); typedef Evas_Object *(*GenlistItemIconGetFunc) (const void *data, Evas_Object *obj, const char *part); typedef Eina_Bool (*GenlistItemStateGetFunc) (const void *data, Evas_Object *obj, const char *part); typedef void (*GenlistItemDelFunc) (const void *data, Evas_Object *obj); typedef int (*GenlistItemEditModeGetFunc) (const void *data, Evas_Object *obj, const int enabled_edit_modes); typedef void (*GenlistInsertNewFunc) (Evas_Object *genlist, Elm_Genlist_Item *rel_item); + typedef void (*GenlistItemSelectedFunc) (const void *data, Evas_Object *obj); typedef Eina_Bool (*GenlistMoveFunc) ( Evas_Object *genlist, Elm_Genlist_Item *item, Elm_Genlist_Item *rel_item, Eina_Bool move_after); typedef Eina_Bool (*GenlistRemoveItemFunc) (Evas_Object *genlist, Elm_Genlist_Item *rel_item); @@ -1187,6 +1189,7 @@ extern "C" { GenlistRemoveItemFunc remove; GenlistInsertNewFunc insert_new; GenlistMoveFunc move; + GenlistItemSelectedFunc item_selected; }; EAPI Evas_Object *elm_genlist_add(Evas_Object *parent); EAPI Elm_Genlist_Item *elm_genlist_item_append(Evas_Object *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Genlist_Item *parent, Elm_Genlist_Item_Flags flags, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *func_data); @@ -1250,7 +1253,10 @@ extern "C" { EINA_DEPRECATED EAPI void elm_genlist_set_edit_mode(Evas_Object *obj, int emode, Elm_Genlist_Edit_Class *ec); EAPI void elm_genlist_edit_mode_set(Evas_Object *obj, int emode, Elm_Genlist_Edit_Class *ec); EAPI int elm_genlist_item_expanded_depth_get(Elm_Genlist_Item *it); - EAPI void elm_genlist_selected_items_del(Evas_Object *obj); + EAPI void elm_genlist_edit_selected_items_del(Evas_Object *obj); + EAPI Eina_List * elm_genlist_edit_selected_items_get(const Evas_Object *obj); + EAPI void elm_genlist_item_rename_mode_set(Elm_Genlist_Item *it, int emode); + EAPI Evas_Object *elm_check_add(Evas_Object *parent); EAPI void elm_check_label_set(Evas_Object *obj, const char *label); diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 9c1ea82..1421686 100755 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -287,6 +287,7 @@ struct _Widget_Data Evas_Coord prev_multi_x, prev_multi_y; Eina_Bool multi_down : 1; Eina_Bool multi_touch : 1; + Eina_List *edit_field; }; struct _Edit_Data { @@ -332,7 +333,7 @@ struct _Elm_Genlist_Item } func; Evas_Object *base, *spacer, *edit_obj; - Eina_List *labels, *icons, *states, *icon_objs; + Eina_List *labels, *icons, *states, *icon_objs, *edit_icon_objs; Ecore_Timer *long_timer, *edit_long_timer; Evas_Coord dx, dy, scrl_x, scrl_y; Evas_Coord reoder_cavas_x, reoder_cavas_y; @@ -362,6 +363,7 @@ struct _Elm_Genlist_Item Eina_Bool menuopened : 1; Eina_Bool select_all_item : 1; Eina_Bool reorder_check: 1; + Eina_Bool renamed : 1; int pad_left, pad_right; int depth; @@ -1006,6 +1008,10 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_inf if( it->wd->edit_mode != ELM_GENLIST_EDIT_MODE_NONE ) (void)_edit_mode_reset( it->wd ); if (ev->button != 1) return; + + if(it->wd->edit_field && !it->renamed) + elm_genlist_item_rename_mode_set(it, 0); + it->down = 1; it->dragging = 0; evas_object_geometry_get(obj, &x, &y, NULL, NULL); @@ -1564,6 +1570,9 @@ _item_unrealize(Elm_Genlist_Item *it) EINA_LIST_FREE(it->icon_objs, icon) evas_object_del(icon); + EINA_LIST_FREE(it->edit_icon_objs, icon) + evas_object_del(icon); + it->states = NULL; it->realized = EINA_FALSE; it->want_unrealize = EINA_FALSE; @@ -1727,7 +1736,13 @@ _remove_item_cb(void *data, Evas_Object *obj, const char *emission, const char * it->delete_check = 0; edje_object_signal_emit(it->edit_obj, "elm,state,del,animated,enable", "elm"); it->wd->selct_all = 0; - edje_object_signal_emit(it->wd->select_all_item->base, "elm,state,del,animated,enable", "elm"); + if(it->wd->select_all_item) + edje_object_signal_emit(it->wd->select_all_item->base, "elm,state,del,animated,enable", "elm"); + + if (!it->wd->selct_all && it->wd->ed->ec->item_selected) + { + it->wd->ed->ec->item_selected(it->data, it->wd->obj); + } return; } @@ -1736,6 +1751,11 @@ _remove_item_cb(void *data, Evas_Object *obj, const char *emission, const char * it->wd->ed->del_item = it; + if (!it->wd->selct_all && it->wd->ed->ec->item_selected) + { + it->wd->ed->ec->item_selected(it->data, it->wd->obj); + } + del_conf_style = edje_object_data_get(it->edit_obj, "del_button_style"); if(del_conf_style ) elm_object_style_set( it->wd->ed->del_confirm, del_conf_style); @@ -1783,6 +1803,15 @@ _reorder_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *e Evas_Event_Mouse_Down *ev = event_info; Evas_Coord x, y; + if(!elm_genlist_item_next_get(it)) + return; + + if(it->wd->edit_field && !it->renamed) + elm_genlist_item_rename_mode_set(it, 0); + + if(!(it->wd->edit_mode & ELM_GENLIST_EDIT_MODE_REORDER)) + return; + if(_edit_mode_reset( it->wd ) ) return; @@ -1947,6 +1976,11 @@ _select_all_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *even wd->selct_all ^= 0xFF; + if (wd->ed->ec->item_selected) + { + wd->ed->ec->item_selected(NULL, wd->obj); + } + if (wd->calc_job) ecore_job_del(wd->calc_job); wd->calc_job = ecore_job_add(_calc_job, wd); } @@ -1970,7 +2004,7 @@ _edit_controls_eval( Elm_Genlist_Item *it ) int pad = 0; it->pad_left = 0; it->pad_right = 0; - + Evas_Object *icon; if( it->wd->edit_mode == ELM_GENLIST_EDIT_MODE_NONE && !it->edit_obj ) return; @@ -1980,7 +2014,7 @@ _edit_controls_eval( Elm_Genlist_Item *it ) itmode &= it->wd->edit_mode; if(itmode & ELM_GENLIST_EDIT_MODE_SELECTALL) - itmode |= ELM_GENLIST_EDIT_MODE_DELETE; + itmode |= ELM_GENLIST_EDIT_MODE_SELECT; if( !it->edit_obj ) { @@ -2020,7 +2054,7 @@ _edit_controls_eval( Elm_Genlist_Item *it ) "elm", _insert_new_item_cb ); } - if( (itmode & ELM_GENLIST_EDIT_MODE_DELETE) ) + if( (itmode & ELM_GENLIST_EDIT_MODE_DELETE) || (itmode & ELM_GENLIST_EDIT_MODE_SELECT) ) { if(it->wd->animate_edit_controls) edje_object_signal_emit(it->edit_obj, "elm,state,del,animated,enable", "elm"); @@ -2033,6 +2067,8 @@ _edit_controls_eval( Elm_Genlist_Item *it ) edje_object_signal_callback_add(it->edit_obj, "elm,action,hide,del_confirm", "elm", _hide_delete_confirm_object, it ); it->pad_left += pad; + evas_object_event_callback_add(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN, + _reorder_mouse_down, it); } else { @@ -2077,15 +2113,57 @@ _edit_controls_eval( Elm_Genlist_Item *it ) { reorder_icon = edje_object_part_object_get(it->edit_obj, reorder_part ); + if(itmode == ELM_GENLIST_EDIT_MODE_NONE) + { evas_object_event_callback_del(it->edit_obj, EVAS_CALLBACK_MOUSE_DOWN, _reorder_mouse_down); evas_object_event_callback_del(it->edit_obj, EVAS_CALLBACK_MOUSE_UP, _reorder_mouse_up); evas_object_event_callback_del(it->edit_obj, EVAS_CALLBACK_MOUSE_MOVE, _reorder_mouse_move); + } } } + if( it->wd->edit_mode != 0xF0) { + if( it->wd->edit_mode != ELM_GENLIST_EDIT_MODE_NONE) + { + if (it->itc->func.icon_get) + { + edje_object_signal_emit(it->edit_obj, "elm,state,edit_end,enable", "elm"); + + const Eina_List *l; + const char *key; + + it->icons = _elm_stringlist_get(edje_object_data_get(it->edit_obj, "icons")); + EINA_LIST_FOREACH(it->icons, l, key) + { + Evas_Object *ic = it->itc->func.icon_get(it->data, it->wd->obj, l->data); + + if (ic) + { + it->edit_icon_objs = eina_list_append(it->edit_icon_objs, ic); + edje_object_part_swallow(it->edit_obj, key, ic); + evas_object_show(ic); + // elm_widget_sub_object_add(it->wd->obj, ic); + } + } + } + } + else + { + edje_object_signal_emit(it->edit_obj, "elm,state,edit_end,disable", "elm"); + EINA_LIST_FREE(it->edit_icon_objs, icon) + evas_object_del(icon); + + Evas_Object *editfield; + EINA_LIST_FREE(it->wd->edit_field, editfield) + evas_object_del(editfield); + + + } + } + if( it->wd->edit_mode == ELM_GENLIST_EDIT_MODE_NONE )//Unrealize { evas_object_del(it->edit_obj); @@ -2126,6 +2204,8 @@ _get_space_for_reorder_item( Elm_Genlist_Item *it ) { int top=0; Evas_Coord rox, roy, row, roh; + if(!it->wd->ed) + return 0; if( !(it->wd->edit_mode & ELM_GENLIST_EDIT_MODE_REORDER ) || !it->wd->ed->reorder_item ) return 0; @@ -4608,7 +4688,7 @@ elm_genlist_set_edit_mode(Evas_Object *obj, int emode, Elm_Genlist_Edit_Class *e * This sets Genlist edit mode. * * @param obj The Genlist object - * @param emode ELM_GENLIST_EDIT_MODE_{NONE & REORDER & INSERT & DELETE} + * @param emode ELM_GENLIST_EDIT_MODE_{NONE & REORDER & INSERT & DELETE & SELECT & SELECT_ALL} * @param edit_class Genlist edit class (Elm_Genlist_Edit_Class structure) * * @ingroup Genlist @@ -4634,7 +4714,7 @@ elm_genlist_edit_mode_set(Evas_Object *obj, int emode, Elm_Genlist_Edit_Class *e wd->animate_edit_controls = 1; if(wd->edit_mode & ELM_GENLIST_EDIT_MODE_SELECTALL) - wd->edit_mode |= ELM_GENLIST_EDIT_MODE_DELETE; + wd->edit_mode |= ELM_GENLIST_EDIT_MODE_SELECT; if( wd->edit_mode == ELM_GENLIST_EDIT_MODE_NONE) { @@ -4648,7 +4728,7 @@ elm_genlist_edit_mode_set(Evas_Object *obj, int emode, Elm_Genlist_Edit_Class *e wd->ed->ec = edit_class; - if( (wd->edit_mode & ELM_GENLIST_EDIT_MODE_DELETE) && !wd->ed->del_confirm) + if( ((wd->edit_mode & ELM_GENLIST_EDIT_MODE_DELETE) || (wd->edit_mode & ELM_GENLIST_EDIT_MODE_SELECT)) && !wd->ed->del_confirm) { wd->ed->del_confirm = elm_button_add(wd->obj); elm_button_label_set(wd->ed->del_confirm, "Delete"); @@ -4668,12 +4748,12 @@ elm_genlist_edit_mode_set(Evas_Object *obj, int emode, Elm_Genlist_Edit_Class *e it->delete_check = 0; it->del_confirm_state = 0; + _item_unselect(it); _edit_controls_eval(it); } } -// if(wd->edit_mode & ELM_GENLIST_EDIT_MODE_SELECTALL) { - if(wd->edit_mode & ELM_GENLIST_EDIT_MODE_SELECTALL || wd->edit_mode & ELM_GENLIST_EDIT_MODE_DELETE) { // temp fix + if(wd->edit_mode & ELM_GENLIST_EDIT_MODE_SELECTALL) { itc.item_style = "select_all"; itc.func.label_get = NULL; itc.func.icon_get = NULL; @@ -4695,8 +4775,10 @@ elm_genlist_edit_mode_set(Evas_Object *obj, int emode, Elm_Genlist_Edit_Class *e } else { - if(wd->select_all_item) - elm_genlist_item_del(wd->select_all_item); + if(wd->select_all_item) { + if (wd->select_all_item->realized) _item_unrealize(wd->select_all_item); + free(wd->select_all_item); + } wd->select_all_item = NULL; } @@ -4721,6 +4803,7 @@ elm_genlist_item_expanded_depth_get(Elm_Genlist_Item *it) return it->depth; } + /** * Delete selected items in genlist edit mode. * @@ -4729,43 +4812,59 @@ elm_genlist_item_expanded_depth_get(Elm_Genlist_Item *it) * @ingroup Genlist */ EAPI void -elm_genlist_selected_items_del(Evas_Object *obj) +elm_genlist_edit_selected_items_del(Evas_Object *obj) { Elm_Genlist_Item *it; Eina_List *l, *realized_list; + Item_Block *itb; ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - realized_list = elm_genlist_realized_items_get(obj); - EINA_LIST_FOREACH(realized_list, l, it) - { - if (it->delete_check) - elm_genlist_item_del( it ); - } + EINA_INLIST_FOREACH(wd->blocks, itb) + { + if (itb->realized) + { + EINA_LIST_FOREACH(itb->items, l, it) + { + if (it->delete_check) + elm_genlist_item_del( it ); + } + } + } if (wd->calc_job) ecore_job_del(wd->calc_job); wd->calc_job = ecore_job_add(_calc_job, wd); } +EAPI void +elm_genlist_selected_items_del(Evas_Object *obj) +{ + fprintf(stderr, "=================> Caution!!! <========================\n"); + fprintf(stderr, "==> elm_genlist_selected_items_del() is deprecated. <=======\n"); + fprintf(stderr, "==> Please use elm_genlist_edit_selected_items_del() instead. <==\n"); + fprintf(stderr, "=======================================================\n"); + elm_genlist_edit_selected_items_del(obj); +} + + /** - * Get a list of checked items in genlist + * Get a list of selected items in genlist * - * This returns a list of the checked items in the genlist. The list + * This returns a list of the selected items in the genlist. The list * contains Elm_Genlist_Item pointers. The list must be freed by the * caller when done with eina_list_free(). The item pointers in the list * are only vallid so long as those items are not deleted or the genlist is * not deleted. * * @param obj The genlist object - * @return The list of checked items, nor NULL if none are checked. + * @return The list of selected items, nor NULL if none are selected. * * @ingroup Genlist */ - /* EAPI Eina_List * -elm_genlist_edit_checked_items_get(const Evas_Object *obj) +elm_genlist_edit_selected_items_get(const Evas_Object *obj) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); @@ -4793,5 +4892,144 @@ elm_genlist_edit_checked_items_get(const Evas_Object *obj) } return list; } -*/ +/** + * Set a given item's rename mode + * + * This renames the item's label from genlist + * + * @param it The item + * @param emode set if emode is EINA_TRUE, unset if emode is EINA_FALSE + * + * @ingroup Genlist + */ +EAPI void +elm_genlist_item_rename_mode_set(Elm_Genlist_Item *it, int emode) +{ + if (!it) return; + + const Eina_List *l, *list, *l2; + const char *label, *rename_swallow_part, *s; + Eina_Bool done = EINA_FALSE; + int label_cnt = 0 , swallow_part_cnt = 0; + + Item_Block *itb; + Evas_Object *editfield; + Evas_Object *entry; + int edit_field_cnt = 0; + + if(it->wd->edit_mode == ELM_GENLIST_EDIT_MODE_NONE) + { + it->wd->edit_mode = 0xF0; + _edit_controls_eval(it); + } + + EINA_INLIST_FOREACH(it->wd->blocks, itb) + { + if (itb->realized) + { + Eina_List *l; + Elm_Genlist_Item *it; + + done = EINA_TRUE; + EINA_LIST_FOREACH(itb->items, l, it) + { + if (it->renamed) { + it->renamed = EINA_FALSE; + + + EINA_LIST_FOREACH(it->wd->edit_field, l2, editfield) + { + entry = elm_editfield_entry_get(editfield); + char *text = elm_entry_entry_get(entry); + + if( it->itc->func.label_changed ) + it->itc->func.label_changed( it->data, it, text, edit_field_cnt++); + } + Ecore_IMF_Context *imf = elm_entry_imf_context_get(entry); + ecore_imf_context_input_panel_hide(imf); + + Evas_Object *editfield; + EINA_LIST_FREE(it->wd->edit_field, editfield) + evas_object_del(editfield); + + if(it->wd->edit_mode) { + if( (it->wd->edit_mode & ELM_GENLIST_EDIT_MODE_INSERT) ) + edje_object_signal_emit(it->edit_obj, "elm,state,ins,enable", "elm"); + + if( (it->wd->edit_mode & ELM_GENLIST_EDIT_MODE_DELETE) || (it->wd->edit_mode & ELM_GENLIST_EDIT_MODE_SELECT) ) + edje_object_signal_emit(it->edit_obj, "elm,state,del,enable", "elm"); + + if( (it->wd->edit_mode & ELM_GENLIST_EDIT_MODE_REORDER) ) + edje_object_signal_emit(it->edit_obj, "elm,state,rename,disable", "elm"); + } + if(it->edit_obj) + { + evas_object_del(it->edit_obj); + it->edit_obj = NULL; + } + + } + } + } + else + { + if (done) break; + } + } + +// if(emode != ELM_GENLIST_RENAME_MODE_NONE) + if(emode != 0) + { + it->renamed = EINA_TRUE; + + it->labels = _elm_stringlist_get(edje_object_data_get(it->base, "labels")); + EINA_LIST_FOREACH(it->labels, list, label) + { + edje_object_signal_emit(it->edit_obj, "elm,state,rename,enable", "elm"); + edje_object_signal_emit(it->edit_obj, "elm,state,ins,disable", "elm"); + edje_object_signal_emit(it->edit_obj, "elm,state,del,disable", "elm"); + edje_object_signal_emit(it->edit_obj, "elm,state,edit_end,disable", "elm"); + + if (it->itc->func.label_get) + { + it->renamed = EINA_TRUE; + swallow_part_cnt = 0; + + Eina_List *rename = _elm_stringlist_get(edje_object_data_get(it->edit_obj, "rename")); + EINA_LIST_FOREACH(rename, l, rename_swallow_part) + { + if(label_cnt == swallow_part_cnt) { + editfield = elm_editfield_add(it->wd->obj); + it->wd->edit_field = eina_list_append(it->wd->edit_field, editfield); + + + elm_editfield_entry_single_line_set(editfield, EINA_TRUE); + elm_editfield_eraser_set(editfield, EINA_TRUE); + edje_object_part_swallow(it->edit_obj, rename_swallow_part, editfield); + + evas_object_show(editfield); + + s = it->itc->func.label_get(it->data, it->wd->obj, list->data); + + if (s) + { + Evas_Object *entry = elm_editfield_entry_get(editfield); + elm_entry_entry_set(entry,s); + + free(s); + } + else + elm_editfield_guide_text_set(editfield, "Text Input"); + } + swallow_part_cnt++; + } + label_cnt++; + } + } + } + + if(it->wd->edit_mode == 0xF0) { + it->wd->edit_mode = 0; + } +} -- 2.7.4