genlist: Implemented genlist expand mode and content_min_limit function

Summary:
1. Implemented genlist mode ELM_LIST_EXPAND
2. Implemented content_min_limit function which override scroll interface.
  This function will be used by call API elm_scroller_content_min_limit.
  This function will set the object minimum size as its scroll content size,
  if parameter value is EINA_TRUE.

@feature

Test Plan: Add new test case in test_popup.c

Reviewers: raster, seoz

Subscribers: stefan_schmidt, bluezery

Differential Revision: https://phab.enlightenment.org/D1279
This commit is contained in:
VBS 2015-03-03 19:58:40 +09:00 committed by Carsten Haitzler (Rasterman)
parent 9f1dba2909
commit 93f0745430
3 changed files with 115 additions and 2 deletions

View File

@ -594,6 +594,14 @@ _list_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
evas_object_del(data);
}
char *
gl_popup_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
{
char buf[256];
snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data);
return strdup(buf);
}
static void
_popup_center_title_list_content_1button_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
@ -623,6 +631,54 @@ _popup_center_title_list_content_1button_cb(void *data, Evas_Object *obj EINA_UN
evas_object_show(popup);
}
static void
_popup_center_title_genlist_content_1button_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *popup, *genlist;
Evas_Object *btn;
int i;
popup = elm_popup_add(data);
elm_object_part_text_set(popup, "title,text", "Title");
Elm_Genlist_Item_Class *itc1 = elm_genlist_item_class_new();
itc1->item_style = "default";
itc1->func.text_get = gl_popup_text_get;
itc1->func.content_get = NULL;
itc1->func.state_get = NULL;
itc1->func.del = NULL;
// genlist as a popup content
genlist = elm_genlist_add(popup);
elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
elm_scroller_content_min_limit(genlist, EINA_FALSE, EINA_TRUE);
for (i = 0; i < 10; i++)
{
elm_genlist_item_append(genlist,
itc1,
(void *)(uintptr_t)i/* item data */,
NULL/* parent */,
ELM_GENLIST_ITEM_NONE,
NULL,
NULL);
}
elm_genlist_item_class_free(itc1);
elm_object_content_set(popup, genlist);
// popup buttons
btn = elm_button_add(popup);
elm_object_text_set(btn, "OK");
elm_object_part_content_set(popup, "button1", btn);
evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup);
// popup show should be called after adding all the contents and the buttons
// of popup to set the focus into popup's contents correctly.
evas_object_show(popup);
}
static void
_subpopup_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
@ -720,6 +776,9 @@ test_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
elm_list_item_append(list, "popup-center-title + list content + 1 button",
NULL, NULL, _popup_center_title_list_content_1button_cb,
win);
elm_list_item_append(list, "popup-center-title + genlist content + 1 button",
NULL, NULL, _popup_center_title_genlist_content_1button_cb,
win);
elm_list_item_append(list, "subpopup + X button",
NULL, NULL, _subpopup_cb,
win);

View File

@ -840,21 +840,51 @@ _elm_genlist_elm_layout_sizing_eval(Eo *obj, Elm_Genlist_Data *sd)
minw = vmw;
minh = vmh;
}
else if (sd->mode == ELM_LIST_LIMIT)
if (sd->scr_minw)
{
maxw = -1;
minw = vmw + sd->realminw;
}
else
{
minw = vmw;
}
if (sd->scr_minh)
{
maxh = -1;
minh = vmh + sd->minh;
}
else
{
minw = vmw;
minh = vmh;
}
if ((maxw > 0) && (minw > maxw))
minw = maxw;
if ((maxh > 0) && (minh > maxh))
minh = maxh;
evas_object_size_hint_min_set(obj, minw, minh);
evas_object_size_hint_max_set(obj, maxw, maxh);
}
static void
_content_min_limit_cb(Evas_Object *obj,
Eina_Bool w,
Eina_Bool h)
{
ELM_GENLIST_DATA_GET(obj, sd);
if ((sd->mode == ELM_LIST_LIMIT) ||
(sd->mode == ELM_LIST_EXPAND)) return;
sd->scr_minw = !!w;
sd->scr_minh = !!h;
elm_layout_sizing_eval(obj);
}
static void
_item_contract_emit(Elm_Object_Item *eo_it)
{
@ -5387,7 +5417,8 @@ _elm_genlist_evas_object_smart_add(Eo *obj, Elm_Genlist_Data *priv)
elm_interface_scrollable_vbar_unpress_cb_set(_vbar_unpress_cb),
elm_interface_scrollable_hbar_drag_cb_set(_hbar_drag_cb),
elm_interface_scrollable_hbar_press_cb_set(_hbar_press_cb),
elm_interface_scrollable_hbar_unpress_cb_set(_hbar_unpress_cb));
elm_interface_scrollable_hbar_unpress_cb_set(_hbar_unpress_cb),
elm_interface_scrollable_content_min_limit_cb_set(_content_min_limit_cb));
priv->mode = ELM_LIST_SCROLL;
priv->max_items_per_block = MAX_ITEMS_PER_BLOCK;
@ -7076,6 +7107,23 @@ _elm_genlist_mode_set(Eo *obj, Elm_Genlist_Data *sd, Elm_List_Mode mode)
{
if (sd->mode == mode) return;
sd->mode = mode;
if (sd->mode == ELM_LIST_LIMIT)
{
sd->scr_minw = EINA_TRUE;
sd->scr_minh = EINA_FALSE;
}
else if (sd->mode == ELM_LIST_EXPAND)
{
sd->scr_minw = EINA_TRUE;
sd->scr_minh = EINA_TRUE;
}
else
{
sd->scr_minw = EINA_FALSE;
sd->scr_minh = EINA_FALSE;
}
elm_layout_sizing_eval(obj);
}

View File

@ -60,6 +60,12 @@ struct _Elm_Genlist_Data
int item_width, item_height;
int group_item_width, group_item_height;
int minw, minh;
Eina_Bool scr_minw : 1; /* a flag for determining
* minimum width to limit
* as their content size */
Eina_Bool scr_minh : 1; /* a flag for determining
* minimum height to limit
* as their content size */
unsigned int item_count;
Evas_Coord pan_x, pan_y;
Elm_Object_Select_Mode select_mode;