summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLarry Jr <larry.olj@gmail.com>2017-06-20 19:04:26 -0300
committerLarry Jr <larry.olj@gmail.com>2017-07-27 17:31:47 -0300
commit3bb916b06383c3123e3edf1653934fc137ffe169 (patch)
tree5f2424636985ac497cc98b78e53e198938de2eeb
parent1bd070a0d263b950acfc8086041f5d091ecad7b4 (diff)
downloadefl-3bb916b06383c3123e3edf1653934fc137ffe169.tar.gz
elementary: WIP efl_ui_list lazy realize
-rw-r--r--src/examples/elementary/efl_ui_list_example_1.c71
-rw-r--r--src/lib/elementary/efl_ui_list.c256
-rw-r--r--src/lib/elementary/efl_ui_list_private.h6
3 files changed, 221 insertions, 112 deletions
diff --git a/src/examples/elementary/efl_ui_list_example_1.c b/src/examples/elementary/efl_ui_list_example_1.c
index bc57bb8219..ff9b2d75df 100644
--- a/src/examples/elementary/efl_ui_list_example_1.c
+++ b/src/examples/elementary/efl_ui_list_example_1.c
@@ -12,67 +12,79 @@
#include <Eio.h>
#include <stdio.h>
+#define NUM_ITEMS 200
+
const char *styles[] = {
"odd",
"default"
};
-const char *texts[] = {
- "Morpheus",
- "Princess Leia",
- "Chuck Norris",
- "Nyota Uhura",
- "Darth Vader",
- "Elvis Presley",
- "Chun-Li"
- };
-
char edj_path[PATH_MAX];
-struct _Layout_Model_Data
+struct _Private_Data
{
Eo *model;
- Evas_Object *ui_list;
+ Evas_Object *li;
};
-typedef struct _Layout_Model_Data Layout_Model_Data;
+typedef struct _Private_Data Private_Data;
static void
_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
- Layout_Model_Data *priv = (Layout_Model_Data*)data;
- efl_unref(priv->model);
- efl_unref(priv->ui_list);
+ Private_Data *pd = data;
+ efl_unref(pd->model);
+ efl_unref(pd->li);
}
static void
-_realized_cb(void *data EINA_UNUSED, const Efl_Event *event)
+_realized_cb(void *data, const Efl_Event *event)
{
Efl_Ui_List_Item_Event *ie = event->info;
+ Private_Data *pd = data;
+
+ ie->layout = efl_add(ELM_LAYOUT_CLASS, pd->li);
+ efl_ui_view_model_set(ie->layout, ie->child);
+ elm_layout_theme_set(ie->layout, "list", "item", "default");
+
+ evas_object_size_hint_weight_set(ie->layout, EVAS_HINT_EXPAND, 0);
+ evas_object_size_hint_align_set(ie->layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_widget_can_focus_set(ie->layout, EINA_TRUE);
efl_ui_model_connect(ie->layout, "elm.text", "name");
efl_ui_model_connect(ie->layout, "signal/elm,state,%v", "odd_style");
}
+static void
+_unrealized_cb(void *data EINA_UNUSED, const Efl_Event *event)
+{
+ Efl_Ui_List_Item_Event *ie = event->info;
+
+ efl_ui_view_model_set(ie->layout, NULL);
+ efl_del(ie->layout);
+}
+
static Efl_Model*
_make_model()
{
Eina_Value vtext, vstyle;
Efl_Model_Item *model, *child;
- unsigned int i, s, len;
+ unsigned int i, s;
+ char buf[256];
+ strdup(buf);
model = efl_add(EFL_MODEL_ITEM_CLASS, NULL);
eina_value_setup(&vtext, EINA_VALUE_TYPE_STRING);
eina_value_setup(&vstyle, EINA_VALUE_TYPE_STRING);
- len = sizeof(texts)/sizeof(const char*);
- for (i = 0; i < (len*4); i++)
+ for (i = 0; i < (NUM_ITEMS); i++)
{
s = i%2;
child = efl_model_child_add(model);
eina_value_set(&vstyle, styles[s]);
efl_model_property_set(child, "odd_style", &vstyle);
- eina_value_set(&vtext, texts[(i % len)]);
+ snprintf(buf, sizeof(buf), "Item # %i", i);
+ eina_value_set(&vtext, buf);
efl_model_property_set(child, "name", &vtext);
}
@@ -82,11 +94,11 @@ _make_model()
EAPI_MAIN int
elm_main(int argc, char **argv)
{
- Layout_Model_Data *priv;
+ Private_Data *priv;
Evas_Object *win;
- priv = alloca(sizeof(Layout_Model_Data));
- memset(priv, 0, sizeof(Layout_Model_Data));
+ priv = alloca(sizeof(Private_Data));
+ memset(priv, 0, sizeof(Private_Data));
win = elm_win_util_standard_add("viewlist", "Viewlist");
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
@@ -94,15 +106,16 @@ elm_main(int argc, char **argv)
elm_win_autodel_set(win, EINA_TRUE);
priv->model = _make_model();
- priv->ui_list = efl_add(EFL_UI_LIST_CLASS, win, efl_ui_view_model_set(efl_added, priv->model));
- efl_event_callback_add(priv->ui_list, EFL_UI_LIST_EVENT_ITEM_REALIZED, _realized_cb, priv);
+ priv->li = efl_add(EFL_UI_LIST_CLASS, win, efl_ui_view_model_set(efl_added, priv->model));
+ efl_event_callback_add(priv->li, EFL_UI_LIST_EVENT_ITEM_REALIZED, _realized_cb, priv);
+ efl_event_callback_add(priv->li, EFL_UI_LIST_EVENT_ITEM_UNREALIZED, _unrealized_cb, priv);
- elm_win_resize_object_add(win, priv->ui_list);
- evas_object_size_hint_weight_set(priv->ui_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, priv->li);
+ evas_object_size_hint_weight_set(priv->li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, priv);
//showall
- evas_object_show(priv->ui_list);
+ evas_object_show(priv->li);
evas_object_resize(win, 320, 320);
evas_object_show(win);
diff --git a/src/lib/elementary/efl_ui_list.c b/src/lib/elementary/efl_ui_list.c
index 83b8ff784c..09598aab4f 100644
--- a/src/lib/elementary/efl_ui_list.c
+++ b/src/lib/elementary/efl_ui_list.c
@@ -10,9 +10,9 @@
#define SIG_CHILD_ADDED "child,added"
#define SIG_CHILD_REMOVED "child,removed"
#define SELECTED_PROP "selected"
+#define MAX_ITEMS_PER_BLOCK 32
-static const Evas_Smart_Cb_Description _smart_callbacks[] =
-{
+static const Evas_Smart_Cb_Description _smart_callbacks[] = {
{SIG_CHILD_ADDED, ""},
{SIG_CHILD_REMOVED, ""},
{NULL, NULL}
@@ -23,6 +23,7 @@ void _efl_ui_list_item_select_set(Efl_Ui_List_Item *item, Eina_Bool select);
Eina_Bool _efl_ui_list_item_select_clear(Eo *obj);
Efl_Ui_List_Item *_child_new(Efl_Ui_List_Data *pd, Efl_Model *model);
void _child_remove(Efl_Ui_List_Data *pd, Efl_Ui_List_Item *item);
+void _realize_items(Eo *obj, Efl_Ui_List_Data *pd);
static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
static Eina_Bool _key_action_select(Evas_Object *obj, const char *params);
@@ -55,8 +56,11 @@ _efl_ui_list_pan_elm_pan_pos_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd,
evas_object_geometry_get(psd->wobj, &ox, &oy, &ow, &oh);
- EINA_LIST_FOREACH(pd->items, li, litem)
- evas_object_move(litem->layout, (litem->x + 0 - pd->pan_x), (litem->y + 0 - pd->pan_y));
+ EINA_LIST_FOREACH(pd->realizes, li, litem)
+ {
+ if (litem->layout)
+ evas_object_move(litem->layout, (litem->x + 0 - pd->pan_x), (litem->y + 0 - pd->pan_y));
+ }
}
EOLIAN static void
@@ -92,8 +96,11 @@ _efl_ui_list_pan_elm_pan_pos_min_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *
EOLIAN static void
_efl_ui_list_pan_elm_pan_content_size_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Pan_Data *psd, Evas_Coord *w, Evas_Coord *h)
{
- if (w) *w = psd->wpd->minw;
- if (h) *h = psd->wpd->minh;
+ Efl_Ui_List_Data *pd = psd->wpd;
+ EINA_SAFETY_ON_NULL_RETURN(pd);
+
+ if (w) *w = pd->minw;
+ if (h) *h = pd->minh;
}
EOLIAN static void
@@ -192,7 +199,8 @@ _long_press_cb(void *data)
item->long_timer = NULL;
item->longpressed = EINA_TRUE;
- efl_event_callback_legacy_call(item->layout, EFL_UI_EVENT_LONGPRESSED, item);
+ if (item->layout)
+ efl_event_callback_legacy_call(item->layout, EFL_UI_EVENT_LONGPRESSED, item);
return ECORE_CALLBACK_CANCEL;
}
@@ -246,15 +254,6 @@ _on_item_mouse_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *o EINA_UNUSED
}
static void
-_layout_realize(Efl_Ui_List_Item *item, const char *style)
-{
- if (style)
- elm_object_style_set(item->layout, style);
-
- evas_object_show(item->layout);
-}
-
-static void
_item_selected_then(void * data, Efl_Event const* event)
{
Efl_Ui_List_Item *item = data;
@@ -295,7 +294,8 @@ _item_property_then(void * data, Efl_Event const* event)
if (vtype == EINA_VALUE_TYPE_STRING || vtype == EINA_VALUE_TYPE_STRINGSHARE)
eina_value_get(value, &style);
- _layout_realize(item, style);
+ if (item->layout)
+ elm_object_style_set(item->layout, style);
}
static void
@@ -305,7 +305,6 @@ _item_property_error(void * data, Efl_Event const* event EINA_UNUSED)
EINA_SAFETY_ON_NULL_RETURN(item);
item->future = NULL;
- _layout_realize(item, NULL);
}
static void
@@ -336,7 +335,6 @@ _child_remove(Efl_Ui_List_Data *pd, Efl_Ui_List_Item *item)
{
EINA_SAFETY_ON_NULL_RETURN(item);
EINA_SAFETY_ON_NULL_RETURN(item->model);
- EINA_SAFETY_ON_NULL_RETURN(item->layout);
if (item->future)
{
@@ -355,76 +353,93 @@ _child_remove(Efl_Ui_List_Data *pd, Efl_Ui_List_Item *item)
pd->selected = eina_list_remove(pd->selected, item);
}
- evas_object_hide(item->layout);
-
efl_event_callback_del(item->model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, _efl_model_properties_changed_cb, item);
- efl_event_callback_del(item->layout, ELM_WIDGET_EVENT_FOCUSED, _on_item_focused, item);
- efl_event_callback_del(item->layout, ELM_WIDGET_EVENT_UNFOCUSED, _on_item_unfocused, item);
- evas_object_event_callback_del_full(item->layout, EVAS_CALLBACK_MOUSE_DOWN, _on_item_mouse_down, item);
- evas_object_event_callback_del_full(item->layout, EVAS_CALLBACK_MOUSE_UP, _on_item_mouse_up, item);
-
- efl_ui_view_model_set(item->layout, NULL);
- elm_widget_sub_object_del(pd->obj, item->layout);
- efl_del(item->layout);
+
efl_unref(item->model);
free(item);
}
-Efl_Ui_List_Item *
-_child_new(Efl_Ui_List_Data *pd, Efl_Model *model)
+static Eina_Bool
+_layout_realize(Efl_Ui_List_Data *pd, Efl_Ui_List_Item *item)
{
- Eina_Stringshare *style_prop;
Efl_Ui_List_Item_Event evt;
+ evt.child = item->model;
+ evt.layout = NULL;
+ evt.index = item->index;
+ efl_event_callback_call(item->obj, EFL_UI_LIST_EVENT_ITEM_REALIZED, &evt);
+
+ pd->realizes = eina_list_append(pd->realizes, item);
+
+ if (evt.layout == NULL)
+ return EINA_FALSE;
+
+ item->layout = efl_ref(evt.layout);
+ elm_widget_sub_object_add(pd->obj, item->layout);
+ evas_object_smart_member_add(item->layout, pd->pan_obj);
+
+ evas_object_show(item->layout);
+
+ efl_event_callback_add(item->layout, ELM_WIDGET_EVENT_FOCUSED, _on_item_focused, item);
+ efl_event_callback_add(item->layout, ELM_WIDGET_EVENT_UNFOCUSED, _on_item_unfocused, item);
+ evas_object_event_callback_add(item->layout, EVAS_CALLBACK_MOUSE_DOWN, _on_item_mouse_down, item);
+ evas_object_event_callback_add(item->layout, EVAS_CALLBACK_MOUSE_UP, _on_item_mouse_up, item);
+
+ if (pd->select_mode != ELM_OBJECT_SELECT_MODE_NONE)
+ efl_ui_model_connect(item->layout, "signal/elm,state,%v", "selected");
+
+ return EINA_TRUE;
+}
+
+static void
+_layout_unrealize(Efl_Ui_List_Data *pd, Efl_Ui_List_Item *item)
+{
+ Efl_Ui_List_Item_Event evt;
+ EINA_SAFETY_ON_NULL_RETURN(item);
+
+ if (item->layout)
+ {
+ efl_event_callback_del(item->layout, ELM_WIDGET_EVENT_FOCUSED, _on_item_focused, item);
+ efl_event_callback_del(item->layout, ELM_WIDGET_EVENT_UNFOCUSED, _on_item_unfocused, item);
+ evas_object_event_callback_del_full(item->layout, EVAS_CALLBACK_MOUSE_DOWN, _on_item_mouse_down, item);
+ evas_object_event_callback_del_full(item->layout, EVAS_CALLBACK_MOUSE_UP, _on_item_mouse_up, item);
+ efl_ui_model_connect(item->layout, "signal/elm,state,%v", NULL);
+ elm_widget_sub_object_del(pd->obj, item->layout);
+ efl_unref(item->layout);
+ }
+
+ evt.child = item->model;
+ evt.layout = item->layout;
+ evt.index = item->index;
+ efl_event_callback_call(item->obj, EFL_UI_LIST_EVENT_ITEM_UNREALIZED, &evt);
+
+ pd->realizes = eina_list_remove(pd->realizes, item);
+}
+
+Efl_Ui_List_Item *
+_child_new(Efl_Ui_List_Data *pd, Efl_Model *model)
+{
EINA_SAFETY_ON_NULL_RETURN_VAL(pd, NULL);
+ Eina_Stringshare *style_prop = eina_stringshare_add("style");
Efl_Ui_List_Item *item = calloc(1, sizeof(Efl_Ui_List_Item));
- style_prop = eina_stringshare_add("style");
item->obj = pd->obj;
item->model = efl_ref(model);
- item->layout = efl_add(ELM_LAYOUT_CLASS, pd->obj);
+ item->layout = NULL;
item->future = NULL;
item->index = eina_list_count(pd->items);
- efl_ui_view_model_set(item->layout, item->model);
-
pd->items = eina_list_append(pd->items, item);
- elm_layout_theme_set(item->layout, "list", "item", pd->style);
-
- evt.child = item->model;
- evt.layout = item->layout;
- evt.index = item->index;
-
- evas_object_size_hint_weight_set(item->layout, EVAS_HINT_EXPAND, 0);
- evas_object_size_hint_align_set(item->layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_widget_can_focus_set(item->layout, EINA_TRUE);
- elm_widget_sub_object_add(pd->obj, item->layout);
- efl_event_callback_call(item->obj, EFL_UI_LIST_EVENT_ITEM_REALIZED, &evt);
+ efl_event_callback_add(item->model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, _efl_model_properties_changed_cb, item);
if (_efl_model_properties_has(item->model, style_prop))
{
item->future = efl_model_property_get(item->model, style_prop);
efl_future_then(item->future, &_item_property_then, &_item_property_error, NULL, item);
}
- else
- {
- evas_object_show(item->layout);
- }
-
eina_stringshare_del(style_prop);
- efl_event_callback_add(item->model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, _efl_model_properties_changed_cb, item);
- efl_event_callback_add(item->layout, ELM_WIDGET_EVENT_FOCUSED, _on_item_focused, item);
- efl_event_callback_add(item->layout, ELM_WIDGET_EVENT_UNFOCUSED, _on_item_unfocused, item);
- evas_object_event_callback_add(item->layout, EVAS_CALLBACK_MOUSE_DOWN, _on_item_mouse_down, item);
- evas_object_event_callback_add(item->layout, EVAS_CALLBACK_MOUSE_UP, _on_item_mouse_up, item);
-
-
- if (pd->select_mode != ELM_OBJECT_SELECT_MODE_NONE)
- efl_ui_model_connect(item->layout, "signal/elm,state,%v", "selected");
-
- evas_object_smart_member_add(item->layout, pd->pan_obj);
return item;
}
@@ -454,14 +469,18 @@ static void
_efl_ui_list_children_free(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *pd)
{
Efl_Ui_List_Item *item;
+ Eina_List *li;
+
EINA_SAFETY_ON_NULL_RETURN(pd);
if(!pd->items) return;
+
+ EINA_LIST_FOREACH(pd->realizes, li, item)
+ _layout_unrealize(pd, item);
+
EINA_LIST_FREE(pd->items, item)
- {
- _child_remove(pd, item);
- }
+ _child_remove(pd, item);
pd->items = NULL;
}
@@ -499,17 +518,22 @@ _efl_ui_list_select_mode_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *pd, Elm_Obje
if (pd->select_mode == ELM_OBJECT_SELECT_MODE_NONE)
{
- EINA_LIST_FOREACH(pd->items, li, item)
+ EINA_LIST_FOREACH(pd->realizes, li, item)
{
+ if (!item->layout) continue;
+
if (item->selected)
elm_layout_signal_emit(item->layout, "elm,state,selected", "elm");
+
efl_ui_model_connect(item->layout, "signal/elm,state,%v", "selected");
}
}
else if (mode == ELM_OBJECT_SELECT_MODE_NONE)
{
- EINA_LIST_FOREACH(pd->items, li, item)
+ EINA_LIST_FOREACH(pd->realizes, li, item)
{
+ if (!item->layout) continue;
+
if (item->selected)
elm_layout_signal_emit(item->layout, "elm,state,unselected", "elm");
@@ -573,7 +597,7 @@ _efl_ui_list_eina_list_layout_get(const Eina_List *list)
EOLIAN static Evas_Object*
-_efl_ui_list_elm_widget_focused_object_get(Eo *obj, Efl_Ui_List_Data *pd)
+_efl_ui_list_elm_widget_focused_object_get(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *pd)
{
if (!pd->focused) return NULL;
return pd->focused->layout;
@@ -595,7 +619,7 @@ _efl_ui_list_elm_widget_focus_next(Eo *obj, Efl_Ui_List_Data *pd, Elm_Focus_Dire
if (!items) return EINA_FALSE;
}
- return elm_widget_focus_list_next_get(obj, items, _efl_ui_list_eina_list_layout_get, dir, next, next_item);
+ return elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next, next_item);
}
EOLIAN static Eina_Bool
@@ -654,6 +678,7 @@ _efl_ui_list_efl_gfx_size_set(Eo *obj, Efl_Ui_List_Data *pd, Evas_Coord w, Evas_
efl_gfx_size_set(efl_super(obj, MY_CLASS), w, h);
evas_object_resize(pd->hit_rect, w, h);
+ printf("resize %d %d \n", w, h);
_efl_ui_list_custom_layout(obj);
}
@@ -833,7 +858,7 @@ _efl_ui_list_elm_interface_atspi_accessible_children_get(Eo *obj, Efl_Ui_List_Da
Efl_Ui_List_Item *litem;
Eina_List *li;
- EINA_LIST_FOREACH(pd->items, li, litem)
+ EINA_LIST_FOREACH(pd->realizes, li, litem)
ret = eina_list_append(ret, litem->layout);
ret2 = elm_interface_atspi_accessible_children_get(efl_super(obj, MY_CLASS));
@@ -937,9 +962,6 @@ static Eina_Bool _key_action_move(Evas_Object *obj, const char *params)
EFL_UI_LIST_DATA_GET_OR_RETURN_VAL(obj, pd, EINA_FALSE);
const char *dir = params;
- Efl_Ui_List_Item *item = NULL;
- Elm_Object_Item *oitem = NULL;
- Elm_Layout *eoit = NULL;
Evas_Coord page_x, page_y;
Evas_Coord v_w, v_h;
Evas_Coord x, y;
@@ -948,7 +970,11 @@ static Eina_Bool _key_action_move(Evas_Object *obj, const char *params)
elm_interface_scrollable_page_size_get(obj, &page_x, &page_y);
elm_interface_scrollable_content_viewport_geometry_get(obj, NULL, NULL, &v_w, &v_h);
-/* if (!strcmp(dir, "up") || !strcmp(dir, "up_multi"))
+/*
+ Efl_Ui_List_Item *item = NULL;
+ Elm_Object_Item *oitem = NULL;
+ Elm_Layout *eoit = NULL;
+ if (!strcmp(dir, "up") || !strcmp(dir, "up_multi"))
{
if (!elm_widget_focus_next_get(obj, ELM_FOCUS_UP, &eoit, &oitem))
return EINA_FALSE;
@@ -1115,6 +1141,60 @@ struct _Item_Calc
Efl_Ui_List_Item *litem;
};
+Evas_Coord
+_item_weight_calc(Efl_Ui_List_Item *item, Eina_Bool horizon)
+{
+ Evas_Coord old_w, old_h, minw = 0, minh = 0;
+
+ efl_gfx_size_hint_combined_min_get(item->layout, &old_w, &old_h);
+ edje_object_size_min_calc(elm_layout_edje_get(item->layout), &minw, &minh);
+
+ if (old_w > minw) minw = old_w;
+ if (old_h > minh) minh = old_h;
+ evas_object_size_hint_min_set(item->layout, minw, minh);
+
+ if (horizon)
+ return minw;
+
+ return minh;
+}
+
+void
+_realize_items(Eo *obj, Efl_Ui_List_Data *pd)
+{
+ Efl_Ui_List_Item *litem;
+ Eina_List *li, *subitems;
+ int rlzw, objw, i;
+ Eina_Bool horiz = _horiz(pd->orient);
+
+ if (horiz)
+ {
+ rlzw = pd->rlzw;
+ evas_object_geometry_get(obj, NULL, NULL, &objw, NULL);
+ }
+ else
+ {
+ rlzw = pd->rlzh;
+ evas_object_geometry_get(obj, NULL, NULL, NULL, &objw);
+ }
+
+ i = eina_list_count(pd->realizes); //TODO add unrealized upper items
+ subitems = eina_list_nth_list(pd->items, i);
+
+ EINA_LIST_FOREACH(subitems, li, litem)
+ {
+ if (rlzw > objw)
+ break;
+
+ if (!_layout_realize(pd, litem))
+ continue;
+
+ rlzw += _item_weight_calc(litem, horiz);
+ }
+
+ return;
+}
+
void
_efl_ui_list_custom_layout(Efl_Ui_List *ui_list)
{
@@ -1131,9 +1211,10 @@ _efl_ui_list_custom_layout(Efl_Ui_List *ui_list)
double cur_pos = 0, weight[2] = { 0, 0 }, scale;
double box_align[2];
Eina_Bool box_fill[2] = { EINA_FALSE, EINA_FALSE };
-
ELM_WIDGET_DATA_GET_OR_RETURN(ui_list, wd);
+ _realize_items(ui_list, pd);
+
evas_object_geometry_get(ui_list, &boxx, &boxy, &boxw, &boxh);
efl_gfx_size_hint_margin_get(ui_list, &boxl, &boxr, &boxt, &boxb);
@@ -1153,7 +1234,7 @@ _efl_ui_list_custom_layout(Efl_Ui_List *ui_list)
box_align[1] = 0.5;
}
- count = eina_list_count(pd->items);
+ count = eina_list_count(pd->realizes);
if (!count)
{
evas_object_size_hint_min_set(wd->resize_obj, 0, 0);
@@ -1169,7 +1250,7 @@ _efl_ui_list_custom_layout(Efl_Ui_List *ui_list)
elm_interface_scrollable_content_viewport_geometry_get
(ui_list, NULL, NULL, &ow, &oh);
// scan all items, get their properties, calculate total weight & min size
- EINA_LIST_FOREACH(pd->items, li, litem)
+ EINA_LIST_FOREACH(pd->realizes, li, litem)
{
item = &items[id];
o = item->obj = litem->layout;
@@ -1244,13 +1325,26 @@ _efl_ui_list_custom_layout(Efl_Ui_List *ui_list)
// available space. if <0 we overflow
extra = length - want;
- if (horiz) {
+ int ilen;
+ ilen = eina_list_count(pd->items);
+ if (horiz)
+ {
pd->minw = wantw + boxl + boxr + pad * (count - 1);
pd->minh = wanth + boxt + boxb;
- } else {
+ pd->rlzw = pd->minw;
+ pd->rlzh = pd->minh;
+ if (ilen > count)
+ pd->minw *= ilen / count;
+ }
+ else
+ {
pd->minw = wantw + boxl + boxr;
pd->minh = wanth + pad * (count - 1) + boxt + boxb;
- }
+ pd->rlzw = pd->minw;
+ pd->rlzh = pd->minh;
+ if (ilen > count)
+ pd->minh *= ilen / count;
+ }
evas_object_size_hint_min_set(wd->resize_obj, pd->minw, pd->minh);
diff --git a/src/lib/elementary/efl_ui_list_private.h b/src/lib/elementary/efl_ui_list_private.h
index 7dd46d1b00..3b02e0a5e9 100644
--- a/src/lib/elementary/efl_ui_list_private.h
+++ b/src/lib/elementary/efl_ui_list_private.h
@@ -21,7 +21,7 @@ struct _Efl_Ui_List_Item
Elm_Layout *layout;
Efl_Future *future;
unsigned int index;
- Evas_Coord x, y;
+ Evas_Coord x, y, w, h;
Eina_Bool down: 1;
Eina_Bool selected: 1;
Eina_Bool longpressed : 1;
@@ -54,13 +54,15 @@ struct _Efl_Ui_List_Data
} align;
Eina_List *items, *selected;
+ Eina_List *realizes;
Eina_Stringshare *style;
Elm_Object_Select_Mode select_mode;
Elm_List_Mode mode;
+ unsigned int re_idx;
Evas_Object *pan_obj;
Eina_Bool pan_changed : 1;
- Evas_Coord pan_x, pan_y, minw, minh, dx, dy;
+ Evas_Coord pan_x, pan_y, minw, minh, dx, dy, rlzw, rlzh;
Efl_Ui_List_Item *focused;
};