From 78b69d45b57ce43ac0373a4f10ac548a3a458dbf Mon Sep 17 00:00:00 2001 From: Cedric Bail Date: Thu, 19 Sep 2019 11:19:56 -0700 Subject: [PATCH] elementary: migrate Efl.Ui.List_View to use Efl.Ui.Collection_View. Differential Revision: https://phab.enlightenment.org/D10035 --- .../elementary/efl_ui_list_view_example_1.c | 38 +- .../elementary/efl_ui_list_view_example_2.c | 3 +- .../elementary/efl_ui_list_view_example_3.c | 54 +- src/lib/elementary/Efl_Ui.h | 1 + src/lib/elementary/efl_ui_list_view.c | 1031 +---------------- src/lib/elementary/efl_ui_list_view.eo | 102 +- src/lib/elementary/efl_ui_list_view_model.eo | 41 - src/lib/elementary/efl_ui_list_view_pan.eo | 12 - .../efl_ui_list_view_precise_layouter.c | 728 ------------ .../efl_ui_list_view_precise_layouter.eo | 10 - src/lib/elementary/efl_ui_list_view_private.h | 78 -- .../elementary/efl_ui_list_view_relayout.eo | 30 - .../elementary/efl_ui_list_view_seg_array.c | 477 -------- .../elementary/efl_ui_list_view_seg_array.h | 42 - src/lib/elementary/efl_ui_list_view_types.eot | 12 - src/lib/elementary/meson.build | 9 - 16 files changed, 45 insertions(+), 2623 deletions(-) delete mode 100644 src/lib/elementary/efl_ui_list_view_model.eo delete mode 100644 src/lib/elementary/efl_ui_list_view_pan.eo delete mode 100644 src/lib/elementary/efl_ui_list_view_precise_layouter.c delete mode 100644 src/lib/elementary/efl_ui_list_view_precise_layouter.eo delete mode 100644 src/lib/elementary/efl_ui_list_view_private.h delete mode 100644 src/lib/elementary/efl_ui_list_view_relayout.eo delete mode 100644 src/lib/elementary/efl_ui_list_view_seg_array.c delete mode 100644 src/lib/elementary/efl_ui_list_view_seg_array.h delete mode 100644 src/lib/elementary/efl_ui_list_view_types.eot diff --git a/src/examples/elementary/efl_ui_list_view_example_1.c b/src/examples/elementary/efl_ui_list_view_example_1.c index 757082aa9d..5c1f4f5fe1 100644 --- a/src/examples/elementary/efl_ui_list_view_example_1.c +++ b/src/examples/elementary/efl_ui_list_view_example_1.c @@ -14,39 +14,20 @@ #define NUM_ITEMS 400 -const char *styles[] = { - "odd", - "even" - }; - -char edj_path[PATH_MAX]; - static void _realized_cb(void *data EINA_UNUSED, const Efl_Event *event) { - Efl_Ui_List_View_Item_Event *ie = event->info; - if (!ie->layout) return; + Efl_Gfx_Entity *layout = event->info; - Efl_Ui_Layout *layout = ie->layout; elm_object_focus_allow_set(layout, EINA_TRUE); } -/* -static void -_unrealized_cb(void *data EINA_UNUSED, const Efl_Event *event) -{ - Efl_Ui_List_View_Item_Event *ie = event->info; - - efl_ui_view_model_set(ie->layout, NULL); - efl_del(ie->layout); -} -*/ static Efl_Model* _make_model(Evas_Object *win) { Eina_Value vtext; Efl_Generic_Model *model, *child; - unsigned int i, s; + unsigned int i; char buf[256]; model = efl_add(EFL_GENERIC_MODEL_CLASS, win); @@ -54,10 +35,7 @@ _make_model(Evas_Object *win) for (i = 0; i < (NUM_ITEMS); i++) { - s = i%2; child = efl_model_child_add(model); - eina_value_set(&vtext, styles[s]); - efl_model_property_set(child, "odd_style", &vtext); snprintf(buf, sizeof(buf), "Item # %i", i); eina_value_set(&vtext, buf); @@ -88,17 +66,13 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win); efl_ui_widget_factory_item_class_set(factory, EFL_UI_LIST_DEFAULT_ITEM_CLASS); - efl_ui_property_bind(factory, "signal/efl,state,%v", "odd_style"); - efl_ui_property_bind(factory, "signal/efl,state,%{selected;unselected}", "selected"); efl_ui_property_bind(factory, "efl.text", "title"); - li = efl_add(EFL_UI_LIST_VIEW_CLASS, win - , efl_ui_list_view_layout_factory_set(efl_added, factory) - , efl_ui_view_model_set(efl_added, selmodel) - ); + li = efl_add(EFL_UI_LIST_VIEW_CLASS, win, + efl_ui_collection_view_factory_set(efl_added, factory), + efl_ui_view_model_set(efl_added, selmodel)); - efl_event_callback_add(li, EFL_UI_LIST_VIEW_EVENT_ITEM_REALIZED, _realized_cb, NULL); -// efl_event_callback_add(li, EFL_UI_LIST_VIEW_EVENT_ITEM_UNREALIZED, _unrealized_cb, NULL); + efl_event_callback_add(li, EFL_UI_COLLECTION_VIEW_EVENT_ITEM_REALIZED, _realized_cb, NULL); elm_win_resize_object_add(win, li); evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); diff --git a/src/examples/elementary/efl_ui_list_view_example_2.c b/src/examples/elementary/efl_ui_list_view_example_2.c index 5a4d680614..3464af5841 100644 --- a/src/examples/elementary/efl_ui_list_view_example_2.c +++ b/src/examples/elementary/efl_ui_list_view_example_2.c @@ -37,13 +37,12 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) efl_ui_property_bind(factory, "efl.text", "filename"); li = efl_add(EFL_UI_LIST_VIEW_CLASS, win); - efl_ui_list_view_layout_factory_set(li, factory); + efl_ui_collection_view_factory_set(li, factory); efl_ui_view_model_set(li, model); evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); - imgf = efl_add(EFL_UI_IMAGE_FACTORY_CLASS, win); efl_ui_property_bind(imgf, "", "path"); //connect to "path" property efl_ui_factory_bind(factory, "efl.icon", imgf); diff --git a/src/examples/elementary/efl_ui_list_view_example_3.c b/src/examples/elementary/efl_ui_list_view_example_3.c index 5a233b3430..ca839bcf59 100644 --- a/src/examples/elementary/efl_ui_list_view_example_3.c +++ b/src/examples/elementary/efl_ui_list_view_example_3.c @@ -52,17 +52,15 @@ static void _cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Priv_Data *priv = (Priv_Data*)data; - efl_unref(priv->model); + efl_del(priv->model); } static void -_focused(void *data, const Efl_Event *event) +_selected(void *data, const Efl_Event *event) { Priv_Data *priv = (Priv_Data*)data; - Evas_Object *focused = efl_ui_focus_manager_focus_get(event->object); - if (focused) - priv->selected = focused; + priv->selected = efl_ui_single_selectable_last_selected_get(event->object); } static void @@ -77,7 +75,7 @@ _bt_add_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_ child = efl_model_child_add(priv->model); eina_value_set(&vtext, elm_object_text_get(priv->e_name)); - efl_model_property_set(child, "name", &vtext); + efl_model_property_set(child, "filename", &vtext); eina_value_set(&vtext, elm_object_text_get(priv->e_occ)); efl_model_property_set(child, "occupation", &vtext); @@ -95,7 +93,6 @@ _bt_del_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_ Priv_Data *priv = (Priv_Data*)data; Eo *child = NULL; - //l = efl_ui_focus_manager_focus_get(priv->list1); if(priv->selected) { printf("focused %p\n", priv->selected); @@ -113,21 +110,21 @@ static void _bt_none_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *li = data; - efl_ui_list_view_select_mode_set(li, ELM_OBJECT_SELECT_MODE_NONE); + efl_ui_multi_selectable_async_select_mode_set(li, EFL_UI_SELECT_MODE_NONE); } static void -_bt_donly_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_bt_donly_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Evas_Object *li = data; - efl_ui_list_view_select_mode_set(li, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + /* Evas_Object *li = data; */ + /* efl_ui_multi_selectable_async_select_mode_set(li, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); */ } static void _bt_default_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *li = data; - efl_ui_list_view_select_mode_set(li, ELM_OBJECT_SELECT_MODE_DEFAULT); + efl_ui_multi_selectable_async_select_mode_set(li, EFL_UI_SELECT_MODE_SINGLE); } static void @@ -146,28 +143,21 @@ _bt_unset_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EIN static void _realized_1_cb(void *data EINA_UNUSED, const Efl_Event *event) { - Efl_Ui_List_View_Item_Event *ie = event->info; + Efl_Gfx_Entity *layout = event->info; - 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); - efl_ui_property_bind(ie->layout, "efl.text", "name"); - efl_ui_property_bind(ie->layout, "signal/efl,state,%v", "odd_style"); + efl_ui_property_bind(layout, "efl.text", "filename"); } static void _realized_2_cb(void *data EINA_UNUSED, const Efl_Event *event) { - Efl_Ui_List_View_Item_Event *ie = event->info; - printf("relized 2\n"); + Efl_Gfx_Entity *layout = event->info; - elm_object_focus_allow_set(ie->layout, EINA_TRUE); - 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); - efl_ui_property_bind(ie->layout, "efl.text", "occupation"); + efl_ui_property_bind(layout, "efl.text", "occupation"); } static Efl_Model* -_make_model() +_make_model(void) { Eina_Value vtext, value; Efl_Generic_Model *model, *child; @@ -182,11 +172,8 @@ _make_model() { child = efl_model_child_add(model); - i%2 ? eina_value_set(&vtext, "even") : eina_value_set(&vtext, "odd"); - efl_model_property_set(child, "odd_style", &vtext); - eina_value_set(&vtext, texts[(i % len)]); - efl_model_property_set(child, "name", &vtext); + efl_model_property_set(child, "filename", &vtext); eina_value_set(&vtext, subtexts[(i % len)]); efl_model_property_set(child, "occupation", &vtext); @@ -226,21 +213,20 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) efl_ui_widget_factory_item_class_set(factory, EFL_UI_LIST_DEFAULT_ITEM_CLASS); priv->list1 = efl_add(EFL_UI_LIST_VIEW_CLASS, win, efl_ui_view_model_set(efl_added, priv->model)); - efl_event_callback_add(priv->list1, EFL_UI_LIST_VIEW_EVENT_ITEM_REALIZED, _realized_1_cb, priv); + efl_event_callback_add(priv->list1, EFL_UI_COLLECTION_VIEW_EVENT_ITEM_REALIZED, _realized_1_cb, priv); evas_object_size_hint_weight_set(priv->list1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(priv->list1, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(bx, priv->list1); - efl_ui_list_view_layout_factory_set(priv->list1, factory); + efl_ui_collection_view_factory_set(priv->list1, factory); factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win); efl_ui_property_bind(factory, "efl.text", "filename"); - efl_ui_property_bind(factory, "signal/efl,state,%v", "selected"); efl_ui_widget_factory_item_class_set(factory, EFL_UI_LIST_DEFAULT_ITEM_CLASS); priv->list2 = efl_add(EFL_UI_LIST_VIEW_CLASS, win, efl_ui_view_model_set(efl_added, priv->model)); - efl_event_callback_add(priv->list2, EFL_UI_LIST_VIEW_EVENT_ITEM_REALIZED, _realized_2_cb, priv->list2); + efl_event_callback_add(priv->list2, EFL_UI_COLLECTION_VIEW_EVENT_ITEM_REALIZED, _realized_2_cb, priv->list2); evas_object_size_hint_weight_set(priv->list2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(priv->list2, EVAS_HINT_FILL, EVAS_HINT_FILL); - efl_ui_list_view_layout_factory_set(priv->list2, factory); + efl_ui_collection_view_factory_set(priv->list2, factory); vbx = elm_box_add(win); elm_box_pack_end(bx, vbx); @@ -313,7 +299,7 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED) elm_box_pack_end(vbx, bt); elm_box_pack_end(bx, priv->list2); - efl_event_callback_add(priv->list2, EFL_UI_FOCUS_MANAGER_EVENT_MANAGER_FOCUS_CHANGED, _focused ,priv); + efl_event_callback_add(priv->list2, EFL_UI_SINGLE_SELECTABLE_EVENT_SELECTION_CHANGED, _selected, priv); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, priv); diff --git a/src/lib/elementary/Efl_Ui.h b/src/lib/elementary/Efl_Ui.h index baa945c24b..7f0c2ab4e9 100644 --- a/src/lib/elementary/Efl_Ui.h +++ b/src/lib/elementary/Efl_Ui.h @@ -334,6 +334,7 @@ typedef Eo Efl_Ui_Spotlight_Indicator; # include # include # include +# include # include # include diff --git a/src/lib/elementary/efl_ui_list_view.c b/src/lib/elementary/efl_ui_list_view.c index cee52e1132..efc3dfe50e 100644 --- a/src/lib/elementary/efl_ui_list_view.c +++ b/src/lib/elementary/efl_ui_list_view.c @@ -1,1041 +1,22 @@ #ifdef HAVE_CONFIG_H # include "elementary_config.h" #endif -#define EFL_ACCESS_OBJECT_PROTECTED -#define EFL_ACCESS_SELECTION_PROTECTED -#define EFL_UI_SCROLL_MANAGER_PROTECTED -#define EFL_UI_SCROLLBAR_PROTECTED -#define EFL_UI_FOCUS_COMPOSITION_PROTECTED -#define EFL_UI_WIDGET_FOCUS_MANAGER_PROTECTED -#include "elm_priv.h" -#include "efl_ui_list_view_private.h" -#include "efl_ui_list_view_precise_layouter.eo.h" +#include -#include +#define MY_CLASS EFL_UI_LIST_VIEW_CLASS +#define MY_CLASS_PFX efl_ui_list_view -#define MY_CLASS EFL_UI_LIST_VIEW_CLASS #define MY_CLASS_NAME "Efl.Ui.List_View" -#define MY_PAN_CLASS EFL_UI_LIST_VIEW_PAN_CLASS - -#define SIG_CHILD_ADDED "child,added" -#define SIG_CHILD_REMOVED "child,removed" -#define SELECTED_PROP "selected" - -static const Evas_Smart_Cb_Description _smart_callbacks[] = { - {SIG_CHILD_ADDED, ""}, - {SIG_CHILD_REMOVED, ""}, - {NULL, NULL} -}; - -void _efl_ui_list_view_custom_layout(Efl_Ui_List_View *); -void _efl_ui_list_view_item_select_set(Efl_Ui_List_View_Layout_Item*, Eina_Bool); - -static Eina_Bool _key_action_move(Evas_Object *obj, const char *params); -static Eina_Bool _key_action_select(Evas_Object *obj, const char *params); -static Eina_Bool _key_action_escape(Evas_Object *obj, const char *params); - -static const Elm_Action key_actions[] = { - {"move", _key_action_move}, - {"select", _key_action_select}, - {"escape", _key_action_escape}, - {NULL, NULL} -}; - -EOLIAN static void -_efl_ui_list_view_pan_efl_canvas_group_group_calculate(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Pan_Data *psd) -{ - efl_canvas_group_need_recalculate_set(obj, EINA_FALSE); - evas_object_smart_changed(psd->wobj); -} - - -EOLIAN static void -_efl_ui_list_view_pan_efl_ui_pan_pan_position_set(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Pan_Data *psd, Eina_Position2D pos) -{ - if ((pos.x == psd->gmt.x) && (pos.y == psd->gmt.y)) return; - - psd->gmt.x = pos.x; - psd->gmt.y = pos.y; - - efl_event_callback_call(obj, EFL_UI_PAN_EVENT_PAN_CONTENT_POSITION_CHANGED, &pos); - evas_object_smart_changed(psd->wobj); -} - -EOLIAN static Eina_Position2D -_efl_ui_list_view_pan_efl_ui_pan_pan_position_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Pan_Data *psd) -{ - return psd->gmt.pos; -} - -EOLIAN static Eina_Position2D -_efl_ui_list_view_pan_efl_ui_pan_pan_position_max_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Pan_Data *psd) -{ - EFL_UI_LIST_VIEW_DATA_GET(psd->wobj, pd); - Eina_Rect vgmt = {}; - Eina_Size2D min = {}; - - vgmt = efl_ui_scrollable_viewport_geometry_get(pd->scrl_mgr); - min = efl_ui_list_view_model_min_size_get(psd->wobj); - - min.w = min.w - vgmt.w; - if (min.w < 0) min.w = 0; - min.h = min.h - vgmt.h; - if (min.h < 0) min.h = 0; - - return EINA_POSITION2D(min.w, min.h); -} - -EOLIAN static Eina_Position2D -_efl_ui_list_view_pan_efl_ui_pan_pan_position_min_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Pan_Data *psd EINA_UNUSED) -{ - return EINA_POSITION2D(0, 0); -} - -EOLIAN static Eina_Size2D -_efl_ui_list_view_pan_efl_ui_pan_content_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Pan_Data *psd) -{ - Eina_Size2D min = {}; - min = efl_ui_list_view_model_min_size_get(psd->wobj); - - return min; -} - -EOLIAN static void -_efl_ui_list_view_pan_efl_object_destructor(Eo *obj, Efl_Ui_List_View_Pan_Data *psd EINA_UNUSED) -{ - efl_destructor(efl_super(obj, MY_PAN_CLASS)); -} - -#include "efl_ui_list_view_pan.eo.c" - -static Eina_Bool -_efl_model_properties_has(Efl_Model *model, Eina_Stringshare *propfind) -{ - Eina_Iterator *properties; - const char *property; - Eina_Bool ret = EINA_FALSE; - - EINA_SAFETY_ON_NULL_RETURN_VAL(model, EINA_FALSE); - EINA_SAFETY_ON_NULL_RETURN_VAL(propfind, EINA_FALSE); - - properties = efl_model_properties_get(model); - EINA_ITERATOR_FOREACH(properties, property) - { - if (property == propfind || - !strcmp(property, propfind)) - { - ret = EINA_TRUE; - break; - } - } - eina_iterator_free(properties); - - return ret; -} - -static void -_list_element_focused(void *data EINA_UNUSED, const Efl_Event *ev) -{ - Eina_Rect geom; - Eina_Position2D pos; - Efl_Ui_Focus_Object *focused = efl_ui_focus_manager_focus_get(ev->object); - - if (!focused) return; - - EFL_UI_LIST_VIEW_DATA_GET(ev->object, pd); - geom = efl_ui_focus_object_focus_geometry_get(focused); - pos = efl_ui_scrollable_content_pos_get(pd->scrl_mgr); - - geom.x += pos.x; - geom.y += pos.y; - efl_ui_scrollable_scroll(pd->scrl_mgr, geom, EINA_TRUE); -} - -static void -_on_item_mouse_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) -{ - Evas_Event_Mouse_Down *ev = event_info; - Efl_Ui_List_View_Layout_Item *item = data; - Eina_Value *v; - Eina_Bool select; - - if (ev->button != 1) return; - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; - - v = efl_model_property_get(item->children, SELECTED_PROP); - if (!eina_value_get(v, &select)) - { - WRN("Could not get the select value"); - eina_value_free(v); - return; - } - _efl_ui_list_view_item_select_set(item, !select); - eina_value_free(v); -} - -EOLIAN static void -_efl_ui_list_view_select_mode_set(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd, Elm_Object_Select_Mode mode) -{ - if (pd->select_mode == mode) - return; - - pd->select_mode = mode; -} - -EOLIAN static Elm_Object_Select_Mode -_efl_ui_list_view_select_mode_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - return pd->select_mode; -} - -EOLIAN static void -_efl_ui_list_view_default_style_set(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd, Eina_Stringshare *style) -{ - eina_stringshare_replace(&pd->style, style); -} - -EOLIAN static Eina_Stringshare * -_efl_ui_list_view_default_style_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - return pd->style; -} - -EOLIAN static void -_efl_ui_list_view_homogeneous_set(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd, Eina_Bool homogeneous) -{ - pd->homogeneous = homogeneous; -} - -EOLIAN static Eina_Bool -_efl_ui_list_view_homogeneous_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - return pd->homogeneous; -} - -EOLIAN static void -_efl_ui_list_view_efl_gfx_entity_position_set(Eo *obj, Efl_Ui_List_View_Data *pd, Eina_Position2D pos) -{ - if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 0, pos.x, pos.y)) - return; - - efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos); - evas_object_smart_changed(pd->obj); -} - -EOLIAN static void -_efl_ui_list_view_efl_gfx_entity_size_set(Eo *obj, Efl_Ui_List_View_Data *pd, Eina_Size2D size) -{ - if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_RESIZE, 0, size.w, size.h)) - return; - - efl_gfx_entity_size_set(efl_super(obj, MY_CLASS), size); - - evas_object_smart_changed(pd->obj); -} - -EOLIAN static void -_efl_ui_list_view_efl_canvas_group_group_calculate(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - if (!pd->model) - return; - - efl_ui_list_view_relayout_layout_do(pd->relayout, pd->obj, pd->seg_array_first, pd->seg_array); - -} - -EOLIAN static void -_efl_ui_list_view_efl_canvas_group_group_member_add(Eo *obj, Efl_Ui_List_View_Data *pd EINA_UNUSED, Evas_Object *member) -{ - efl_canvas_group_member_add(efl_super(obj, MY_CLASS), member); -} - -//Scrollable Implement -static void -_efl_ui_list_view_bar_read_and_update(Eo *obj) -{ - EFL_UI_LIST_VIEW_DATA_GET(obj, pd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - double vx, vy; - - edje_object_part_drag_value_get - (wd->resize_obj, "efl.dragable.vbar", NULL, &vy); - edje_object_part_drag_value_get - (wd->resize_obj, "efl.dragable.hbar", &vx, NULL); - - efl_ui_scrollbar_bar_position_set(pd->scrl_mgr, vx, vy); - - efl_canvas_group_change(pd->pan_obj); -} - -static void -_efl_ui_list_view_reload_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - EFL_UI_LIST_VIEW_DATA_GET(data, pd); - - efl_ui_scrollbar_bar_visibility_update(pd->scrl_mgr); -} - -static void -_efl_ui_list_view_vbar_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_list_view_bar_read_and_update(data); - - Efl_Ui_Layout_Orientation type = EFL_UI_LAYOUT_ORIENTATION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAGGED, &type); -} - -static void -_efl_ui_list_view_vbar_press_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Layout_Orientation type = EFL_UI_LAYOUT_ORIENTATION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESSED, &type); -} - -static void -_efl_ui_list_view_vbar_unpress_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Layout_Orientation type = EFL_UI_LAYOUT_ORIENTATION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESSED, &type); -} - -static void -_efl_ui_list_view_edje_drag_start_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - EFL_UI_LIST_VIEW_DATA_GET(data, pd); - - _efl_ui_list_view_bar_read_and_update(data); - - pd->scrl_freeze = efl_ui_scrollable_scroll_freeze_get(pd->scrl_mgr); - efl_ui_scrollable_scroll_freeze_set(pd->scrl_mgr, EINA_TRUE); - efl_event_callback_call(data, EFL_UI_EVENT_SCROLL_DRAG_STARTED, NULL); -} - -static void -_efl_ui_list_view_edje_drag_stop_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - EFL_UI_LIST_VIEW_DATA_GET(data, pd); - - _efl_ui_list_view_bar_read_and_update(data); - - efl_ui_scrollable_scroll_freeze_set(pd->scrl_mgr, pd->scrl_freeze); - efl_event_callback_call(data, EFL_UI_EVENT_SCROLL_DRAG_FINISHED, NULL); -} - -static void -_efl_ui_list_view_edje_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_list_view_bar_read_and_update(data); -} - -static void -_efl_ui_list_view_hbar_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_list_view_bar_read_and_update(data); - - Efl_Ui_Layout_Orientation type = EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAGGED, &type); -} - -static void -_efl_ui_list_view_hbar_press_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Layout_Orientation type = EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESSED, &type); -} - -static void -_efl_ui_list_view_hbar_unpress_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Layout_Orientation type = EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESSED, &type); -} - -static void -_efl_ui_list_view_bar_size_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) -{ - Eo *obj = data; - EFL_UI_LIST_VIEW_DATA_GET(obj, pd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - double width = 0.0, height = 0.0; - - efl_ui_scrollbar_bar_size_get(pd->scrl_mgr, &width, &height); - - edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.hbar", width, 1.0); - edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.vbar", 1.0, height); -} - -static void -_efl_ui_list_view_bar_pos_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) -{ - Eo *obj = data; - EFL_UI_LIST_VIEW_DATA_GET(obj, pd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - double posx = 0.0, posy = 0.0; - - efl_ui_scrollbar_bar_position_get(pd->scrl_mgr, &posx, &posy); - - edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.hbar", posx, 0.0); - edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.vbar", 0.0, posy); -} - -static void -_efl_ui_list_view_bar_show_cb(void *data, const Efl_Event *event) -{ - Eo *obj = data; - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - Efl_Ui_Layout_Orientation type = *(Efl_Ui_Layout_Orientation *)(event->info); - - if (type == EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,show,hbar", "efl"); - else if (type == EFL_UI_LAYOUT_ORIENTATION_VERTICAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,show,vbar", "efl"); -} - -static void -_efl_ui_list_view_bar_hide_cb(void *data, const Efl_Event *event) -{ - Eo *obj = data; - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - Efl_Ui_Layout_Orientation type = *(Efl_Ui_Layout_Orientation *)(event->info); - - if (type == EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,hide,hbar", "efl"); - else if (type == EFL_UI_LAYOUT_ORIENTATION_VERTICAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,hide,vbar", "efl"); -} - -static Eina_Bool -_efl_ui_list_view_efl_layout_signal_signal_callback_add(Eo *obj, Efl_Ui_List_View_Data *pd EINA_UNUSED, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb) -{ - Eina_Bool ok; - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE); - - ok = efl_layout_signal_callback_add(wd->resize_obj, emission, source, func_data, func, func_free_cb); - - return ok; -} - -static Eina_Bool -_efl_ui_list_view_efl_layout_signal_signal_callback_del(Eo *obj, Efl_Ui_List_View_Data *pd EINA_UNUSED, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb) -{ - Eina_Bool ok; - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE); - - ok = efl_layout_signal_callback_del(wd->resize_obj, emission, source, func_data, func, func_free_cb); - - return ok; -} - -static void -_efl_ui_list_view_edje_object_attach(Eo *obj) -{ - efl_layout_signal_callback_add - (obj, "reload", "efl", - obj, _efl_ui_list_view_reload_cb, NULL); - //Vertical bar - efl_layout_signal_callback_add - (obj, "drag", "efl.dragable.vbar", - obj, _efl_ui_list_view_vbar_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,set", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,start", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_start_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,stop", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,step", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,page", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,vbar,press", "efl", - obj, _efl_ui_list_view_vbar_press_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,vbar,unpress", "efl", - obj, _efl_ui_list_view_vbar_unpress_cb, NULL); - - //Horizontal bar - efl_layout_signal_callback_add - (obj, "drag", "efl.dragable.hbar", - obj, _efl_ui_list_view_hbar_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,set", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,start", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_start_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,stop", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,step", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,page", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,hbar,press", "efl", - obj, _efl_ui_list_view_hbar_press_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,hbar,unpress", "efl", - obj, _efl_ui_list_view_hbar_unpress_cb, NULL); -} - -static void -_efl_ui_list_view_edje_object_detach(Evas_Object *obj) -{ - efl_layout_signal_callback_del - (obj, "reload", "efl", - obj, _efl_ui_list_view_reload_cb, NULL); - //Vertical bar - efl_layout_signal_callback_del - (obj, "drag", "efl.dragable.vbar", - obj, _efl_ui_list_view_vbar_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,set", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,start", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_start_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,stop", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,step", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,page", "efl.dragable.vbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,vbar,press", "efl", - obj, _efl_ui_list_view_vbar_press_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,vbar,unpress", "efl", - obj, _efl_ui_list_view_vbar_unpress_cb, NULL); - - //Horizontal bar - efl_layout_signal_callback_del - (obj, "drag", "efl.dragable.hbar", - obj, _efl_ui_list_view_hbar_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,set", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,start", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_start_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,stop", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,step", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,page", "efl.dragable.hbar", - obj, _efl_ui_list_view_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,hbar,press", "efl", - obj, _efl_ui_list_view_hbar_press_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,hbar,unpress", "efl", - obj, _efl_ui_list_view_hbar_unpress_cb, NULL); -} - -EOLIAN static void -_efl_ui_list_view_efl_canvas_group_group_add(Eo *obj, Efl_Ui_List_View_Data *pd) -{ - Efl_Ui_List_View_Pan_Data *pan_data; - Eina_Size2D min = {}; - Eina_Bool bounce = _elm_config->thumbscroll_bounce_enable; - Evas_Object *o; - - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - efl_canvas_group_add(efl_super(obj, MY_CLASS)); - - elm_widget_can_focus_set(obj, EINA_TRUE); - - if (!elm_layout_theme_set(obj, "list_view", "base", elm_widget_style_get(obj))) - CRI("Failed to set layout!"); - - pd->scrl_mgr = efl_add(EFL_UI_SCROLL_MANAGER_CLASS, obj, - efl_ui_mirrored_set(efl_added, efl_ui_mirrored_get(obj))); - efl_composite_attach(obj, pd->scrl_mgr); - pd->pan_obj = efl_add(MY_PAN_CLASS, obj); - pan_data = efl_data_scope_get(pd->pan_obj, MY_PAN_CLASS); - pan_data->wobj = obj; - - efl_ui_scroll_manager_pan_set(pd->scrl_mgr, pd->pan_obj); - efl_ui_scrollable_bounce_enabled_set(pd->scrl_mgr, bounce, bounce); - - edje_object_part_swallow(wd->resize_obj, "efl.content", pd->pan_obj); - edje_object_freeze(wd->resize_obj); - o = (Evas_Object *)edje_object_part_object_get(wd->resize_obj, "efl.dragable.vbar"); - edje_object_thaw(wd->resize_obj); - efl_gfx_stack_raise_to_top((Eo *)o); - - efl_gfx_entity_visible_set(pd->pan_obj, EINA_TRUE); - efl_access_object_access_type_set(obj, EFL_ACCESS_TYPE_DISABLED); - - edje_object_size_min_calc(wd->resize_obj, &min.w, &min.h); - efl_gfx_hint_size_restricted_min_set(obj, min); - - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, - _efl_ui_list_view_bar_size_changed_cb, obj); - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, - _efl_ui_list_view_bar_pos_changed_cb, obj); - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW, - _efl_ui_list_view_bar_show_cb, obj); - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE, - _efl_ui_list_view_bar_hide_cb, obj); - - _efl_ui_list_view_edje_object_attach(obj); -} - -EOLIAN static void -_efl_ui_list_view_efl_canvas_group_group_del(Eo *obj, Efl_Ui_List_View_Data *pd) -{ - efl_ui_list_view_relayout_model_set(pd->relayout, NULL); - - ELM_SAFE_FREE(pd->pan_obj, efl_del); - efl_canvas_group_del(efl_super(obj, MY_CLASS)); -} - -EOLIAN static Efl_Ui_Focus_Manager* -_efl_ui_list_view_efl_ui_widget_focus_manager_focus_manager_create(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root) -{ - if (!pd->manager) - pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, obj, - efl_ui_focus_manager_root_set(efl_added, root)); - - return pd->manager; -} - -EOLIAN static Eo * -_efl_ui_list_view_efl_object_finalize(Eo *obj, Efl_Ui_List_View_Data *pd) -{ - if (!pd->factory) - { - pd->factory = efl_new(EFL_UI_LAYOUT_FACTORY_CLASS); - efl_ui_layout_factory_theme_config(pd->factory, "list_item", NULL, "default"); - } - - if(!pd->relayout) - { - pd->relayout = efl_new(EFL_UI_LIST_VIEW_PRECISE_LAYOUTER_CLASS); - efl_ui_list_view_relayout_model_set(pd->relayout, pd->model); - } - return obj; -} - -EOLIAN static Eo * -_efl_ui_list_view_efl_object_constructor(Eo *obj, Efl_Ui_List_View_Data *pd) +static Eo * +_efl_ui_list_view_efl_object_constructor(Eo *obj, void *pd EINA_UNUSED) { obj = efl_constructor(efl_super(obj, MY_CLASS)); - pd->obj = obj; - efl_canvas_object_type_set(obj, MY_CLASS_NAME); - evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks); - efl_access_object_role_set(obj, EFL_ACCESS_ROLE_LIST); - pd->seg_array = efl_ui_list_view_seg_array_setup(32); - - efl_event_callback_add(obj, EFL_UI_FOCUS_MANAGER_EVENT_MANAGER_FOCUS_CHANGED, _list_element_focused, NULL); - - efl_ui_focus_composition_logical_mode_set(obj, EINA_TRUE); - - pd->style = eina_stringshare_add(elm_widget_style_get(obj)); - - pd->factory = NULL; - pd->min.w = 0; - pd->min.h = 0; + efl_ui_collection_view_position_manager_set(obj, efl_new(EFL_UI_POSITION_MANAGER_LIST_CLASS)); return obj; } -EOLIAN static void -_efl_ui_list_view_efl_object_destructor(Eo *obj, Efl_Ui_List_View_Data *pd) -{ - efl_event_callback_del(obj, EFL_UI_FOCUS_MANAGER_EVENT_MANAGER_FOCUS_CHANGED, - _list_element_focused, NULL); - - _efl_ui_list_view_edje_object_detach(obj); - - efl_replace(&pd->model, NULL); - efl_replace(&pd->relayout, NULL); - efl_replace(&pd->factory, NULL); - - efl_ui_list_view_seg_array_free(pd->seg_array); - - eina_stringshare_del(pd->style); - efl_destructor(efl_super(obj, MY_CLASS)); -} - -EOLIAN static void -_efl_ui_list_view_layout_factory_set(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd, Efl_Ui_Factory *factory) -{ - efl_replace(&pd->factory, factory); -} - -EOLIAN static void -_efl_ui_list_view_efl_ui_view_model_set(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd, Efl_Model *model) -{ - if (!efl_replace(&pd->model, model)) - return; - - efl_ui_list_view_seg_array_flush(pd->seg_array); - - if (pd->relayout) - efl_ui_list_view_relayout_model_set(pd->relayout, pd->model); - - evas_object_smart_changed(pd->obj); -} - -EOLIAN static Efl_Model * -_efl_ui_list_view_efl_ui_view_model_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - return pd->model; -} - -EOLIAN int -_efl_ui_list_view_efl_access_selection_selected_children_count_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - return eina_list_count(pd->selected_items); -} - -EOLIAN Eo* -_efl_ui_list_view_efl_access_selection_selected_child_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd, int child_index) -{ - if(child_index < (int) eina_list_count(pd->selected_items)) - { - Efl_Ui_List_View_Layout_Item* items = eina_list_nth(pd->selected_items, child_index); - return items[child_index].layout; - } - else - return NULL; -} - -EOLIAN Eina_Bool -_efl_ui_list_view_efl_access_selection_child_select(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED, int child_index EINA_UNUSED) -{ - return EINA_FALSE; -} - -EOLIAN Eina_Bool -_efl_ui_list_view_efl_access_selection_selected_child_deselect(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED, int child_index EINA_UNUSED) -{ - return EINA_FALSE; -} - -EOLIAN Eina_Bool -_efl_ui_list_view_efl_access_selection_is_child_selected(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED, int child_index EINA_UNUSED) -{ - return EINA_FALSE; -} - -EOLIAN Eina_Bool -_efl_ui_list_view_efl_access_selection_all_children_select(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED) -{ - return EINA_TRUE; -} - -EOLIAN Eina_Bool -_efl_ui_list_view_efl_access_selection_access_selection_clear(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED) -{ - return EINA_TRUE; -} - -EOLIAN Eina_Bool -_efl_ui_list_view_efl_access_selection_child_deselect(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd EINA_UNUSED, int child_index EINA_UNUSED) -{ - return EINA_FALSE; -} - -static Eina_Bool -_key_action_move(Evas_Object *obj EINA_UNUSED, const char *params EINA_UNUSED) -{ - return EINA_FALSE; -} - -static Eina_Bool -_key_action_select(Evas_Object *obj EINA_UNUSED, const char *params EINA_UNUSED) -{ - return EINA_FALSE; -} - -static Eina_Bool -_key_action_escape(Evas_Object *obj, const char *params EINA_UNUSED) -{ - efl_ui_focus_manager_reset_history(obj); - return EINA_TRUE; -} - -void -_efl_ui_list_view_item_select_set(Efl_Ui_List_View_Layout_Item *item, Eina_Bool selected) -{ - Eina_Stringshare *sprop; - assert(item != NULL); - assert(item->children != NULL); - - selected = !!selected; - - sprop = eina_stringshare_add(SELECTED_PROP); - - if (_efl_model_properties_has(item->children, sprop)) - { - Eina_Value v; - eina_value_setup(&v, EINA_VALUE_TYPE_BOOL); - eina_value_set(&v, selected); - efl_model_property_set(item->children, sprop, &v); - eina_value_flush(&v); - } - eina_stringshare_del(sprop); -} - -static Eina_Value -_children_slice_then(void * data, const Eina_Value v, const Eina_Future *dead_future EINA_UNUSED) -{ - Efl_Ui_List_View_Data *pd = data; - - if (eina_value_type_get(&v) == EINA_VALUE_TYPE_ERROR) - goto on_error; - - efl_ui_list_view_seg_array_insert_value(pd->seg_array, pd->slice.start, v); - - pd->seg_array_first = pd->slice.start; - pd->slice.start = pd->slice.count = 0; - pd->slice.future = NULL; - - efl_ui_list_view_relayout_layout_do(pd->relayout, pd->obj, pd->seg_array_first, pd->seg_array); - on_error: - return v; -} - -/* EFL UI LIST MODEL INTERFACE */ -EOLIAN static Eina_Size2D -_efl_ui_list_view_efl_ui_list_view_model_min_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - return pd->min; -} - -EOLIAN static void -_efl_ui_list_view_efl_ui_list_view_model_min_size_set(Eo *obj, Efl_Ui_List_View_Data *pd, Eina_Size2D min) -{ - Eina_Size2D sz; - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - pd->min.w = min.w; - pd->min.h = min.h; - - efl_gfx_hint_size_min_set(wd->resize_obj, EINA_SIZE2D(pd->min.w, pd->min.h)); - sz = pd->min; - efl_event_callback_call(pd->pan_obj, EFL_UI_PAN_EVENT_PAN_CONTENT_SIZE_CHANGED, &sz); -} - -EOLIAN static void -_efl_ui_list_view_efl_ui_focus_composition_prepare(Eo *obj, Efl_Ui_List_View_Data *pd) -{ - Eina_List *order = efl_ui_list_view_relayout_elements_get(pd->relayout); - efl_ui_focus_composition_elements_set(obj, order); -} - -EOLIAN Eina_List* -_efl_ui_list_view_efl_access_object_access_children_get(const Eo *obj, Efl_Ui_List_View_Data *pd) -{ - Eina_List *ret = NULL, *ret2 = NULL; - - ret = efl_ui_list_view_relayout_elements_get(pd->relayout); - ret2 = efl_access_object_access_children_get(efl_super(obj, EFL_UI_LIST_VIEW_CLASS)); - - return eina_list_merge(ret, ret2); -} - -EOLIAN static Eina_Bool -_efl_ui_list_view_efl_ui_widget_focus_state_apply(Eo *obj, Efl_Ui_List_View_Data *pd EINA_UNUSED, Efl_Ui_Widget_Focus_State current_state, Efl_Ui_Widget_Focus_State *configured_state, Efl_Ui_Widget *redirect EINA_UNUSED) -{ - return efl_ui_widget_focus_state_apply(efl_super(obj, MY_CLASS), current_state, configured_state, obj); -} - -typedef struct _Efl_Ui_List_Vuew_Layout_Item_Tracking Efl_Ui_List_View_Layout_Item_Tracking; -struct _Efl_Ui_List_Vuew_Layout_Item_Tracking -{ - Efl_Ui_List_View_Layout_Item *item; - Efl_Ui_List_View_Data *pd; -}; - -static Eina_Value -_content_created(Eo *obj, void *data, const Eina_Value value) -{ - Efl_Ui_List_View_Layout_Item_Tracking *tracking = data; - Efl_Ui_List_View_Layout_Item *item = tracking->item; - Efl_Ui_List_View_Item_Event evt; - - if (eina_value_array_count(&value) != 1) return eina_value_error_init(EINVAL); - eina_value_array_get(&value, 0, &item->layout); - - efl_canvas_group_member_add(tracking->pd->pan_obj, item->layout); - evas_object_event_callback_add(item->layout, EVAS_CALLBACK_MOUSE_UP, _on_item_mouse_up, item); - - if (_elm_config->atspi_mode) - { - efl_access_added(item->layout); - efl_access_children_changed_added_signal_emit(obj, item->layout); - } - - evt.child = item->children; - evt.layout = item->layout; - evt.index = efl_ui_list_view_item_index_get(item); - efl_event_callback_call(obj, EFL_UI_LIST_VIEW_EVENT_ITEM_REALIZED, &evt); - - tracking->item->layout_request = NULL; - efl_ui_list_view_relayout_content_created(tracking->pd->relayout, item); - - efl_ui_focus_composition_dirty(obj); - evas_object_show(item->layout); - - return value; -} - -static void -_clean_request(Eo *obj EINA_UNUSED, void *data, const Eina_Future *dead_future EINA_UNUSED) -{ - Efl_Ui_List_View_Layout_Item_Tracking *tracking = data; - - tracking->item->layout_request = NULL; - free(tracking); -} - -EOLIAN static Efl_Ui_List_View_Layout_Item * -_efl_ui_list_view_efl_ui_list_view_model_realize(Eo *obj, Efl_Ui_List_View_Data *pd, Efl_Ui_List_View_Layout_Item *item) -{ - Efl_Ui_List_View_Layout_Item_Tracking *tracking; - Efl_Model *childrens[1]; - EINA_SAFETY_ON_NULL_RETURN_VAL(item->children, item); - - if (!item->children) return item; - - if (item->layout_request) eina_future_cancel(item->layout_request); - - tracking = calloc(1, sizeof (Efl_Ui_List_View_Layout_Item_Tracking)); - if (!tracking) return item; - - tracking->item = item; - tracking->pd = pd; - childrens[0] = item->children; - - item->layout_request = efl_ui_view_factory_create_with_event(pd->factory, EINA_C_ARRAY_ITERATOR_NEW(childrens)); - item->layout_request = efl_future_then(obj, item->layout_request, - .success = _content_created, - .success_type = EINA_VALUE_TYPE_ARRAY, - .data = tracking, - .free = _clean_request); - - return item; -} - -EOLIAN static void -_efl_ui_list_view_efl_ui_list_view_model_unrealize(Eo *obj, Efl_Ui_List_View_Data *pd, Efl_Ui_List_View_Layout_Item *item) -{ - Efl_Ui_List_View_Item_Event evt; - Efl_Gfx_Entity *entities[1]; - EINA_SAFETY_ON_NULL_RETURN(item); - - if (!item->layout) - return; - - // First check if the item has been fully realized - if (item->layout_request) - { - eina_future_cancel(item->layout_request); - return ; - } - - evas_object_event_callback_del_full(item->layout, EVAS_CALLBACK_MOUSE_UP, _on_item_mouse_up, item); - if (elm_object_focus_allow_get(item->layout)) - { - if (efl_ui_focus_object_focus_get(item->layout)) - efl_ui_focus_object_focus_set(item->layout, EINA_FALSE); - efl_ui_focus_manager_calc_unregister(obj, item->layout); - } - evas_object_hide(item->layout); - evas_object_move(item->layout, -9999, -9999); - - evt.child = item->children; - evt.layout = item->layout; - evt.index = efl_ui_list_view_item_index_get(item); - efl_event_callback_call(obj, EFL_UI_LIST_VIEW_EVENT_ITEM_UNREALIZED, &evt); - - efl_canvas_group_member_remove(obj, pd->pan_obj); - entities[0] = item->layout; - efl_ui_factory_release(pd->factory, EINA_C_ARRAY_ITERATOR_NEW(entities)); - item->layout = NULL; -} - -EOLIAN static void -_efl_ui_list_view_efl_ui_list_view_model_load_range_set(Eo* obj, Efl_Ui_List_View_Data* pd, int first, int count) -{ - if (pd->slice.future) return ; - - pd->slice.start = first; - pd->slice.count = count; - - if (efl_model_children_count_get(pd->model)) - { - Eina_Future *f = efl_model_children_slice_get(pd->model, first, count); - f = eina_future_then(f, _children_slice_then, pd, NULL); - pd->slice.future = efl_future_then(obj, f); - } -} - -EOLIAN static int -_efl_ui_list_view_efl_ui_list_view_model_model_size_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Data *pd) -{ - return efl_model_children_count_get(pd->model); -} - -ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(efl_ui_list_view, Efl_Ui_List_View_Data) - -/* Internal EO APIs and hidden overrides */ - -#define EFL_UI_LIST_VIEW_EXTRA_OPS \ - EFL_CANVAS_GROUP_ADD_DEL_OPS(efl_ui_list_view) - #include "efl_ui_list_view.eo.c" -#include "efl_ui_list_view_relayout.eo.c" -#include "efl_ui_list_view_model.eo.c" diff --git a/src/lib/elementary/efl_ui_list_view.eo b/src/lib/elementary/efl_ui_list_view.eo index d552ce4793..c4de87da5a 100644 --- a/src/lib/elementary/efl_ui_list_view.eo +++ b/src/lib/elementary/efl_ui_list_view.eo @@ -1,97 +1,17 @@ -import elm_general; - -struct @beta Efl.Ui.List_View_Item_Event +class @beta Efl.Ui.List_View extends Efl.Ui.Collection_View { - [[Information related to item events.]] // TODO: This needs to be filled in. - layout: Efl.Ui.Layout; [[TBD]] - child: Efl.Model; [[TBD]] - index: int; [[TBD]] -} -class @beta Efl.Ui.List_View extends Efl.Ui.Layout_Base implements - Efl.Access.Widget.Action, Efl.Access.Selection, - Efl.Ui.Focus.Composition, Efl.Ui.Focus.Manager_Sub, - Efl.Ui.Container_Selectable, Efl.Ui.List_View_Model, - Efl.Ui.Widget_Focus_Manager - composites - Efl.Ui.Scrollable, Efl.Ui.Scrollbar -{ - methods { - @property homogeneous { - [[When in homogeneous mode, all items have the same height and width. - Otherwise, each item's size is respected. - ]] - get { - } - set { - } - values { - homogeneous: bool; [[Homogeneous mode setting. Default is $false.]] - } - } - @property select_mode { - [[Listview select mode.]] - get {} - set {} - values { - mode: Elm.Object.Select_Mode(Elm.Object.Select_Mode.max); [[The select mode.]] - } - } - @property default_style { - [[TBD]] // TODO: This needs to be filled in. Does not seem to be in use. - values { - style: stringshare; [[TBD]] - } - } - @property layout_factory { - [[Listview layout factory set.]] - set {} - values { - factory: Efl.Ui.Factory; [[The factory.]] - } - } - } - events { - item,realized : Efl.Ui.List_View_Item_Event; - item,unrealized : Efl.Ui.List_View_Item_Event; - item,focused : Efl.Ui.List_View_Item_Event; - item,unfocused : Efl.Ui.List_View_Item_Event; - item,highlighted : Efl.Ui.List_View_Item_Event; - item,unhighlighted : Efl.Ui.List_View_Item_Event; - } + [[A scrollable list of @Efl.Ui.Item objects, typically @Efl.Ui.List_Default_Item objects. + Items are added asynchronously by an @Efl.Ui.Factory from the definition of an @Efl.Model. + + The orientation (vertical or horizontal) of the list can be set with + @Efl.Ui.Layout_Orientable.orientation. + + Items inside this widget can be selected according to the @Efl.Ui.Multi_Selectable_Async.select_mode + policy, and the selection can be retrieved with @Efl.Ui.Multi_Selectable_Async.selected_iterator_new. + ]] + data: null; implements { Efl.Object.constructor; - Efl.Object.finalize; - Efl.Object.destructor; - Efl.Gfx.Entity.position { set; } - Efl.Gfx.Entity.size { set; } - // Smart obj - Efl.Canvas.Group.group_member_add; - Efl.Canvas.Group.group_calculate; - - Efl.Ui.List_View_Model.load_range { set;} - Efl.Ui.List_View_Model.realize; - Efl.Ui.List_View_Model.unrealize; - Efl.Ui.List_View_Model.model_size { get; } - Efl.Ui.List_View_Model.min_size { get; set; } - - // Widget - Efl.Ui.Widget_Focus_Manager.focus_manager_create; - Efl.Ui.Widget.widget_input_event_handler; - Efl.Ui.Widget.focus_state_apply; - Efl.Ui.Focus.Composition.prepare; - Efl.Ui.View.model { get; set; } - - Efl.Layout.Signal.signal_callback_add; - Efl.Layout.Signal.signal_callback_del; - Efl.Access.Object.access_children { get; } - Efl.Access.Selection.selected_children_count { get; } - Efl.Access.Selection.selected_child { get; } - Efl.Access.Selection.selected_child_deselect; - Efl.Access.Selection.child_select; - Efl.Access.Selection.child_deselect; - Efl.Access.Selection.is_child_selected; - Efl.Access.Selection.all_children_select; - Efl.Access.Selection.access_selection_clear; } } diff --git a/src/lib/elementary/efl_ui_list_view_model.eo b/src/lib/elementary/efl_ui_list_view_model.eo deleted file mode 100644 index cf4780ed5f..0000000000 --- a/src/lib/elementary/efl_ui_list_view_model.eo +++ /dev/null @@ -1,41 +0,0 @@ -import efl_ui_list_view_types; - -interface @beta Efl.Ui.List_View_Model -{ - methods { - @property load_range { - set {} - values { - first: int; - count: int; - } - } - realize { - params { - item: ptr(Efl.Ui.List_View_Layout_Item); - } - return: ptr(Efl.Ui.List_View_Layout_Item); - } - unrealize { - params { - item: ptr(Efl.Ui.List_View_Layout_Item); - } - } - @property model_size { - get {} - values { - s: int; - } - } - @property min_size { - [[Minimal content size.]] - set {} - get {} - values { - min: Eina.Size2D; - } - } - - - } -} diff --git a/src/lib/elementary/efl_ui_list_view_pan.eo b/src/lib/elementary/efl_ui_list_view_pan.eo deleted file mode 100644 index 1bd72a8300..0000000000 --- a/src/lib/elementary/efl_ui_list_view_pan.eo +++ /dev/null @@ -1,12 +0,0 @@ -class @beta Efl.Ui.List_View_Pan extends Efl.Ui.Pan -{ - [[Elementary Efl_Ui_List_View pan class]] - implements { - Efl.Object.destructor; - Efl.Ui.Pan.content_size { get; } - Efl.Ui.Pan.pan_position { get; set; } - Efl.Ui.Pan.pan_position_min { get; } - Efl.Ui.Pan.pan_position_max { get; } - Efl.Canvas.Group.group_calculate; - } -} diff --git a/src/lib/elementary/efl_ui_list_view_precise_layouter.c b/src/lib/elementary/efl_ui_list_view_precise_layouter.c deleted file mode 100644 index a7ee6ec102..0000000000 --- a/src/lib/elementary/efl_ui_list_view_precise_layouter.c +++ /dev/null @@ -1,728 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include "elementary_config.h" -#endif - -#include - -#include - -#include "elm_priv.h" -#include "efl_ui_list_view_relayout.eo.h" -#include "efl_ui_list_view_seg_array.h" - -#define MY_CLASS EFL_UI_LIST_VIEW_PRECISE_LAYOUTER_CLASS - -typedef struct _Efl_Ui_List_View_Precise_Layouter_Data -{ - Efl_Model* model; - Efl_Ui_List_View_Model *modeler; - Ecore_Job *calc_job; - Efl_Ui_List_View_Seg_Array *seg_array; - - Eina_Size2D min; - - unsigned int calc_progress; - - int count_total; - - Eina_Bool initialized : 1; - Eina_Bool recalc : 1; - Eina_Bool resize : 1; -} Efl_Ui_List_View_Precise_Layouter_Data; - -typedef struct _Efl_Ui_List_View_Precise_Layouter_Node_Data -{ - Eina_Size2D min; - Eina_Size2D size; - - Eina_Bool realized; -} Efl_Ui_List_View_Precise_Layouter_Node_Data; - -typedef struct _Efl_Ui_List_View_Precise_Layouter_Callback_Data -{ - Efl_Ui_List_View_Precise_Layouter_Data *pd; - Efl_Ui_List_View_Layout_Item *item; -} Efl_Ui_List_View_Precise_Layouter_Callback_Data; - -#include "efl_ui_list_view_precise_layouter.eo.h" - -static void _efl_ui_list_view_relayout_layout_do(Efl_Ui_List_View_Precise_Layouter_Data *); -static Eina_Bool _initilize(Eo *, Efl_Ui_List_View_Precise_Layouter_Data*, Efl_Ui_List_View_Model*, Efl_Ui_List_View_Seg_Array*); -static void _finalize(Eo *, Efl_Ui_List_View_Precise_Layouter_Data*); -static void _node_realize(Efl_Ui_List_View_Precise_Layouter_Data*, Efl_Ui_List_View_Seg_Array_Node*); -static void _node_unrealize(Efl_Ui_List_View_Precise_Layouter_Data*, Efl_Ui_List_View_Seg_Array_Node*); - -static void -_item_size_calc(Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_Ui_List_View_Layout_Item* item) -{ - int boxx, boxy, boxw, boxh, boxl, boxr, boxt, boxb, pad[4]; - double align[2]; - Eina_Bool fill[2]; - Eina_Size2D max; - - efl_gfx_hint_margin_get(item->layout, &pad[0], &pad[1], &pad[2], &pad[3]); - evas_object_geometry_get(pd->modeler, &boxx, &boxy, &boxw, &boxh); - efl_gfx_hint_margin_get(pd->modeler, &boxl, &boxr, &boxt, &boxb); - efl_gfx_hint_align_get(item->layout, &align[0], &align[1]); - efl_gfx_hint_fill_get(item->layout, &fill[0], &fill[1]); - max = efl_gfx_hint_size_combined_max_get(item->layout); - - // box outer margin - boxw -= boxl + boxr; - boxh -= boxt + boxb; - boxx += boxl; - boxy += boxt; - - if (EINA_DBL_EQ(align[0], -1)) - { - align[0] = 0.5; - fill[0] = EINA_TRUE; - } - else if (align[0] < 0) - { - align[0] = 0; - } - if (EINA_DBL_EQ(align[1], -1)) - { - align[1] = 0.5; - fill[1] = EINA_TRUE; - } - else if (align[1] < 0) - { - align[1] = 0; - } - - if (align[0] > 1) align[0] = 1; - if (align[1] > 1) align[1] = 1; - - if (max.w <= 0) max.w = INT_MAX; - if (max.h <= 0) max.h = INT_MAX; - if (max.w < item->min.w) max.w = item->min.w; - if (max.h < item->min.h) max.h = item->min.h; - - // horizontally - if (max.w < INT_MAX) - { - item->size.w = MIN(MAX(item->min.w - pad[0] - pad[1], max.w), boxw); - item->pos.x = boxx + pad[0]; - } - else if (fill[0]) - { - // fill x - item->size.w = boxw - pad[0] - pad[1]; - item->pos.x = boxx + pad[0]; - } - else - { - item->size.w = item->min.w - pad[0] - pad[1]; - item->pos.x = boxx + ((boxw - item->size.w) * align[0]) + pad[0]; - } - - // vertically - if (max.h < INT_MAX) - { - item->size.h = MIN(MAX(item->min.h - pad[2] - pad[3], max.h), boxh); - item->pos.y = boxy + pad[2]; - } - else if (fill[1]) - { - // fill y - item->size.h = item->min.h - pad[2] - pad[3]; - item->pos.y = boxy + pad[2]; - } - else - { - item->size.h = item->min.h - pad[2] - pad[3]; - item->pos.y = boxy + ((item->min.h - item->size.h) * align[1]) + pad[2]; - } -} - -static Eina_Size2D -_item_min_calc(Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_Ui_List_View_Layout_Item* item) -{ - Efl_Ui_List_View_Seg_Array_Node *itemnode = item->tree_node; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata; - Efl_Ui_List_View_Layout_Item *layout_item; - int i, pad[4]; - - Eina_Size2D min = efl_gfx_hint_size_combined_min_get(item->layout); - - efl_gfx_hint_margin_get(item->layout, &pad[0], &pad[1], &pad[2], &pad[3]); - min.w += pad[0] + pad[1]; - min.h += pad[2] + pad[3]; - - if (item->min.h == min.h && item->min.w == min.w) - return min; - - EINA_SAFETY_ON_NULL_RETURN_VAL(itemnode, min); - EINA_SAFETY_ON_NULL_RETURN_VAL(itemnode->layout_data, min); - nodedata = itemnode->layout_data; - - pd->min.h += min.h - item->min.h; - nodedata->min.h += min.h - item->min.h; - - if (nodedata->min.w <= min.w) - nodedata->min.w = min.w; - else if (nodedata->min.w == item->min.w) - { - nodedata->min.w = 0; - for (i = 0; i != itemnode->length; ++i) - { - layout_item = (Efl_Ui_List_View_Layout_Item *)itemnode->pointers[i]; - if (nodedata->min.w < layout_item->min.w) - nodedata->min.w = layout_item->min.w; - - if (item->min.w == layout_item->min.w) - break; - } - } - - if (pd->min.w <= min.w) - pd->min.w = min.w; - else if (pd->min.w == item->min.w) - { - Efl_Ui_List_View_Seg_Array_Node *node2; - Eina_Accessor *nodes = efl_ui_list_view_seg_array_node_accessor_get(pd->seg_array); - pd->min.w = min.w; - - EINA_ACCESSOR_FOREACH(nodes, i, node2) - { - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata2 = node2->layout_data; - if (pd->min.w < nodedata2->min.w) - pd->min.w = nodedata2->min.w; - - if (item->min.w == nodedata2->min.w) - break; - } - eina_accessor_free(nodes); - } - - item->min.w = min.w; - item->min.h = min.h; - return item->min; -} - -static void -_on_item_size_hint_change(void *data, Evas *e EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ - Efl_Ui_List_View_Precise_Layouter_Callback_Data *cb_data = data; - Efl_Ui_List_View_Precise_Layouter_Data *pd = cb_data->pd; - Efl_Ui_List_View_Layout_Item *item = cb_data->item;; - Efl_Ui_List_View_Seg_Array_Node *node = item->tree_node; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata = node->layout_data; - - _item_min_calc(pd, item); - if (!nodedata->realized) - { - free(evas_object_event_callback_del(item->layout, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_item_size_hint_change)); - efl_ui_list_view_model_unrealize(pd->modeler, item); - } -} - -static void -_on_modeler_resize(void *data, Evas *e EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ - Efl_Ui_List_View_Precise_Layouter_Data *pd = data; - pd->resize = EINA_TRUE; -} - -typedef struct _Request Request; -struct _Request -{ - Efl_Ui_List_View_Precise_Layouter_Data *pd; - unsigned int index; -}; - -static Eina_Value -_children_get(void *data, const Eina_Value v, const Eina_Future *dead_future EINA_UNUSED) -{ - Request *r = data; - - if (eina_value_type_get(&v) == EINA_VALUE_TYPE_ERROR) - goto on_error; - - efl_ui_list_view_seg_array_insert_value(r->pd->seg_array, r->index, v); - r->pd->recalc = EINA_TRUE; - evas_object_smart_changed(r->pd->modeler); - - on_error: - free(r); - return v; -} - -static void -_child_added_cb(void *data, const Efl_Event *event) -{ - Efl_Model_Children_Event* evt = event->info; - Efl_Ui_List_View_Precise_Layouter_Data *pd = data; - Eina_Future *f; - Request *r; - - r = calloc(1, sizeof (Request)); - if (!r) return; - - r->index = evt->index; - r->pd = pd; - - f = efl_model_children_slice_get(pd->model, evt->index, 1); - f = eina_future_then(f, _children_get, r, NULL); -} - -static void -_child_removed_cb(void *data, const Efl_Event *event) -{ - Efl_Model_Children_Event* evt = event->info; - Efl_Ui_List_View_Precise_Layouter_Data *pd = data; - Efl_Ui_List_View_Layout_Item *layout_item, *litem; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata; - Efl_Ui_List_View_Seg_Array_Node *itemnode; - int i; - - litem = efl_ui_list_view_seg_array_remove(pd->seg_array, evt->index); - if (!litem) return; - - itemnode = litem->tree_node; - nodedata = itemnode->layout_data; - - free(evas_object_event_callback_del(litem->layout, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_item_size_hint_change)); - - pd->min.h -= litem->min.h; - nodedata->min.h -= litem->min.h; - - if (nodedata->min.w == litem->min.w) - nodedata->min.w = 0; - - for (i = 0; i != itemnode->length; ++i) - { - layout_item = (Efl_Ui_List_View_Layout_Item *)itemnode->pointers[i]; - if (nodedata->min.w < layout_item->min.w) - nodedata->min.w = layout_item->min.w; - - if (litem->min.w == layout_item->min.w) - { - nodedata->min.w = layout_item->min.w; - break; - } - } - - if (pd->min.w == litem->min.w) - { - Efl_Ui_List_View_Seg_Array_Node *node2; - Eina_Accessor *nodes = efl_ui_list_view_seg_array_node_accessor_get(pd->seg_array); - pd->min.w = 0; - - EINA_ACCESSOR_FOREACH(nodes, i, node2) - { - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata2 = node2->layout_data; - if (pd->min.w < nodedata2->min.w) - pd->min.w = nodedata2->min.w; - - if (litem->min.w == nodedata2->min.w) - break; - } - eina_accessor_free(nodes); - } - efl_ui_list_view_model_unrealize(pd->modeler, litem); - - free(litem); - pd->recalc = EINA_TRUE; - evas_object_smart_changed(pd->modeler); -} - -static void -_child_count_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) -{ - Efl_Ui_List_View_Precise_Layouter_Data *pd = data; - pd->count_total = efl_model_children_count_get(pd->model); - if (pd->count_total) - efl_event_callback_del(pd->model, EFL_MODEL_EVENT_CHILDREN_COUNT_CHANGED, _child_count_changed_cb, pd); -} - -static Eina_Bool -_initilize(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_Ui_List_View_Model *modeler, Efl_Ui_List_View_Seg_Array *seg_array) -{ - if(pd->initialized) - return EINA_TRUE; - - efl_replace(&pd->modeler, modeler); - - if(!pd->model || !pd->modeler) - return EINA_FALSE; - - pd->recalc = EINA_TRUE; - pd->initialized = EINA_TRUE; - - pd->seg_array = seg_array; - - efl_ui_list_view_model_load_range_set(pd->modeler, 0, pd->count_total); // load all - efl_event_callback_add(pd->model, EFL_MODEL_EVENT_CHILD_ADDED, _child_added_cb, pd); - efl_event_callback_add(pd->model, EFL_MODEL_EVENT_CHILD_REMOVED, _child_removed_cb, pd); - - evas_object_event_callback_add(modeler, EVAS_CALLBACK_RESIZE, _on_modeler_resize, pd); - pd->min.w = 0; - pd->min.h = 0; - - return EINA_TRUE; -} - -static void -_finalize(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Precise_Layouter_Data *pd) -{ - Efl_Ui_List_View_Seg_Array_Node* node; - int i = 0; - - if (pd->model) - { - efl_event_callback_del(pd->model, EFL_MODEL_EVENT_CHILD_ADDED, _child_added_cb, pd); - efl_event_callback_del(pd->model, EFL_MODEL_EVENT_CHILD_REMOVED, _child_removed_cb, pd); - pd->count_total = 0; - } - - if (pd->seg_array) - { - Eina_Accessor *nodes = efl_ui_list_view_seg_array_node_accessor_get(pd->seg_array); - EINA_ACCESSOR_FOREACH(nodes, i, node) - { - _node_unrealize(pd, node); - free(node->layout_data); - } - - eina_accessor_free(nodes); - } - - pd->min.w = 0; - pd->min.h = 0; - - if (pd->modeler) - { - evas_object_event_callback_del_full(pd->modeler, EVAS_CALLBACK_RESIZE, _on_modeler_resize, pd); - efl_ui_list_view_model_min_size_set(pd->modeler, pd->min); - } - - pd->seg_array = NULL; - efl_replace(&pd->modeler, NULL); - - pd->initialized = EINA_FALSE; - pd->recalc = EINA_TRUE; -} - -static void -_node_realize(Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_Ui_List_View_Seg_Array_Node *node) -{ - Efl_Ui_List_View_Layout_Item* layout_item; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata = node->layout_data; - int i; - - EINA_SAFETY_ON_NULL_RETURN(nodedata); - if (nodedata->realized) - return; - - nodedata->realized = EINA_TRUE; - - for (i = 0; i != node->length; ++i) - { - layout_item = (Efl_Ui_List_View_Layout_Item *)node->pointers[i]; - efl_ui_list_view_model_realize(pd->modeler, layout_item); - } -} - -static void -_node_unrealize(Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_Ui_List_View_Seg_Array_Node *node) -{ - Efl_Ui_List_View_Layout_Item* layout_item; - Efl_Ui_List_View_Precise_Layouter_Callback_Data *cb_data; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata = node->layout_data; - int i; - - EINA_SAFETY_ON_NULL_RETURN(nodedata); - if (!nodedata->realized) - return; - - nodedata->realized = EINA_FALSE; - - for (i = 0; i != node->length; ++i) - { - layout_item = (Efl_Ui_List_View_Layout_Item *)node->pointers[i]; - if (layout_item->layout) - { - cb_data = evas_object_event_callback_del(layout_item->layout, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_item_size_hint_change); - free(cb_data); - efl_ui_list_view_model_unrealize(pd->modeler, layout_item); - } - } -} - -static void -_calc_range(Efl_Ui_List_View_Precise_Layouter_Data *pd) -{ - Efl_Ui_List_View_Seg_Array_Node *node; - Evas_Coord ch, ny; - Eina_Rect vgmt; - Eina_Position2D spos; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata; - int i; - - vgmt = efl_ui_scrollable_viewport_geometry_get(pd->modeler); - spos = efl_ui_scrollable_content_pos_get(pd->modeler); - - ny = spos.y - (vgmt.h / 2); - if (ny < 0) spos.y = 0; - else spos.y = ny; - vgmt.h *= 2; - - ch = 0; - Eina_Accessor *nodes = efl_ui_list_view_seg_array_node_accessor_get(pd->seg_array); - EINA_ACCESSOR_FOREACH(nodes, i, node) - { - nodedata = node->layout_data; - if (!nodedata || !nodedata->min.h) - continue; - - if ((ch > spos.y || nodedata->min.h + ch > spos.y) && (ch < (spos.y + vgmt.h) || nodedata->min.h + ch < spos.y + vgmt.h)) - _node_realize(pd, node); - else - _node_unrealize(pd, node); - - ch += nodedata->min.h; - } - eina_accessor_free(nodes); -} - -static void -_calc_size_job(void *data) -{ - Efl_Ui_List_View_Precise_Layouter_Data *pd; - Efl_Ui_List_View_Seg_Array_Node *node; - Efl_Ui_List_View_Layout_Item *layout_item; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata; - Eo *obj = data; - int i; - double start_time = ecore_time_get(); - - EINA_SAFETY_ON_NULL_RETURN(data); - pd = efl_data_scope_get(obj, MY_CLASS); - if (EINA_UNLIKELY(!pd)) return; - - Eina_Accessor *nodes = efl_ui_list_view_seg_array_node_accessor_get(pd->seg_array); - while (eina_accessor_data_get(nodes, pd->calc_progress, (void **)&node)) - { - pd->calc_progress++; - if (!node->layout_data) - node->layout_data = calloc(1, sizeof(Efl_Ui_List_View_Precise_Layouter_Node_Data)); - - nodedata = node->layout_data; - if (pd->calc_progress == 1) - nodedata->realized = EINA_TRUE; - - for (i = 0; i != node->length; ++i) - { - layout_item = (Efl_Ui_List_View_Layout_Item *)node->pointers[i]; - EINA_SAFETY_ON_NULL_RETURN(layout_item); - - // cache size of new items - if ((layout_item->min.w == 0) && (layout_item->min.h == 0) && (!layout_item->layout)) - efl_ui_list_view_model_realize(pd->modeler, layout_item); - } - - if ( (ecore_time_get() - start_time ) > 0.01 ) - { - ecore_job_del(pd->calc_job); - pd->calc_job = ecore_job_add(_calc_size_job, obj); - eina_accessor_free(nodes); - return; - } - } - eina_accessor_free(nodes); - pd->calc_progress = 0; - pd->calc_job = NULL; - pd->recalc = EINA_FALSE; -} - -EOLIAN static Efl_Object * -_efl_ui_list_view_precise_layouter_efl_object_constructor(Eo *obj, Efl_Ui_List_View_Precise_Layouter_Data *pd) -{ - obj = efl_constructor(efl_super(obj, MY_CLASS)); - pd->initialized = EINA_FALSE; - - return obj; -} - -EOLIAN static void -_efl_ui_list_view_precise_layouter_efl_ui_list_view_relayout_content_created(Eo *obj EINA_UNUSED, Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_Ui_List_View_Layout_Item *item) -{ - Efl_Ui_List_View_Precise_Layouter_Callback_Data *cb_data; - EINA_SAFETY_ON_NULL_RETURN(item); - EINA_SAFETY_ON_NULL_RETURN(item->layout); - Efl_Ui_List_View_Seg_Array_Node *node = item->tree_node; - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata = node->layout_data; - - Eina_Size2D min = _item_min_calc(pd, item); - - if (min.w && min.h && !nodedata->realized) - { - efl_ui_list_view_model_unrealize(pd->modeler, item); - return; - } - - cb_data = calloc(1, sizeof(Efl_Ui_List_View_Precise_Layouter_Callback_Data)); - if (!cb_data) return; - cb_data->pd = pd; - cb_data->item = item; - evas_object_event_callback_add(item->layout, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_item_size_hint_change, cb_data); - - _item_size_calc(pd, item); -} - -EOLIAN static Eina_List * -_efl_ui_list_view_precise_layouter_efl_ui_list_view_relayout_elements_get(const Eo *obj EINA_UNUSED, Efl_Ui_List_View_Precise_Layouter_Data *pd) -{ - Eina_List *elements_order = NULL; - Efl_Ui_List_View_Layout_Item* layout_item; - Efl_Ui_List_View_Seg_Array_Node *items_node; - int i, j = 0; - - Eina_Accessor *nodes = efl_ui_list_view_seg_array_node_accessor_get(pd->seg_array); - EINA_ACCESSOR_FOREACH(nodes, i, items_node) - { - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata = items_node->layout_data; - if (!nodedata || !nodedata->realized) - continue; - - for (j = 0; j != items_node->length;++j) - { - layout_item = (Efl_Ui_List_View_Layout_Item *)items_node->pointers[j]; - if (layout_item->layout) - elements_order = eina_list_append(elements_order, layout_item->layout); - } - } - - eina_accessor_free(nodes); - return elements_order; -} - -EOLIAN static void -_efl_ui_list_view_precise_layouter_efl_ui_list_view_relayout_model_set(Eo *obj, Efl_Ui_List_View_Precise_Layouter_Data *pd, Efl_Model *model) -{ - _finalize(obj, pd); - - efl_replace(&pd->model, model); - - if (pd->model) - { - pd->count_total = efl_model_children_count_get(pd->model); - if (pd->count_total && pd->modeler) - efl_ui_list_view_model_load_range_set(pd->modeler, 0, pd->count_total); // load all - else - efl_event_callback_add(pd->model, EFL_MODEL_EVENT_CHILDREN_COUNT_CHANGED, _child_count_changed_cb, pd); - } -} - -static void -_efl_ui_list_view_relayout_layout_do(Efl_Ui_List_View_Precise_Layouter_Data *pd) -{ - Eina_Rect vgmt; - Eina_Position2D spos; - double cur_pos = 0; - Efl_Ui_List_View_Layout_Item* layout_item; - Efl_Ui_List_View_Seg_Array_Node *items_node; - int i, j = 0; - int boxx, boxy, boxw, boxh, extra = 0, rounding = 0; - int boxl = 0, boxr = 0, boxt = 0, boxb = 0; - - _calc_range(pd); - - evas_object_geometry_get(pd->modeler, &boxx, &boxy, &boxw, &boxh); - efl_gfx_hint_margin_get(pd->modeler, &boxl, &boxr, &boxt, &boxb); - - // box outer margin - boxw -= boxl + boxr; - boxh -= boxt + boxb; - boxx += boxl; - boxy += boxt; - - // available space. if <0 we overflow - extra = boxh - pd->min.h; - if (extra < 0) extra = 0; - - efl_ui_list_view_model_min_size_set(pd->modeler, pd->min); - - vgmt = efl_ui_scrollable_viewport_geometry_get(pd->modeler); - spos = efl_ui_scrollable_content_pos_get(pd->modeler); - - Eina_Accessor *nodes = efl_ui_list_view_seg_array_node_accessor_get(pd->seg_array); - EINA_ACCESSOR_FOREACH(nodes, i, items_node) - { - Efl_Ui_List_View_Precise_Layouter_Node_Data *nodedata = items_node->layout_data; - if (!items_node->layout_data) - continue; - - if (!nodedata->realized) - { - cur_pos += nodedata->min.h; - continue; - } - - for (j = 0; j != items_node->length;++j) - { - layout_item = (Efl_Ui_List_View_Layout_Item *)items_node->pointers[j]; - double x, y, w, h; - double weight_x, weight_y; - if (!(layout_item->min.w && layout_item->min.h)) - continue; - - // extra rounding up (compensate cumulative error) - if ((i == (pd->count_total - 1)) && (cur_pos - floor(cur_pos) >= 0.5)) - rounding = 1; - - if (layout_item->layout) - { - if (pd->resize) - _item_size_calc(pd, layout_item); - - efl_gfx_hint_weight_get(layout_item->layout, &weight_x, &weight_y); - } - else - { - cur_pos += layout_item->size.h; - continue; - } - - x = layout_item->pos.x; - y = layout_item->pos.y + cur_pos; - w = layout_item->size.w; - h = layout_item->size.h + rounding + weight_y * extra; - cur_pos += h; - - if (w < pd->min.w) w = pd->min.w; - if (w > vgmt.w) w = vgmt.w; - - evas_object_geometry_set(layout_item->layout, (x + 0 - spos.x), (y + 0 - spos.y), w, h); - } - } - eina_accessor_free(nodes); - - pd->resize = EINA_FALSE; -} - -EOLIAN static void -_efl_ui_list_view_precise_layouter_efl_ui_list_view_relayout_layout_do - (Eo *obj EINA_UNUSED, Efl_Ui_List_View_Precise_Layouter_Data *pd - , Efl_Ui_List_View_Model *modeler, int first EINA_UNUSED, Efl_Ui_List_View_Seg_Array *seg_array) -{ - if (!_initilize(obj, pd, modeler, seg_array) || !pd->seg_array) - return; - - if (!pd->calc_job && pd->recalc && efl_ui_list_view_seg_array_count(seg_array) > 0) - { - // cache size of new items - pd->calc_progress = 0; - pd->calc_job = ecore_job_add(_calc_size_job, obj); - return; - } - - _efl_ui_list_view_relayout_layout_do(pd); -} - -#include "efl_ui_list_view_precise_layouter.eo.c" diff --git a/src/lib/elementary/efl_ui_list_view_precise_layouter.eo b/src/lib/elementary/efl_ui_list_view_precise_layouter.eo deleted file mode 100644 index 0a83c0a08b..0000000000 --- a/src/lib/elementary/efl_ui_list_view_precise_layouter.eo +++ /dev/null @@ -1,10 +0,0 @@ -class @beta Efl.Ui.List_View_Precise_Layouter extends Efl.Object implements Efl.Ui.List_View_Relayout -{ - implements { - Efl.Object.constructor; - Efl.Ui.List_View_Relayout.layout_do; - Efl.Ui.List_View_Relayout.content_created; - Efl.Ui.List_View_Relayout.model { set; } - Efl.Ui.List_View_Relayout.elements { get; } - } -} diff --git a/src/lib/elementary/efl_ui_list_view_private.h b/src/lib/elementary/efl_ui_list_view_private.h deleted file mode 100644 index 2443cf4438..0000000000 --- a/src/lib/elementary/efl_ui_list_view_private.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef EFL_UI_LIST_VIEW_PRIVATE_H -#define EFL_UI_LIST_VIEW_PRIVATE_H - -#ifdef HAVE_CONFIG_H -# include "elementary_config.h" -#endif - -#include -#include "efl_ui_list_view_relayout.eo.h" -#include "efl_ui_list_view_pan.eo.h" -#include "elm_priv.h" - -typedef struct _Efl_Ui_List_View_Data Efl_Ui_List_View_Data; -int efl_ui_list_view_item_index_get(Efl_Ui_List_View_Layout_Item *item); - -#include "efl_ui_list_view_seg_array.h" - -struct _Efl_Ui_List_View_Data -{ - Eo *obj; - Eo *scrl_mgr; - Efl_Ui_List_View_Pan *pan_obj; - Efl_Model *model; - - Eina_Stringshare *style; - - struct { - Eina_Future *future; - - int start; - int count; - } slice; - - Efl_Ui_Layout_Factory *factory; - Eina_List *selected_items; - - Efl_Ui_Focus_Manager *manager; - Efl_Ui_List_View_Relayout *relayout; - Efl_Ui_List_View_Seg_Array *seg_array; - int seg_array_first; - - Elm_Object_Select_Mode select_mode; - Eina_Size2D min; - - Eina_Bool homogeneous : 1; - Eina_Bool scrl_freeze : 1; -}; - -typedef struct _Efl_Ui_List_View_Pan_Data Efl_Ui_List_View_Pan_Data; - -struct _Efl_Ui_List_View_Pan_Data -{ - Eo *wobj; - Eina_Rect gmt; -}; - -#define EFL_UI_LIST_VIEW_DATA_GET(o, ptr) \ - Efl_Ui_List_View_Data * ptr = efl_data_scope_get(o, EFL_UI_LIST_VIEW_CLASS) - -#define EFL_UI_LIST_VIEW_DATA_GET_OR_RETURN(o, ptr) \ - EFL_UI_LIST_VIEW_DATA_GET(o, ptr); \ - if (EINA_UNLIKELY(!ptr)) \ - { \ - ERR("No widget data for object %p (%s)", \ - o, evas_object_type_get(o)); \ - return; \ - } - -#define EFL_UI_LIST_VIEW_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ - EFL_UI_LIST_VIEW_DATA_GET(o, ptr); \ - if (EINA_UNLIKELY(!ptr)) \ - { \ - ERR("No widget data for object %p (%s)", \ - o, evas_object_type_get(o)); \ - return val; \ - } - -#endif diff --git a/src/lib/elementary/efl_ui_list_view_relayout.eo b/src/lib/elementary/efl_ui_list_view_relayout.eo deleted file mode 100644 index 07b5dc65bb..0000000000 --- a/src/lib/elementary/efl_ui_list_view_relayout.eo +++ /dev/null @@ -1,30 +0,0 @@ -interface @beta Efl.Ui.List_View_Relayout -{ - methods { - layout_do { - params { - modeler: Efl.Ui.List_View_Model; - first: int; - children: ptr(Efl_Ui_List_View_Seg_Array); - } - } - content_created { - params { - item: ptr(Efl.Ui.List_View_Layout_Item); - } - } - @property model { - [[Model that is/will be ]] - set {} - values { - model: Efl.Model; [[Efl model]] - } - } - @property elements { - get {} - values { - elements: list; [[The order to use]] - } - } - } -} diff --git a/src/lib/elementary/efl_ui_list_view_seg_array.c b/src/lib/elementary/efl_ui_list_view_seg_array.c deleted file mode 100644 index 50f33b340b..0000000000 --- a/src/lib/elementary/efl_ui_list_view_seg_array.c +++ /dev/null @@ -1,477 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include "elementary_config.h" -#endif - -#include "elm_priv.h" -#include - -#include "efl_ui_list_view_private.h" -#include "efl_ui_list_view_seg_array.h" - -static int -_search_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int length EINA_UNUSED, void* data EINA_UNUSED) -{ - Efl_Ui_List_View_Seg_Array_Node const* node = (void const*)rbtree; - int index = *(int*)key; - if(index < node->first) - { - return 1; - } - else if(index < node->first + node->length) - { - return 0; - } - else - { - return -1; - } -} - -static int -_insert_lookup_cb(Eina_Rbtree const* rbtree, const void* key, int length EINA_UNUSED, void* data EINA_UNUSED) -{ - Efl_Ui_List_View_Seg_Array_Node const* node = (void const*)rbtree; - int index = *(int*)key; - if(index < node->first) - { - return 1; - } - else if(index < node->first + node->max) - { - return 0; - } - else - { - return -1; - } -} - -static Eina_Rbtree_Direction -_rbtree_compare(Efl_Ui_List_View_Seg_Array_Node const* left, - Efl_Ui_List_View_Seg_Array_Node const* right, void* data EINA_UNUSED) -{ - if(left->first < right->first) - return EINA_RBTREE_LEFT; - else - return EINA_RBTREE_RIGHT; -} - -static void -_free_node(Efl_Ui_List_View_Seg_Array_Node* node, void* data EINA_UNUSED) -{ - int i = 0; - - while (i < node->length) - { - Efl_Ui_List_View_Layout_Item* item = node->pointers[i]; - efl_unref(item->children); - free(item); - ++i; - } - - free(node); -} - -static Efl_Ui_List_View_Seg_Array_Node* -_alloc_node(Efl_Ui_List_View_Seg_Array* pd, int first) -{ - Efl_Ui_List_View_Seg_Array_Node* node; - node = calloc(1, sizeof(Efl_Ui_List_View_Seg_Array_Node) + pd->step_size*sizeof(Efl_Ui_List_View_Layout_Item*)); - if (!node) return NULL; - node->first = first; - node->max = pd->step_size; - pd->root = (void*)eina_rbtree_inline_insert(EINA_RBTREE_GET(pd->root), EINA_RBTREE_GET(node), - EINA_RBTREE_CMP_NODE_CB(&_rbtree_compare), NULL); - pd->node_count++; - return node; -} - -static Efl_Ui_List_View_Layout_Item* -_create_item_partial(Efl_Model* model) -{ - Efl_Ui_List_View_Layout_Item* item = calloc(1, sizeof(Efl_Ui_List_View_Layout_Item)); - if (!item) return NULL; - item->children = efl_ref(model); - return item; -} - -static Efl_Ui_List_View_Layout_Item* -_create_item(Efl_Model* model, Efl_Ui_List_View_Seg_Array_Node* node, unsigned int index) -{ - Efl_Ui_List_View_Layout_Item* item = _create_item_partial(model); - item->index_offset = index - node->first; - item->tree_node = node; - return item; -} - -static void -_efl_ui_list_view_seg_array_insert_at_node(Efl_Ui_List_View_Seg_Array* pd, int index, - Efl_Ui_List_View_Layout_Item* item, Efl_Ui_List_View_Seg_Array_Node* node) -{ - Eina_Iterator* iterator; - int pos; - - if(node && node->length != node->max && (index - node->first) <= node->length) - { - pos = index - node->first; - item->tree_node = node; - item->index_offset = pos; - if(pos < node->length) - { - assert(node->length != node->max); - - memmove(&node->pointers[pos], &node->pointers[pos+1], sizeof(node->pointers[pos])*(node->length - pos)); - node->pointers[pos] = item; - node->length++; - } - else - { - assert(pos == node->length); - - assert(node->length != node->max); - node->pointers[pos] = item; - node->length++; - } - } - else - { - node = _alloc_node(pd, index); - node->pointers[0] = item; - node->length++; - item->index_offset = 0; - item->tree_node = node; - } - - node = (void*)EINA_RBTREE_GET(node)->son[EINA_RBTREE_LEFT]; - iterator = eina_rbtree_iterator_infix((void*)node); - while(eina_iterator_next(iterator, (void**)&node)) - { - node->first++; - } - - eina_iterator_free(iterator); -} - -static void -_efl_ui_list_view_seg_array_insert_object(Efl_Ui_List_View_Seg_Array *pd, unsigned int index, Efl_Model *children) -{ - Efl_Ui_List_View_Seg_Array_Node *node; - - node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root), - &index, sizeof(index), &_insert_lookup_cb, NULL); - if (!node) - { - node = _alloc_node(pd, index); - } - - assert(node->length < node->max); - node->pointers[node->length] = _create_item(children, node, index); - node->length++; - pd->count++; -} - -typedef struct _Efl_Ui_List_View_Segarray_Eina_Accessor -{ - Eina_Accessor vtable; - Efl_Ui_List_View_Seg_Array* seg_array; -} Efl_Ui_List_View_Segarray_Eina_Accessor; - -static Eina_Bool -_efl_ui_list_view_seg_array_accessor_get_at(Efl_Ui_List_View_Segarray_Eina_Accessor* acc, - int idx, void** data) -{ - Efl_Ui_List_View_Seg_Array_Node* node; - node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(acc->seg_array->root), - &idx, sizeof(idx), &_search_lookup_cb, NULL); - if (node && (node->first <= idx && node->first + node->length > idx)) - { - int i = idx - node->first; - Efl_Ui_List_View_Layout_Item* item = node->pointers[i]; - *data = item; - return EINA_TRUE; - } - return EINA_FALSE; -} - -static void* -_efl_ui_list_view_seg_array_accessor_get_container(Efl_Ui_List_View_Segarray_Eina_Accessor* acc EINA_UNUSED) -{ - return NULL; -} - -static void -_efl_ui_list_view_seg_array_accessor_free(Efl_Ui_List_View_Segarray_Eina_Accessor* acc EINA_UNUSED) -{ - free(acc); -} - -static Eina_Bool -_efl_ui_list_view_seg_array_accessor_lock(Efl_Ui_List_View_Segarray_Eina_Accessor* acc EINA_UNUSED) -{ - return EINA_FALSE; -} - -static Eina_Bool -_efl_ui_list_view_seg_array_accessor_unlock(Efl_Ui_List_View_Segarray_Eina_Accessor* acc EINA_UNUSED) -{ - return EINA_FALSE; -} - -static Eina_Accessor* -_efl_ui_list_view_seg_array_accessor_clone(Efl_Ui_List_View_Segarray_Eina_Accessor* acc EINA_UNUSED) -{ - return &acc->vtable; -} - -static void -_efl_ui_list_view_seg_array_accessor_setup(Efl_Ui_List_View_Segarray_Eina_Accessor* acc, Efl_Ui_List_View_Seg_Array* seg_array) -{ - EINA_MAGIC_SET(&acc->vtable, EINA_MAGIC_ACCESSOR); - acc->vtable.version = EINA_ACCESSOR_VERSION; - acc->vtable.get_at = FUNC_ACCESSOR_GET_AT(_efl_ui_list_view_seg_array_accessor_get_at); - acc->vtable.get_container = FUNC_ACCESSOR_GET_CONTAINER(_efl_ui_list_view_seg_array_accessor_get_container); - acc->vtable.free = FUNC_ACCESSOR_FREE(_efl_ui_list_view_seg_array_accessor_free); - acc->vtable.lock = FUNC_ACCESSOR_LOCK(_efl_ui_list_view_seg_array_accessor_lock); - acc->vtable.unlock = FUNC_ACCESSOR_LOCK(_efl_ui_list_view_seg_array_accessor_unlock); - acc->vtable.clone = FUNC_ACCESSOR_CLONE(_efl_ui_list_view_seg_array_accessor_clone); - acc->seg_array = seg_array; -} - -typedef struct _Efl_Ui_List_View_Segarray_Node_Accessor -{ - Eina_Accessor vtable; - Efl_Ui_List_View_Seg_Array* seg_array; - Eina_Iterator* pre_iterator; - Efl_Ui_List_View_Seg_Array_Node* current_node; - int current_index; -} Efl_Ui_List_View_Segarray_Node_Accessor; - -static Eina_Bool -_efl_ui_list_view_seg_array_node_accessor_get_at(Efl_Ui_List_View_Segarray_Node_Accessor* acc, - int idx, void** data) -{ - if(idx == acc->current_index && acc->current_node) - { - (*data) = acc->current_node; - } - else - { - if(acc->current_index >= idx || !acc->current_node) - { - eina_iterator_free(acc->pre_iterator); - acc->pre_iterator = NULL; - acc->current_node = NULL; - acc->current_index = -1; - } - - if(!acc->pre_iterator) - acc->pre_iterator = eina_rbtree_iterator_infix((void*)acc->seg_array->root); - - for(;acc->current_index != idx;++acc->current_index) - { - if(!eina_iterator_next(acc->pre_iterator, (void**)&acc->current_node)) - { - --acc->current_index; - return EINA_FALSE; - } - } - (*data) = acc->current_node; - return EINA_TRUE; - } - return EINA_FALSE; -} - -static void* -_efl_ui_list_view_seg_array_node_accessor_get_container(Efl_Ui_List_View_Segarray_Node_Accessor* acc EINA_UNUSED) -{ - return NULL; -} - -static void -_efl_ui_list_view_seg_array_node_accessor_free(Efl_Ui_List_View_Segarray_Node_Accessor* acc EINA_UNUSED) -{ - if (acc->pre_iterator) - eina_iterator_free(acc->pre_iterator); - free(acc); -} - -static Eina_Bool -_efl_ui_list_view_seg_array_node_accessor_lock(Efl_Ui_List_View_Segarray_Node_Accessor* acc EINA_UNUSED) -{ - return EINA_FALSE; -} - -static Eina_Bool -_efl_ui_list_view_seg_array_node_accessor_unlock(Efl_Ui_List_View_Segarray_Node_Accessor* acc EINA_UNUSED) -{ - return EINA_FALSE; -} - -static Eina_Accessor* -_efl_ui_list_view_seg_array_node_accessor_clone(Efl_Ui_List_View_Segarray_Node_Accessor* acc EINA_UNUSED) -{ - return &acc->vtable; -} - -static void -_efl_ui_list_view_seg_array_node_accessor_setup(Efl_Ui_List_View_Segarray_Node_Accessor* acc, Efl_Ui_List_View_Seg_Array* seg_array) -{ - EINA_MAGIC_SET(&acc->vtable, EINA_MAGIC_ACCESSOR); - acc->vtable.version = EINA_ACCESSOR_VERSION; - acc->vtable.get_at = FUNC_ACCESSOR_GET_AT(_efl_ui_list_view_seg_array_node_accessor_get_at); - acc->vtable.get_container = FUNC_ACCESSOR_GET_CONTAINER(_efl_ui_list_view_seg_array_node_accessor_get_container); - acc->vtable.free = FUNC_ACCESSOR_FREE(_efl_ui_list_view_seg_array_node_accessor_free); - acc->vtable.lock = FUNC_ACCESSOR_LOCK(_efl_ui_list_view_seg_array_node_accessor_lock); - acc->vtable.unlock = FUNC_ACCESSOR_LOCK(_efl_ui_list_view_seg_array_node_accessor_unlock); - acc->vtable.clone = FUNC_ACCESSOR_CLONE(_efl_ui_list_view_seg_array_node_accessor_clone); - acc->seg_array = seg_array; - acc->pre_iterator = NULL; - acc->current_index = -1; - acc->current_node = NULL; -} - -/* External Functions */ - -Efl_Ui_List_View_Seg_Array * -efl_ui_list_view_seg_array_setup(int size) -{ - Efl_Ui_List_View_Seg_Array *pd = calloc(1, sizeof(Efl_Ui_List_View_Seg_Array)); - if (!pd) return NULL; - pd->step_size = size; - - return pd; -} - -void -efl_ui_list_view_seg_array_free(Efl_Ui_List_View_Seg_Array *pd) -{ - if (pd->root) - eina_rbtree_delete(EINA_RBTREE_GET(pd->root), EINA_RBTREE_FREE_CB(_free_node), NULL); - - pd->root = NULL; - free(pd); -} - -void -efl_ui_list_view_seg_array_flush(Efl_Ui_List_View_Seg_Array *pd) -{ - if (pd->root) - eina_rbtree_delete(EINA_RBTREE_GET(pd->root), EINA_RBTREE_FREE_CB(_free_node), NULL); - - pd->root = NULL; - pd->node_count = 0; - pd->count = 0; -} - -int -efl_ui_list_view_seg_array_count(Efl_Ui_List_View_Seg_Array* pd) -{ - return pd->count; -} - -void -efl_ui_list_view_seg_array_insert(Efl_Ui_List_View_Seg_Array* pd, int index, Efl_Model* model) -{ - Efl_Ui_List_View_Seg_Array_Node* node, *next; - Efl_Ui_List_View_Layout_Item* item; - - item = _create_item_partial(model); - - node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root), - &index, sizeof(index), &_insert_lookup_cb, NULL); - if(node) - { - next = (void*)EINA_RBTREE_GET(node)->son[EINA_RBTREE_LEFT]; - if(next && next->first <= index) - _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, next); - else - _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, node); - } - else - _efl_ui_list_view_seg_array_insert_at_node(pd, index, item, NULL); -} - -void -efl_ui_list_view_seg_array_insert_value(Efl_Ui_List_View_Seg_Array *pd, int first, Eina_Value v) -{ - Efl_Model *children; - unsigned int i, len; - - if (eina_value_type_get(&v) == EINA_VALUE_TYPE_OBJECT) - { - children = eina_value_object_get(&v); - _efl_ui_list_view_seg_array_insert_object(pd, first, children); - } - else if (eina_value_type_get(&v) == EINA_VALUE_TYPE_ARRAY) - { - EINA_VALUE_ARRAY_FOREACH(&v, len, i, children) - { - unsigned int idx = first + i; - - _efl_ui_list_view_seg_array_insert_object(pd, idx, children); - } - } - else - { - printf("Unknow type !\n"); - } -} - - -Efl_Ui_List_View_Layout_Item* -efl_ui_list_view_seg_array_remove(Efl_Ui_List_View_Seg_Array *pd, int index) -{ - Efl_Ui_List_View_Seg_Array_Node *node; - Efl_Ui_List_View_Layout_Item *item, *rt; - Eina_Iterator* iterator; - int offset; - - node = (void*)eina_rbtree_inline_lookup(EINA_RBTREE_GET(pd->root), - &index, sizeof(index), &_insert_lookup_cb, NULL); - if (!node) return NULL; - - offset = index - node->first; - if (offset >= node->length) return NULL; - - rt = node->pointers[offset]; - pd->count--; - node->length--; - - while (offset < node->length) - { - node->pointers[offset] = node->pointers[offset+1]; - item = node->pointers[offset]; - --item->index_offset; - ++offset; - } - - node = (void*)EINA_RBTREE_GET(node)->son[EINA_RBTREE_LEFT]; - iterator = eina_rbtree_iterator_infix((void*)node); - while(eina_iterator_next(iterator, (void**)&node)) - node->first--; - - return rt; -} - -Eina_Accessor* -efl_ui_list_view_seg_array_accessor_get(Efl_Ui_List_View_Seg_Array* pd) -{ - Efl_Ui_List_View_Segarray_Eina_Accessor* acc = calloc(1, sizeof(Efl_Ui_List_View_Segarray_Eina_Accessor)); - _efl_ui_list_view_seg_array_accessor_setup(acc, pd); - return &acc->vtable; -} - -Eina_Accessor* -efl_ui_list_view_seg_array_node_accessor_get(Efl_Ui_List_View_Seg_Array* pd) -{ - Efl_Ui_List_View_Segarray_Node_Accessor* acc = calloc(1, sizeof(Efl_Ui_List_View_Segarray_Node_Accessor)); - _efl_ui_list_view_seg_array_node_accessor_setup(acc, pd); - return &acc->vtable; -} - -int -efl_ui_list_view_item_index_get(Efl_Ui_List_View_Layout_Item* item) -{ - Efl_Ui_List_View_Seg_Array_Node* node = item->tree_node; - return item->index_offset + node->first; -} diff --git a/src/lib/elementary/efl_ui_list_view_seg_array.h b/src/lib/elementary/efl_ui_list_view_seg_array.h deleted file mode 100644 index adbfc28441..0000000000 --- a/src/lib/elementary/efl_ui_list_view_seg_array.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef EFL_UI_LIST_VIEW_SEG_ARRAY_H -#define EFL_UI_LIST_VIEW_SEG_ARRAY_H - -typedef struct _Efl_Ui_List_View_SegArray_Node -{ - EINA_RBTREE; - - int length; - int max; - int first; - - void* layout_data; - - Efl_Ui_List_View_Layout_Item* pointers[0]; -} Efl_Ui_List_View_Seg_Array_Node; - -typedef struct _Efl_Ui_List_View_Seg_Array -{ - Efl_Ui_List_View_Seg_Array_Node *root; - - int step_size; - int node_count; - int count; -} Efl_Ui_List_View_Seg_Array; - - -Efl_Ui_List_View_Seg_Array * efl_ui_list_view_seg_array_setup(int size); -void efl_ui_list_view_seg_array_free(Efl_Ui_List_View_Seg_Array *seg_array); -void efl_ui_list_view_seg_array_flush(Efl_Ui_List_View_Seg_Array *seg_array); -int efl_ui_list_view_seg_array_count(Efl_Ui_List_View_Seg_Array* seg_array); -int efl_ui_list_view_item_index_get(Efl_Ui_List_View_Layout_Item* item); - - -void efl_ui_list_view_seg_array_insert(Efl_Ui_List_View_Seg_Array* seg_array, int index, Efl_Model* model); -void efl_ui_list_view_seg_array_insert_value(Efl_Ui_List_View_Seg_Array *seg_array, int first, Eina_Value value); -Efl_Ui_List_View_Layout_Item* efl_ui_list_view_seg_array_remove(Efl_Ui_List_View_Seg_Array *seg_array, int index); - -Eina_Accessor* efl_ui_list_view_seg_array_accessor_get(Efl_Ui_List_View_Seg_Array* seg_array); -Eina_Accessor* efl_ui_list_view_seg_array_node_accessor_get(Efl_Ui_List_View_Seg_Array* seg_array); - - -#endif diff --git a/src/lib/elementary/efl_ui_list_view_types.eot b/src/lib/elementary/efl_ui_list_view_types.eot deleted file mode 100644 index 49aca5d33d..0000000000 --- a/src/lib/elementary/efl_ui_list_view_types.eot +++ /dev/null @@ -1,12 +0,0 @@ -struct @beta @free(free) Efl.Ui.List_View_Layout_Item { - layout: Efl.Ui.Layout; - layout_request: future; - children: Efl.Model; - index_offset: int; - tree_node: void_ptr; - min: Eina.Size2D; - size: Eina.Size2D; - pos: Eina.Position2D; -} - -struct @beta Efl_Ui_List_View_Seg_Array; [[TBD]] diff --git a/src/lib/elementary/meson.build b/src/lib/elementary/meson.build index 2e48c5a39a..9580b3e229 100644 --- a/src/lib/elementary/meson.build +++ b/src/lib/elementary/meson.build @@ -111,8 +111,6 @@ pub_eo_files = [ 'efl_ui_layout_part_bg.eo', 'efl_ui_layout_part_legacy.eo', 'efl_ui_list_view.eo', - 'efl_ui_list_view_model.eo', - 'efl_ui_list_view_pan.eo', 'efl_ui_item.eo', 'efl_ui_default_item.eo', 'efl_ui_group_item.eo', @@ -208,7 +206,6 @@ endforeach pub_eo_types_files = [ 'elm_general.eot', 'efl_ui.eot', - 'efl_ui_list_view_types.eot', 'efl_ui_selection_types.eot', 'efl_ui_dnd_types.eot' ] @@ -236,8 +233,6 @@ priv_eo_files = [ 'efl_ui_state_model.eo', 'efl_ui_selection_manager.eo', 'efl_datetime_manager.eo', - 'efl_ui_list_view_precise_layouter.eo', - 'efl_ui_list_view_relayout.eo', 'efl_ui_size_model.eo', 'efl_ui_homogeneous_model.eo', 'efl_ui_exact_model.eo', @@ -357,8 +352,6 @@ elementary_headers_unstable = [ 'elm_widget_toolbar.h', 'efl_ui_video_private.h', 'efl_ui_item_private.h', - 'efl_ui_list_view_private.h', - 'efl_ui_list_view_seg_array.h', 'elm_widget_web.h', 'efl_ui_clock.h', 'elm_code.h', @@ -906,8 +899,6 @@ elementary_src = [ 'efl_ui_grid_default_item.c', 'efl_ui_grid.c', 'efl_ui_list_view.c', - 'efl_ui_list_view_precise_layouter.c', - 'efl_ui_list_view_seg_array.c', 'efl_ui_layout_factory.c', 'efl_ui_scroller.c', 'efl_ui_scroll_manager.c',