elm_web2: Implement select popup interfaces

This commit is contained in:
Ryuan Choi 2014-04-17 00:32:18 +09:00
parent 2a9cd79e6d
commit ed8969e557
1 changed files with 133 additions and 0 deletions

View File

@ -75,6 +75,137 @@ _view_smart_window_close(Ewk_View_Smart_Data *sd)
evas_object_smart_callback_call(obj, "windows,close,request", NULL);
}
static void
_popup_item_selected(void *data,
Evas_Object *obj,
void *event_info EINA_UNUSED)
{
Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
const Eina_List *itr, *list = elm_list_items_get(obj);
Ewk_Popup_Menu *menu = data;
int i = 0;
void *d;
EINA_LIST_FOREACH(list, itr, d)
{
if (d == list_it)
break;
i++;
}
ewk_popup_menu_selected_index_set(menu, i);
ewk_popup_menu_close(menu);
evas_object_del(evas_object_data_get(obj, "_notify"));
}
static void
_popup_dismiss_cb(void *data,
Evas_Object *obj,
void *event_info EINA_UNUSED)
{
ewk_popup_menu_close(data);
evas_object_del(obj);
}
static Eina_Bool
_view_smart_popup_menu_show(Ewk_View_Smart_Data *sd,
Eina_Rectangle r,
Ewk_Text_Direction dir EINA_UNUSED,
double scale EINA_UNUSED,
Ewk_Popup_Menu *menu)
{
Evas_Object *notify, *list, *grid, *win;
const Eina_List* items = ewk_popup_menu_items_get(menu);
Evas_Object *obj = evas_object_smart_parent_get(sd->self);
int h, ww, wh;
Elm_Object_Item *lit;
Eina_Bool disabled;
const char *txt;
Ewk_Popup_Menu_Item *it;
const Eina_List *itr;
Evas_Object *popup = evas_object_data_get(sd->self, "_select_popup");
if (popup) evas_object_del(popup);
win = elm_widget_top_get(obj);
notify = elm_notify_add(win);
elm_notify_allow_events_set(notify, EINA_FALSE);
elm_notify_align_set(notify, 0.5, 1.0);
list = elm_list_add(notify);
evas_object_data_set(list, "_notify", notify);
elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS);
elm_scroller_bounce_set(list, EINA_FALSE, EINA_FALSE);
elm_list_mode_set(list, ELM_LIST_EXPAND);
evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(list);
EINA_LIST_FOREACH(items, itr, it)
{
switch (ewk_popup_menu_item_type_get(it))
{
case EWK_POPUP_MENU_SEPARATOR:
// TODO:
break;
case EWK_POPUP_MENU_ITEM:
txt = ewk_popup_menu_item_text_get(it);
if (ewk_popup_menu_item_is_label_get(it))
{
lit = elm_list_item_append(list, txt, NULL, NULL, NULL, NULL);
disabled = EINA_TRUE;
}
else
{
lit = elm_list_item_append(list, txt, NULL, NULL, _popup_item_selected, menu);
disabled = !ewk_popup_menu_item_enabled_get(it);
}
elm_object_item_disabled_set(lit, disabled);
break;
default:
break;
}
}
elm_list_go(list);
grid = elm_grid_add(win);
elm_grid_size_set(grid, 1, 1);
elm_grid_pack(grid, list, 0, 0, 1, 1);
evas_object_geometry_get(win, NULL, NULL, &ww, &wh);
//FIXME: it should be the real height of items in the list.
h = r.h * eina_list_count(items);
evas_object_size_hint_min_set(grid, ww, h < wh / 2 ? h : wh / 2);
elm_object_content_set(notify, grid);
evas_object_show(grid);
evas_object_show(notify);
evas_object_data_set(sd->self, "_select_popup", notify);
evas_object_smart_callback_add
(notify, "block,clicked", _popup_dismiss_cb, menu);
return EINA_TRUE;
}
static Eina_Bool
_view_smart_popup_menu_hide(Ewk_View_Smart_Data *sd)
{
Evas_Object *popup = evas_object_data_get(sd->self, "_select_popup");
if (!popup) return EINA_FALSE;
evas_object_del(popup);
evas_object_data_del(sd->self, "_select_popup");
return EINA_TRUE;
}
static void
_fullscreen_accept(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED)
{
@ -173,6 +304,8 @@ _view_add(Evas_Object *parent)
api.sc.del = _view_smart_del;
api.window_create = _view_smart_window_create;
api.window_close = _view_smart_window_close;
api.popup_menu_show = _view_smart_popup_menu_show;
api.popup_menu_hide = _view_smart_popup_menu_hide;
api.fullscreen_enter = _view_smart_fullscreen_enter;
api.fullscreen_exit = _view_smart_fullscreen_exit;