From b37ad2b589944f6670f10ee658b877e588fcaa69 Mon Sep 17 00:00:00 2001 From: Larry Jr Date: Wed, 20 Apr 2016 17:07:53 -0300 Subject: [PATCH] Efl, Eio, Eldbus, Elementary: new model API use eina_promise Efl - efl_model_base changed to use eina_promise Eio - eio_model use efl_model_base with promise Eldbus - elddbus models use promise now Elementary - elm_view_list and elm_view_form use new models with promise updated all related examples and tests --- unsorted/eldbus/dbusmodel.c | 146 +++++++++++++++++++---------- unsorted/elementary/filemvc.c | 35 ++++--- unsorted/elementary/fileviewlist.c | 2 - 3 files changed, 116 insertions(+), 67 deletions(-) diff --git a/unsorted/eldbus/dbusmodel.c b/unsorted/eldbus/dbusmodel.c index f2c5e878..a7c8ee7d 100644 --- a/unsorted/eldbus/dbusmodel.c +++ b/unsorted/eldbus/dbusmodel.c @@ -1,7 +1,9 @@ //Compile with: // gcc -o busmodel busmodel.c `pkg-config --cflags --libs eldbus ecore eina` +#ifdef HAVE_CONFIG_H # include +#endif #include #include @@ -11,77 +13,113 @@ #define DEFAULT_BUS "org.freedesktop.DBus" #define DEFAULT_PATH "/" -static unsigned int children_count = 0; +static int prop_count = 0; -static Eina_Bool -_event_interface_load_status_cb(void *data EINA_UNUSED, const Eo_Event *event) +struct eina_iterator { - Efl_Model_Load *actual_load = (Efl_Model_Load*)event->info; - Eina_Array *properties_list; - Eina_Array_Iterator iterator; - Eina_Value const* property_value; + Eina_Iterator* success_iterator; + Eina_Iterator* failure_iterator; +}; + +static void +promise_then_prop_c(Eo* obj, struct eina_iterator* it_struct) +{ + Eina_Value * property_value; + const Eina_Array *properties_list; + Eina_Array_Iterator a_it; char *property, *prop_str; const char *name; - unsigned int i; + Eina_Iterator* it = it_struct->success_iterator; - if (EFL_MODEL_LOAD_STATUS_LOADED != actual_load->status) - return EINA_TRUE; + name = eldbus_model_proxy_name_get(obj); + properties_list = efl_model_properties_get(obj); - name = eldbus_model_proxy_name_get(event->obj); - efl_model_properties_get(event->obj, &properties_list); - - printf(" -> %s\n", name); - if (eina_array_count(properties_list)) - printf(" Properties:\n"); - - EINA_ARRAY_ITER_NEXT(properties_list, i, property, iterator) + printf(" -> %s\n Properties:\n", name); + unsigned i = 0; + EINA_ARRAY_ITER_NEXT(properties_list, i, property, a_it) { - efl_model_property_get(event->obj, property, &property_value); - if (property_value) + if (eina_iterator_next(it, (void **)&property_value) && property_value) { prop_str = eina_value_to_string(property_value); + printf(" * %s=%s \n", property, prop_str); + free(prop_str); } - printf(" * %s: %s \n", property, prop_str); - free(prop_str); - prop_str = NULL; } - children_count--; - - if (!children_count) + prop_count--; + if (prop_count == 0) ecore_main_loop_quit(); - - return EINA_FALSE; } -static Eina_Bool -_event_load_status_cb(void *data EINA_UNUSED, const Eo_Event *event) +static void +error_cb(void* data EINA_UNUSED, const Eina_Error *error EINA_UNUSED) { - Efl_Model_Load *actual_load = (Efl_Model_Load*)event->info; - Eina_Accessor *accessor; - Eo *child = NULL; - unsigned int i; + printf(" ERROR\n"); + ecore_main_loop_quit(); +} - if (EFL_MODEL_LOAD_STATUS_LOADED != actual_load->status) - return EINA_TRUE; +static void +promise_then_a(Eo* obj EINA_UNUSED, Eina_Accessor **accessor) +{ + const Eina_Array *properties_list; + Eina_Array_Iterator a_it; + Eina_Promise **promises; + const char *name; + char *property; + Eo* child; + int i = 0; - efl_model_children_count_get(event->obj, &children_count); - if (children_count == 0) + EINA_ACCESSOR_FOREACH(*accessor, i, child) { - printf("Don't find Interfaces\n"); + properties_list = efl_model_properties_get(child); + name = eldbus_model_proxy_name_get(child); + + unsigned p_count = eina_array_count(properties_list); + + if (p_count) + { + promises = (Eina_Promise **)calloc(p_count + 1, sizeof(Eina_Promise *)); + promises[p_count] = NULL; + + unsigned j = 0; + EINA_ARRAY_ITER_NEXT(properties_list, j, property, a_it) + { + efl_model_property_get(child, property, &promises[j]); + } + eina_promise_then(eina_promise_all(eina_carray_iterator_new((void **)promises)), + (Eina_Promise_Cb)&promise_then_prop_c, &error_cb, child); + prop_count++; + } + else + { + printf(" -> %s\n", name); + } + } + + if (prop_count == 0) + ecore_main_loop_quit(); +} +static void +promise_then(Eo* obj EINA_UNUSED, struct eina_iterator* it_struct) +{ + Eina_Accessor **accessor; + unsigned int* count; + + Eina_Iterator* iterator = it_struct->success_iterator; + + if (!eina_iterator_next(iterator, (void **)&accessor)) + { + printf("bye\n"); ecore_main_loop_quit(); - return EINA_FALSE; + return; } - efl_model_children_slice_get(event->obj, 0, 0, &accessor); - printf("\nInterfaces:\n"); - EINA_ACCESSOR_FOREACH(accessor, i, child) - { - eo_event_callback_add(child, EFL_MODEL_BASE_EVENT_LOAD_STATUS, _event_interface_load_status_cb, NULL); - efl_model_load(child); - } + eina_iterator_next(iterator, (void **)&count); - return EINA_FALSE; + printf("efl_model_loaded count %d\n", (int)*count); fflush(stdout); + printf("efl_model_loaded accessor %p\n", accessor); fflush(stdout); + + promise_then_a(NULL, accessor); } int @@ -90,6 +128,7 @@ main(int argc, char **argv EINA_UNUSED) const char *bus, *path; Eo *root; + ecore_init(); eldbus_init(); bus = DEFAULT_BUS; @@ -100,12 +139,15 @@ main(int argc, char **argv EINA_UNUSED) root = eo_add_ref(ELDBUS_MODEL_OBJECT_CLASS, NULL, eldbus_model_object_constructor(eo_self, ELDBUS_CONNECTION_TYPE_SESSION, NULL, EINA_FALSE, bus, path)); - eo_event_callback_add(root, EFL_MODEL_BASE_EVENT_LOAD_STATUS, _event_load_status_cb, NULL); - efl_model_load(root); + Eina_Promise *promises[] = { NULL, NULL, NULL}; + efl_model_children_slice_get(root, 0, 0, &promises[0]); + efl_model_children_count_get(root, &promises[1]); + + eina_promise_then(eina_promise_all(eina_carray_iterator_new((void **)promises)), + (Eina_Promise_Cb)&promise_then, &error_cb, root); ecore_main_loop_begin(); - eo_event_callback_del(root, EFL_MODEL_BASE_EVENT_LOAD_STATUS, _event_load_status_cb, NULL); - eo_unref(root); + eldbus_shutdown(); } diff --git a/unsorted/elementary/filemvc.c b/unsorted/elementary/filemvc.c index 3b4fe5a1..f33b2002 100644 --- a/unsorted/elementary/filemvc.c +++ b/unsorted/elementary/filemvc.c @@ -51,29 +51,41 @@ _list_selected_cb(void *data EINA_UNUSED, const Eo_Event *event) { Efl_Model_Test_Filemvc_Data *priv = data; Eo *child = event->info; - ethumb_client_file_free(elm_thumb_ethumb_client_get()); +// ethumb_client_file_free(elm_thumb_ethumb_client_get()); printf("LIST selected model\n"); elm_view_form_model_set(priv->formview, child); return EINA_TRUE; } +static void +_promise_then(void *data, void *value) +{ + Efl_Model_Test_Filemvc_Data *priv = data; + char *path; + Eo *model; + + eina_value_get((Eina_Value *)value, &path); + model = eo_add(EIO_MODEL_CLASS, NULL, eio_model_path_set(eo_self, path)); + elm_view_list_model_set(priv->fileview, model); +} + +static void +_promise_error(void *data, const Eina_Error *err) +{ +} + static Eina_Bool _tree_selected_cb(void *data, const Eo_Event *event) { Efl_Model_Test_Filemvc_Data *priv = data; Eo *child = event->info; - const Eina_Value *vpath; - Eo *model; - char *path; + Eina_Promise *promise; printf("TREE selected model\n"); - efl_model_property_get(child, "path", &vpath); - eina_value_get(vpath, &path); - model = eo_add(EIO_MODEL_CLASS, NULL, eio_model_path_set(eo_self, path)); - efl_model_load(model); - elm_view_list_model_set(priv->fileview, model); + efl_model_property_get(child, "path", &promise); + eina_promise_then(promise, &_promise_then, &_promise_error, priv); return EINA_TRUE; } @@ -130,16 +142,12 @@ elm_main(int argc, char **argv) evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, panes); - ecore_init(); - eio_init(); - if(argv[1] != NULL) dirname = argv[1]; else dirname = EFL_MODEL_TEST_FILENAME_PATH; //treemodel priv.treemodel = eo_add(EIO_MODEL_CLASS, NULL, eio_model_path_set(eo_self, dirname)); eio_model_children_filter_set(priv.treemodel, _filter_cb, NULL); - efl_model_load(priv.treemodel); //treeview genlist = elm_genlist_add(win); @@ -155,6 +163,7 @@ elm_main(int argc, char **argv) _widget_init(vpanes); elm_object_part_content_set(panes, "right", vpanes); eo_event_callback_add(priv.treeview, ELM_VIEW_LIST_EVENT_MODEL_SELECTED, _tree_selected_cb, &priv); + //listview genlist = elm_genlist_add(win); priv.fileview = eo_add(ELM_VIEW_LIST_CLASS, NULL, elm_view_list_genlist_set(eo_self, genlist, ELM_GENLIST_ITEM_NONE, "double_label")); diff --git a/unsorted/elementary/fileviewlist.c b/unsorted/elementary/fileviewlist.c index 2d765acb..a3a434ef 100644 --- a/unsorted/elementary/fileviewlist.c +++ b/unsorted/elementary/fileviewlist.c @@ -42,7 +42,6 @@ elm_main(int argc, char **argv) memset(&priv, 0, sizeof(Efl_Model_Test_Fileview_Data)); ecore_init(); - eio_init(); if(argv[1] != NULL) dirname = argv[1]; else dirname = EFL_MODEL_TEST_FILENAME_PATH; @@ -58,7 +57,6 @@ elm_main(int argc, char **argv) priv.filemodel = eo_add(EIO_MODEL_CLASS, NULL, eio_model_path_set(eo_self, dirname)); priv.fileview = eo_add(ELM_VIEW_LIST_CLASS, NULL, elm_view_list_genlist_set(eo_self, genlist, ELM_GENLIST_ITEM_TREE, "double_label")); elm_view_list_model_set(priv.fileview, priv.filemodel); - efl_model_load(priv.filemodel); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, &priv); elm_view_list_property_connect(priv.fileview, "filename", "elm.text");