summaryrefslogtreecommitdiff
path: root/src/benchmarks
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2019-06-29 16:19:08 +0200
committerCedric BAIL <cedric.bail@free.fr>2019-07-24 10:38:22 -0700
commit577b82dad69c7f07856cbb254fcc60aab6f90999 (patch)
tree6292ee6c022553d826026362f33fc692f8f67e2c /src/benchmarks
parent0cd5427c3f556135fffff79193fb03de6036eab4 (diff)
downloadefl-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.c100
-rw-r--r--src/benchmarks/elementary/meson.build7
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)