From e66d922a785ba2f8fa910860c3a38ee57ab03327 Mon Sep 17 00:00:00 2001 From: ryuan Date: Mon, 15 Apr 2013 13:44:27 +0900 Subject: [PATCH] Refactor ewk_popup_picker [Title] Refactor ewk_popup_picker [Issue#] N/A [Problem] elm_genlist_item_index_get is not good function because it is based on loop. [Cause] N/A [Solution] N/A 1. Removed duplicated function, menuItemDeactivated. 2. Rename menuItemActivated because it is not for activation. 3. Tried not to call elm_genlist_item_index_get. 4. Removed unnecessary macro in labelGet. 5. Deleted unselect callback when destroyed. 6. Reorder member of _Ewk_Popup_Picker. Change-Id: I37b31f61d929ada9c5f9ad89f6476bf1414d0be1 --- .../UIProcess/API/efl/tizen/ewk_popup_picker.cpp | 75 ++++++++++------------ .../UIProcess/API/efl/tizen/ewk_popup_picker.h | 14 +++- 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp index 88fe46b..30c4285 100644 --- a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp +++ b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp @@ -38,19 +38,20 @@ int compareChangedItems(const void* a, const void* b) } #endif -void menuItemActivated(void* data, Evas_Object* obj, void* event_info) +void menuItemToggled(void* data, Evas_Object* obj, void* event_info) { Ewk_Popup_Picker* picker = static_cast(data); Elm_Object_Item* selected = static_cast(event_info); - int index = elm_genlist_item_index_get(selected); + MenuItemData* menuItems = static_cast(elm_object_item_data_get(selected)); + int index = menuItems->index; #if ENABLE(TIZEN_MULTIPLE_SELECT) if (picker->multiSelect) { - int pos = eina_inarray_search(picker->changedList, &index, compareChangedItems); + int pos = eina_inarray_search(picker->toggledItems, &index, compareChangedItems); if (pos == -1) - eina_inarray_push(picker->changedList, &index); + eina_inarray_push(picker->toggledItems, &index); else - eina_inarray_remove(picker->changedList, &index); + eina_inarray_remove(picker->toggledItems, &index); return; } @@ -59,49 +60,33 @@ void menuItemActivated(void* data, Evas_Object* obj, void* event_info) ewk_view_popup_menu_select(picker->parent, index); } -#if ENABLE(TIZEN_MULTIPLE_SELECT) -void menuItemDeactivated(void* data, Evas_Object* obj, void* event_info) -{ - Ewk_Popup_Picker* picker = static_cast(data); - Elm_Object_Item* deselectedItem = static_cast(event_info); - - int deselectedIndex = elm_genlist_item_index_get(deselectedItem); - int pos = eina_inarray_search(picker->changedList, &deselectedIndex, compareChangedItems); - - if (pos == -1) - eina_inarray_push(picker->changedList, &deselectedIndex); - else - eina_inarray_remove(picker->changedList, &deselectedIndex); -} -#endif - void listClosed(void *data, Evas_Object *obj, const char *emission, const char *source) { Ewk_Popup_Picker* picker = static_cast(data); #if ENABLE(TIZEN_MULTIPLE_SELECT) if (picker->multiSelect) - ewk_view_popup_menu_multiple_select(picker->parent, picker->changedList); + ewk_view_popup_menu_multiple_select(picker->parent, picker->toggledItems); else ewk_view_popup_menu_select(picker->parent, picker->selectedIndex); - eina_inarray_free(picker->changedList); + eina_inarray_free(picker->toggledItems); #else ewk_view_popup_menu_select(picker->parent, picker->selectedIndex); - #endif + ewk_view_popup_menu_close(picker->parent); } static char* _listLabelGet(void* data, Evas_Object* obj, const char* part) { - Ewk_Popup_Menu_Item* menuItem = static_cast(data); + MenuItemData* menuItems = static_cast(data); + if (!menuItems || strncmp(part, "elm.text", strlen("elm.text"))) + return 0; + + const char* label = ewk_popup_menu_item_text_get(menuItems->item); + if (label) + return strdup(label); -#if ENABLE(TIZEN_MULTIPLE_SELECT) - if (!strncmp(part, "elm.text", strlen("elm.text")) && ewk_popup_menu_item_text_get(menuItem)) -#else - if (!strncmp(part, "elm.text", strlen("elm.text"))) -#endif - return strdup(ewk_popup_menu_item_text_get(menuItem)); return 0; } @@ -114,10 +99,15 @@ static void createAndShowPopupList(Ewk_Popup_Picker* picker, Evas_Object* parent #if ENABLE(TIZEN_MULTIPLE_SELECT) if (picker->multiSelect) { - eina_inarray_flush(picker->changedList); + eina_inarray_flush(picker->toggledItems); elm_genlist_multi_select_set(picker->popupList, true); } #endif + + if (picker->menuItems) + delete [] picker->menuItems; + picker->menuItems = new MenuItemData[eina_list_count(items)]; + static Elm_Genlist_Item_Class itemClass; itemClass.item_style = "1text"; @@ -133,25 +123,27 @@ static void createAndShowPopupList(Ewk_Popup_Picker* picker, Evas_Object* parent int index = 0; EINA_LIST_FOREACH(items, l, itemv) { Ewk_Popup_Menu_Item* menuItem = static_cast(itemv); + picker->menuItems[index].index = index; + picker->menuItems[index].item = menuItem; - Elm_Object_Item* itemObject = elm_genlist_item_append(picker->popupList, &itemClass, menuItem, 0, ELM_GENLIST_ITEM_NONE, 0, 0); + Elm_Object_Item* objectItem = elm_genlist_item_append(picker->popupList, &itemClass, picker->menuItems + index, 0, ELM_GENLIST_ITEM_NONE, 0, 0); if (!index) - picker->firstItem = itemObject; + picker->firstItem = objectItem; #if ENABLE(TIZEN_MULTIPLE_SELECT) if (menuItem->isSelected) #else if (selectedIndex == index) #endif - elm_genlist_item_selected_set(itemObject, true); + elm_genlist_item_selected_set(objectItem, true); if (!menuItem->isEnabled) - elm_object_item_disabled_set(itemObject, EINA_TRUE); + elm_object_item_disabled_set(objectItem, EINA_TRUE); index++; } - evas_object_smart_callback_add(picker->popupList, "selected", menuItemActivated, picker); + evas_object_smart_callback_add(picker->popupList, "selected", menuItemToggled, picker); #if ENABLE(TIZEN_MULTIPLE_SELECT) if (picker->multiSelect) - evas_object_smart_callback_add(picker->popupList, "unselected", menuItemDeactivated, picker); + evas_object_smart_callback_add(picker->popupList, "unselected", menuItemToggled, picker); #endif elm_object_focus_allow_set(picker->popupList, false); evas_object_show(picker->popupList); @@ -184,8 +176,9 @@ Ewk_Popup_Picker* ewk_popup_picker_new(Evas_Object* parent, Eina_List* items, in #if ENABLE(TIZEN_MULTIPLE_SELECT) picker->multiSelect = multiple; - picker->changedList = eina_inarray_new(sizeof(int), 0); + picker->toggledItems = eina_inarray_new(sizeof(int), 0); #endif + picker->menuItems = 0; picker->container = elm_layout_add(parent); if (!elm_layout_file_set(picker->container, EDJE_DIR"/control.edj", "elm/picker")) LOG_ERROR("Error! : %s, %s\n", EDJE_DIR"/control.edj", "elm/picker"); @@ -211,9 +204,11 @@ void ewk_popup_picker_resize(Ewk_Popup_Picker* picker) void ewk_popup_picker_del(Ewk_Popup_Picker* picker) { - evas_object_smart_callback_del(picker->popupList, "selected", menuItemActivated); + evas_object_smart_callback_del(picker->popupList, "selected", menuItemToggled); + evas_object_smart_callback_del(picker->popupList, "unselected", menuItemToggled); evas_object_del(picker->popupList); evas_object_del(picker->container); + delete [] picker->menuItems; picker->popupList = 0; picker->firstItem = 0; delete picker; diff --git a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h index 26f959f..172a12c 100644 --- a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h +++ b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h @@ -28,19 +28,29 @@ typedef struct _Eina_Inarray Eina_Inarray; #endif namespace WebKit { -class WebPopupMenuProxyEfl; + class WebPopupMenuProxyEfl; } +class Ewk_Popup_Menu_Item; + +struct _MenuItemData { + int index; + Ewk_Popup_Menu_Item* item; +}; +typedef _MenuItemData MenuItemData; + struct _Ewk_Popup_Picker { Evas_Object* container; Evas_Object* parent; Evas_Object* popupList; Elm_Object_Item* firstItem; + MenuItemData* menuItems; int selectedIndex; #if ENABLE(TIZEN_MULTIPLE_SELECT) + Eina_Inarray* toggledItems; /**< Array to collect items that status was changed */ Eina_Bool multiSelect; - Eina_Inarray* changedList; #endif + }; typedef struct _Ewk_Popup_Picker Ewk_Popup_Picker; -- 2.7.4