diff options
author | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2019-06-29 16:19:08 +0200 |
---|---|---|
committer | Cedric BAIL <cedric.bail@free.fr> | 2019-07-24 10:38:22 -0700 |
commit | 577b82dad69c7f07856cbb254fcc60aab6f90999 (patch) | |
tree | 6292ee6c022553d826026362f33fc692f8f67e2c /src/benchmarks | |
parent | 0cd5427c3f556135fffff79193fb03de6036eab4 (diff) | |
download | efl-577b82dad69c7f07856cbb254fcc60aab6f90999.tar.gz |
Introduce Efl.Ui.Item_Container
this is a new widget which aims to replace Efl.Ui.Grid / Efl.Ui.List.
The widget is split up in a widget and a interface for item placement.
Efl_Ui_Item_Position_Manager: The interface contains API which is used
by the Item_Container to place the items, there is also a set of common
tests which tests for the casual tripping wires, and ensures that the
events are emitted in the correct moments (the later part still can be
improved)
Efl_Ui_Item_Container: The widget itself, it contains the API for the
enduser to add Items to the widget, it handles the different modes for
selection type and emits the events for selection changes. The pack API
is conform with the spec unit test. An additional set of tests is
defined which should be able to be run on every widget with a specific
position_manager beeing set.
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D9285
Diffstat (limited to 'src/benchmarks')
-rw-r--r-- | src/benchmarks/elementary/item_container.c | 100 | ||||
-rw-r--r-- | src/benchmarks/elementary/meson.build | 7 |
2 files changed, 107 insertions, 0 deletions
diff --git a/src/benchmarks/elementary/item_container.c b/src/benchmarks/elementary/item_container.c new file mode 100644 index 0000000000..b93004c8df --- /dev/null +++ b/src/benchmarks/elementary/item_container.c @@ -0,0 +1,100 @@ +#include <Efl_Ui.h> + +static Eo *first, *last, *middle; +static int timer = 15; +static int frames = 0; +static double start_time; + +static void +_timer_tick(void *data, const Efl_Event *ev) +{ + if (timer % 2 == 0) + { + efl_ui_item_container_item_scroll(data, last, EINA_TRUE); + } + else + { + efl_ui_item_container_item_scroll(data, first, EINA_TRUE); + } + + timer--; + + if (timer == 0) + { + double runtime = ecore_time_get() - start_time; + efl_loop_quit(efl_app_main_get(), EINA_VALUE_EMPTY); + efl_del(ev->object); + printf("We did %d frames in %f s seconds\n", frames, runtime); + printf("FPS: %f\n", ((double)frames / runtime)); + + } +} + +static void +_caputure(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED) +{ + frames ++; +} + +static void +_started_cb(void *data, const Efl_Event *ev EINA_UNUSED) +{ + efl_add(EFL_LOOP_TIMER_CLASS, efl_main_loop_get(), + efl_loop_timer_interval_set(efl_added, 1.0), + efl_event_callback_add(efl_added, EFL_LOOP_TIMER_EVENT_TIMER_TICK, _timer_tick, data) + ); + start_time = ecore_time_get(); + efl_event_callback_add(evas_object_evas_get(data), EFL_CANVAS_SCENE_EVENT_RENDER_POST, _caputure, data); + efl_del(ev->object); +} + +static void +_first_frame_cb(void *data, const Efl_Event *ev EINA_UNUSED) +{ + efl_ui_item_container_item_scroll(data, middle, EINA_FALSE); + //give time to stabelize + efl_add(EFL_LOOP_TIMER_CLASS, efl_main_loop_get(), + efl_loop_timer_interval_set(efl_added, 15.0), + efl_event_callback_add(efl_added, EFL_LOOP_TIMER_EVENT_TIMER_TICK, _started_cb, data) + ); + efl_event_callback_del(ev->object, EFL_CANVAS_SCENE_EVENT_RENDER_POST, _first_frame_cb, data); +} + +EAPI_MAIN void +efl_main(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED) +{ + Eo *win, *item_container, *list; + + win = efl_add(EFL_UI_WIN_CLASS, efl_main_loop_get(), + efl_ui_win_type_set(efl_added, EFL_UI_WIN_TYPE_BASIC), + efl_text_set(efl_added, "Efl.Ui.Item_Container benchmark"), + efl_ui_win_autodel_set(efl_added, EINA_TRUE) + ); + + list = efl_new(EFL_UI_LIST_POSITION_MANAGER_CLASS); + item_container = efl_add(EFL_UI_ITEM_CONTAINER_CLASS, win, + efl_ui_item_container_position_manager_set(efl_added, list)); + efl_content_set(win, item_container); + + printf("Building 5000 objects\n"); + for (int i = 0; i < 5000; ++i) + { + Eo *il = efl_add(EFL_UI_LIST_DEFAULT_ITEM_CLASS, item_container); + double r = 10+((double)190/(double)10)*(i%10); + + if (i == 0) + first = il; + else if (i == 2500) + middle = il; + else if (i == 4999) + last = il; + efl_gfx_color_set(il, r, 10, 10, 255); + efl_gfx_hint_size_min_set(il, EINA_SIZE2D(40, 40+(i%2)*40)); + efl_pack_end(item_container, il); + } + printf("Done!\n"); + efl_gfx_entity_size_set(win, EINA_SIZE2D(200, 200)); + + efl_event_callback_add(evas_object_evas_get(win), EFL_CANVAS_SCENE_EVENT_RENDER_POST, _first_frame_cb, item_container); +} +EFL_MAIN() diff --git a/src/benchmarks/elementary/meson.build b/src/benchmarks/elementary/meson.build index 206ea06e4b..af71b972fa 100644 --- a/src/benchmarks/elementary/meson.build +++ b/src/benchmarks/elementary/meson.build @@ -6,3 +6,10 @@ focus_widget_tree_bench = executable('focus_widget_tree_bench', benchmark('focus_widget_tree', focus_widget_tree_bench, args: ['5'], ) + +item_container = executable('item_container', + 'item_container.c', + dependencies: [elementary, ecore_input_evas, eio], +) + +benchmark('item_container', item_container) |