From 4097caf271c06058b75c2cade4b15c3d6e6f0e60 Mon Sep 17 00:00:00 2001 From: Larry Jr Date: Thu, 3 Aug 2017 18:27:10 -0300 Subject: Elementary: Efl_Ui_List and efl_ui_list_example1 use Efl_Ui_Layout_Factory --- src/examples/elementary/efl_ui_list_example_1.c | 14 ++++++++--- src/lib/elementary/efl_ui_image_factory.c | 1 + src/lib/elementary/efl_ui_layout_factory.c | 18 ++++++-------- src/lib/elementary/efl_ui_list.c | 33 ++++++++++++++++++++----- src/lib/elementary/efl_ui_list.eo | 7 ++++++ src/lib/elementary/efl_ui_list_private.h | 1 + 6 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/examples/elementary/efl_ui_list_example_1.c b/src/examples/elementary/efl_ui_list_example_1.c index 48cd8c239e..6e4463e07d 100644 --- a/src/examples/elementary/efl_ui_list_example_1.c +++ b/src/examples/elementary/efl_ui_list_example_1.c @@ -25,14 +25,14 @@ static void _realized_cb(void *data, const Efl_Event *event) { Efl_Ui_List_Item_Event *ie = event->info; - elm_layout_theme_set(ie->layout, "list", "item", "default"); + //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"); + //efl_ui_model_connect(ie->layout, "elm.text", "name"); + //efl_ui_model_connect(ie->layout, "signal/elm,state,%v", "odd_style"); } /* @@ -76,6 +76,7 @@ _make_model() EAPI_MAIN int elm_main(int argc, char **argv) { + Efl_Ui_Layout_Factory *factory; Evas_Object *win, *li; Eo *model; @@ -86,6 +87,13 @@ elm_main(int argc, char **argv) model = _make_model(); li = efl_add(EFL_UI_LIST_CLASS, win, efl_ui_view_model_set(efl_added, model)); + + factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, li); + efl_ui_model_connect(factory, "elm.text", "name"); + efl_ui_model_connect(factory, "signal/elm,state,%v", "odd_style"); + efl_ui_list_theme_config(factory, "list", "item", "default"); + efl_ui_list_layout_factory_set(li, factory); + efl_event_callback_add(li, EFL_UI_LIST_EVENT_ITEM_REALIZED, _realized_cb, NULL); // efl_event_callback_add(li, EFL_UI_LIST_EVENT_ITEM_UNREALIZED, _unrealized_cb, NULL); diff --git a/src/lib/elementary/efl_ui_image_factory.c b/src/lib/elementary/efl_ui_image_factory.c index c2a87c4546..480be5d536 100644 --- a/src/lib/elementary/efl_ui_image_factory.c +++ b/src/lib/elementary/efl_ui_image_factory.c @@ -39,6 +39,7 @@ _efl_ui_image_factory_efl_ui_factory_create(Eo *obj EINA_UNUSED, Efl_Ui_Image_Fa EINA_SAFETY_ON_NULL_RETURN_VAL(pd->property, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); + ui_view = efl_add(EFL_UI_IMAGE_CLASS, parent); efl_ui_view_model_set(ui_view, model); efl_ui_model_connect(ui_view, "filename", pd->property); diff --git a/src/lib/elementary/efl_ui_layout_factory.c b/src/lib/elementary/efl_ui_layout_factory.c index e7f6600527..e0a256cc22 100644 --- a/src/lib/elementary/efl_ui_layout_factory.c +++ b/src/lib/elementary/efl_ui_layout_factory.c @@ -18,7 +18,7 @@ typedef struct _Efl_Ui_Layout_Factory_Data } Efl_Ui_Layout_Factory_Data; Eina_Bool -_model_connect(const Eina_Hash *hash, const void *key, void *data, void *fdata) +_model_connect(const Eina_Hash *hash EINA_UNUSED, const void *key, void *data, void *fdata) { Eo *layout = fdata; Eina_Stringshare *name = key; @@ -48,28 +48,26 @@ _efl_ui_layout_factory_efl_object_destructor(Eo *obj, Efl_Ui_Layout_Factory_Data { Eina_Array_Iterator iterator; Eo *layout; - int i; - - EINA_ARRAY_ITER_NEXT(pd->layouts, i, layout, iterator) - efl_parent_set(layout, NULL); - - eina_array_free(pd->layouts); + unsigned int i; eina_stringshare_del(pd->klass); eina_stringshare_del(pd->group); eina_stringshare_del(pd->style); + EINA_ARRAY_ITER_NEXT(pd->layouts, i, layout, iterator) + efl_parent_set(layout, NULL); + + eina_array_free(pd->layouts); eina_hash_free(pd->connects); efl_destructor(efl_super(obj, MY_CLASS)); } EOLIAN static Efl_Gfx * -_efl_ui_layout_factory_efl_ui_factory_create(Eo *obj, Efl_Ui_Layout_Factory_Data *pd +_efl_ui_layout_factory_efl_ui_factory_create(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Factory_Data *pd , Efl_Model *model, Efl_Gfx *parent) { Efl_Gfx *layout; - EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); if (eina_array_count(pd->layouts)) @@ -85,7 +83,6 @@ _efl_ui_layout_factory_efl_ui_factory_create(Eo *obj, Efl_Ui_Layout_Factory_Data } efl_ui_view_model_set(layout, model); - return layout; } @@ -101,7 +98,6 @@ _efl_ui_layout_factory_efl_ui_model_connect_connect(Eo *obj EINA_UNUSED, Efl_Ui_ , const char *name, const char *property) { Eina_Stringshare *ss_name, *ss_prop; - ss_name = eina_stringshare_add(name); if (property == NULL) diff --git a/src/lib/elementary/efl_ui_list.c b/src/lib/elementary/efl_ui_list.c index 653996dda0..37aae08fc4 100644 --- a/src/lib/elementary/efl_ui_list.c +++ b/src/lib/elementary/efl_ui_list.c @@ -201,6 +201,7 @@ _focused_element(void *data EINA_UNUSED, const Efl_Event *event) Efl_Ui_List_Data *pd = data; Eo *focused = event->info; EINA_SAFETY_ON_NULL_RETURN(pd); + printf("item focused\n"); if (!_elm_config->item_select_on_focus_disable) _efl_ui_list_item_select_set(pd, focused, EINA_TRUE); @@ -531,10 +532,11 @@ _child_setup(Efl_Ui_List_Data *pd, Efl_Ui_List_Item* item, Efl_Model *model item->obj = pd->obj; item->model = efl_ref(model); - if(eina_inarray_count(recycle_layouts)) - item->layout = *(void**)eina_inarray_pop(recycle_layouts); - else - item->layout = efl_add(ELM_LAYOUT_CLASS, pd->obj); +// if(eina_inarray_count(recycle_layouts)) +// item->layout = *(void**)eina_inarray_pop(recycle_layouts); +// else +// item->layout = efl_add(ELM_LAYOUT_CLASS, pd->obj); + item->layout = efl_ui_factory_create(pd->factory, item->model, pd->obj); item->future = NULL; item->index = idx + pd->realized.start; item->minw = item->minh = 0; @@ -563,8 +565,9 @@ _child_release(Efl_Ui_List_Data* pd, Efl_Ui_List_Item* item, Eina_Inarray* recyc efl_future_cancel(item->future); efl_unref(item->model); // discard elm_layout to thrash to be able to reuse it - assert(item->layout != NULL); - eina_inarray_push(recycle_layouts, &item->layout); +// assert(item->layout != NULL); +// eina_inarray_push(recycle_layouts, &item->layout); + efl_ui_factory_release(pd->factory, item->layout); item->layout = NULL; if(_horiz(pd->orient)) pd->realized.w -= item->w; @@ -907,7 +910,10 @@ _efl_ui_list_elm_widget_on_focus(Eo *obj, Efl_Ui_List_Data *pd EINA_UNUSED, Elm_ //TODO: with no focused focus first visible element if (!efl_ui_focus_manager_focused(pd->manager)) + { + printf(">>>> no item focused\n"); efl_ui_focus_manager_focus(pd->manager, obj); + } return elm_obj_widget_on_focus(efl_super(obj, MY_CLASS), item); } @@ -1136,6 +1142,7 @@ _efl_ui_list_efl_object_constructor(Eo *obj, Efl_Ui_List_Data *pd) pd->style = eina_stringshare_add(elm_widget_style_get(obj)); + pd->factory = NULL; pd->orient = EFL_ORIENT_DOWN; pd->align.h = 0; pd->align.v = 0; @@ -1153,6 +1160,16 @@ _efl_ui_list_efl_object_destructor(Eo *obj, Efl_Ui_List_Data *pd) efl_destructor(efl_super(obj, MY_CLASS)); } +EOLIAN static void +_efl_ui_list_layout_factory_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *pd, Efl_Ui_Factory *factory) +{ + //TODO: clean all current layouts?? + if (pd->factory) + efl_unref(pd->factory); + + pd->factory = efl_ref(factory); +} + EOLIAN static void _efl_ui_list_efl_ui_view_model_set(Eo *obj, Efl_Ui_List_Data *pd, Efl_Model *model) { @@ -1171,6 +1188,10 @@ _efl_ui_list_efl_ui_view_model_set(Eo *obj, Efl_Ui_List_Data *pd, Efl_Model *mod _efl_ui_list_children_free(obj, pd); + + if (!pd->factory) + pd->factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, obj); + if (model) { pd->model = model; diff --git a/src/lib/elementary/efl_ui_list.eo b/src/lib/elementary/efl_ui_list.eo index 9f16a256e3..14b8c49564 100644 --- a/src/lib/elementary/efl_ui_list.eo +++ b/src/lib/elementary/efl_ui_list.eo @@ -35,6 +35,13 @@ class Efl.Ui.List (Elm.Layout, Efl.Ui.View, Elm.Interface_Scrollable, style: stringshare; } } + @property layout_factory { + [[Listview layout factory set.]] + set {} + values { + factory: Efl.Ui.Factory; [[The factory.]] + } + } } events { item,realized : Efl.Ui.List.Item_Event; diff --git a/src/lib/elementary/efl_ui_list_private.h b/src/lib/elementary/efl_ui_list_private.h index 4a29eff134..f14c451442 100644 --- a/src/lib/elementary/efl_ui_list_private.h +++ b/src/lib/elementary/efl_ui_list_private.h @@ -64,6 +64,7 @@ struct _Efl_Ui_List_Data Evas_Object *obj; } pan; + Efl_Ui_Layout_Factory *factory; Eina_List *selected; struct { Eina_Inarray array; -- cgit v1.2.1