From 9c42aac89e87dadc61f2c1fe1f86b54895e631c9 Mon Sep 17 00:00:00 2001 From: raster Date: Fri, 5 Aug 2011 11:15:03 +0000 Subject: [PATCH] factory.... working on it. but up and kicking. it's a little unhappy with the 102 million buttons i have in the scroller right now... when you scroll along, but... i'll work at it to make it work better. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@62130 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/Makefile.am | 1 + src/bin/test.c | 2 + src/bin/test_factory.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/elm_factory.c | 60 ++++++++++++----- 4 files changed, 227 insertions(+), 16 deletions(-) create mode 100644 src/bin/test_factory.c diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 95c0e72..bdbdcff 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -52,6 +52,7 @@ test_ctxpopup.c \ test_cursor.c \ test_diskselector.c \ test_entry.c \ +test_factory.c \ test_fileselector_button.c \ test_fileselector.c \ test_fileselector_entry.c \ diff --git a/src/bin/test.c b/src/bin/test.c index cf8eef1..80dfa08 100644 --- a/src/bin/test.c +++ b/src/bin/test.c @@ -139,6 +139,7 @@ void test_glview_simple(void *data, Evas_Object *obj, void *event_info); void test_glview(void *data, Evas_Object *obj, void *event_info); void test_3d(void *data, Evas_Object *obj, void *event_info); void test_naviframe(void *data, Evas_Object *obj, void *event_info); +void test_factory(void *data, Evas_Object *obj, void *event_info); #ifdef HAVE_EIO void test_eio(void *data, Evas_Object *obj, void *event_info); #endif @@ -416,6 +417,7 @@ my_win_main(char *autorun, Eina_Bool test_win_only) ADD_TEST("3D", test_3d); ADD_TEST("Gesture Layer", test_gesture_layer); ADD_TEST("Naviframe", test_naviframe); + ADD_TEST("Factory", test_factory); #undef ADD_TEST if (autorun) diff --git a/src/bin/test_factory.c b/src/bin/test_factory.c new file mode 100644 index 0000000..589571c --- /dev/null +++ b/src/bin/test_factory.c @@ -0,0 +1,180 @@ +#include +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#ifndef ELM_LIB_QUICKLAUNCH + +static void +fac_unrealize(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + // setting factory content to null deletes it + printf("DELETE for factory %p\n", obj); + elm_factory_content_set(obj, NULL); +} + +static void +fac_realize_end(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *tb, *bt; + int i; + + printf("ADD for factory 4 %p\n", obj); + tb = elm_table_add(win); + + for (i = 0; i < 40; i++) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%i", i); + + bt = elm_button_add(win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, buf); + elm_table_pack(tb, bt, 0, i, 1, 1); + evas_object_show(bt); + } + + elm_factory_content_set(obj, tb); + evas_object_show(tb); +} + +static void +fac_realize3(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *tb, *fc; + int i; + + printf("ADD for factory 3 %p\n", obj); + tb = elm_table_add(win); + + for (i = 0; i < 40; i++) + { + fc = elm_factory_add(win); + // initial height per factory of 1000 + // scrollbar will be wrong until enough + // children have been realized and the + // real size is known + evas_object_size_hint_min_set(fc, 0, 1000); + evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(fc, "realize", fac_realize_end, win); + evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win); + elm_table_pack(tb, fc, 0, i, 1, 1); + evas_object_show(fc); + } + + elm_factory_content_set(obj, tb); + evas_object_show(tb); +} + +static void +fac_realize2(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *tb, *fc; + int i; + + printf("ADD for factory 2 %p\n", obj); + tb = elm_table_add(win); + + for (i = 0; i < 40; i++) + { + fc = elm_factory_add(win); + // initial height per factory of 1000 + // scrollbar will be wrong until enough + // children have been realized and the + // real size is known + evas_object_size_hint_min_set(fc, 0, 1000); + evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(fc, "realize", fac_realize3, win); + evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win); + elm_table_pack(tb, fc, 0, i, 1, 1); + evas_object_show(fc); + } + + elm_factory_content_set(obj, tb); + evas_object_show(tb); +} + +static void +fac_realize1(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *tb, *fc; + int i; + + printf("ADD for factory 1 %p\n", obj); + tb = elm_table_add(win); + + for (i = 0; i < 40; i++) + { + fc = elm_factory_add(win); + // initial height per factory of 1000 + // scrollbar will be wrong until enough + // children have been realized and the + // real size is known + evas_object_size_hint_min_set(fc, 0, 1000); + evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(fc, "realize", fac_realize2, win); + evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win); + elm_table_pack(tb, fc, 0, i, 1, 1); + evas_object_show(fc); + } + + elm_factory_content_set(obj, tb); + evas_object_show(tb); +} + +void +test_factory(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win, *bg, *tb, *sc, *fc; + int i; + + win = elm_win_add(NULL, "factory", ELM_WIN_BASIC); + elm_win_title_set(win, "Factory"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + for (i = 0; i < 40; i++) + { + fc = elm_factory_add(win); + // initial height per factory of 1000 + // scrollbar will be wrong until enough + // children have been realized and the + // real size is known + evas_object_size_hint_min_set(fc, 0, 1000); + evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(fc, "realize", fac_realize1, win); + evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win); + elm_table_pack(tb, fc, 0, i, 1, 1); + evas_object_show(fc); + } + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_scroller_content_set(sc, tb); + evas_object_show(tb); + + evas_object_show(sc); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +#endif diff --git a/src/lib/elm_factory.c b/src/lib/elm_factory.c index 86f81e9..9937240 100644 --- a/src/lib/elm_factory.c +++ b/src/lib/elm_factory.c @@ -7,13 +7,19 @@ struct _Widget_Data { Evas_Object *obj; Evas_Object *content; - Ecore_Job *eval_job; + Eina_Bool eval : 1; }; static const char *widtype = NULL; static void _del_hook(Evas_Object *obj); +static Eina_Bool _focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next); static void _sizing_eval(Evas_Object *obj); -static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _eval(Evas_Object *obj); +static void _changed(Evas_Object *obj); +static void _move(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__); +static void _resize(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__); +static void _child_change(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__); +static void _child_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__); static const char SIG_REALIZE[] = "realize"; static const char SIG_UNREALIZE[] = "unrealize"; @@ -29,7 +35,6 @@ _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - if (wd->eval_job) ecore_job_del(wd->eval_job); free(wd); } @@ -56,24 +61,33 @@ _sizing_eval(Evas_Object *obj) evas_object_size_hint_max_get(wd->content, &maxw, &maxh); evas_object_size_hint_min_set(obj, minw, minh); evas_object_size_hint_max_set(obj, maxw, maxh); + printf("fac: %p, size %ix%i -> %ix%i\n", obj, minw, minh, maxw, maxh); } static void -_eval_do(void *data) +_eval(Evas_Object *obj) { - Evas_Object *obj = data; Evas_Coord x, y, w, h, cvx, cvy, cvw, cvh; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->eval_job = NULL; evas_object_geometry_get(obj, &x, &y, &w, &h); evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh); + if ((w < 1) || (h < 1) || (cvw < 1) || (cvh < 1)) return; if (ELM_RECTS_INTERSECT(x, y, w, h, cvx, cvy, cvw, cvh)) { if (!wd->content) - evas_object_smart_callback_call(obj, SIG_REALIZE, NULL); + { + printf("intersect: %i %i %ix%i | %i %i %ix%i\n", + x, y, w, h, cvx, cvy, cvw, cvh); + evas_object_smart_callback_call(obj, SIG_REALIZE, NULL); + if (wd->content) + { + if (evas_object_smart_data_get(wd->content)) + evas_object_smart_calculate(wd->content); + } + } } else { @@ -83,31 +97,43 @@ _eval_do(void *data) } static void -_eval(Evas_Object *obj) +_changed(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - - if (wd->eval_job) ecore_job_del(wd->eval_job); - wd->eval_job = ecore_job_add(_eval_do, obj); + if (wd->eval) + { + _eval(obj); + _sizing_eval(obj); + wd->eval = EINA_FALSE; + } } static void _move(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) { - _eval(obj); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->eval = EINA_TRUE; + evas_object_smart_changed(obj); } static void _resize(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) { - _eval(obj); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + wd->eval = EINA_TRUE; + evas_object_smart_changed(obj); } static void -_child_change(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +_child_change(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - _eval(obj); + Widget_Data *wd = elm_widget_data_get(data); + if (!wd) return; + wd->eval = EINA_TRUE; + evas_object_smart_changed(data); } static void @@ -142,6 +168,7 @@ elm_factory_add(Evas_Object *parent) elm_widget_del_hook_set(obj, _del_hook); elm_widget_focus_next_hook_set(obj, _focus_next_hook); elm_widget_can_focus_set(obj, EINA_FALSE); + elm_widget_changed_hook_set(obj, _changed); evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move, NULL); evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, NULL); @@ -166,7 +193,8 @@ elm_factory_content_set(Evas_Object *obj, Evas_Object *content) _child_del, obj); evas_object_event_callback_add(wd->content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _child_change, obj); - _sizing_eval(obj); + wd->eval = EINA_TRUE; + evas_object_smart_changed(obj); } EAPI Evas_Object * -- 2.7.4