From 09e6eba78f9669387a60e7f5245faf2c4438bd0d Mon Sep 17 00:00:00 2001 From: Larry Lira Date: Thu, 7 Jun 2018 18:44:37 -0300 Subject: [PATCH] elm: fix efl_model property_get and children_slice_get in views --- src/lib/elementary/efl_ui_image.c | 12 ++++++-- src/lib/elementary/efl_ui_layout_object.c | 10 ++++-- src/lib/elementary/efl_ui_view_list.c | 24 +++++++-------- .../elementary/efl_ui_view_list_precise_layouter.c | 36 +++++++++++++--------- 4 files changed, 49 insertions(+), 33 deletions(-) diff --git a/src/lib/elementary/efl_ui_image.c b/src/lib/elementary/efl_ui_image.c index 035de7e..1a4987b 100644 --- a/src/lib/elementary/efl_ui_image.c +++ b/src/lib/elementary/efl_ui_image.c @@ -1794,8 +1794,12 @@ _update_viewmodel(Eo *obj, Efl_Ui_Image_Data *pd) if (!pd->property.model) return ; vfile = efl_model_property_get(pd->property.model, pd->property.file); + if (!vfile) return; vkey = efl_model_property_get(pd->property.model, pd->property.key); + if (eina_value_type_get(vfile) == EINA_VALUE_TYPE_ERROR) + goto err; + if (pd->property.icon) { file = eina_value_to_string(vfile); @@ -1804,7 +1808,8 @@ _update_viewmodel(Eo *obj, Efl_Ui_Image_Data *pd) } else { - key = eina_value_to_string(vkey); + if (vkey && eina_value_type_get(vkey) != EINA_VALUE_TYPE_ERROR) + key = eina_value_to_string(vkey); if (eina_value_type_get(vfile) == EINA_VALUE_TYPE_FILE) { eina_value_get(vfile, &f); @@ -1819,10 +1824,11 @@ _update_viewmodel(Eo *obj, Efl_Ui_Image_Data *pd) } } - eina_value_free(vfile); - eina_value_free(vkey); free(file); free(key); +err: + eina_value_free(vfile); + eina_value_free(vkey); } static void diff --git a/src/lib/elementary/efl_ui_layout_object.c b/src/lib/elementary/efl_ui_layout_object.c index 4c68241..51e22ce 100644 --- a/src/lib/elementary/efl_ui_layout_object.c +++ b/src/lib/elementary/efl_ui_layout_object.c @@ -2127,10 +2127,13 @@ static void _efl_ui_layout_view_model_property_update(Efl_Ui_Layout_Object_Data *pd, const char *part, const char *fetch) { Eina_Value *v = NULL; - char *value; + char *value = NULL; v = efl_model_property_get(pd->connect.model, fetch); - value = eina_value_to_string(v); + if (!v) return; + + if (eina_value_type_get(v) != EINA_VALUE_TYPE_ERROR) + value = eina_value_to_string(v); pd->connect.updating = EINA_TRUE; // Prevent recursive call to property_set while updating text efl_text_set(efl_part(pd->obj, part), value); @@ -2148,6 +2151,7 @@ _efl_ui_layout_view_model_signal_update(Efl_Ui_Layout_Object_Data *pd, const cha char *value; v = efl_model_property_get(pd->connect.model, fetch); + if (!v) return; // FIXME: previous implementation would just do that for signal/part == "selected" if (eina_value_type_get(v) == EINA_VALUE_TYPE_UCHAR) @@ -2158,7 +2162,7 @@ _efl_ui_layout_view_model_signal_update(Efl_Ui_Layout_Object_Data *pd, const cha if (bl) value = strdup("selected"); else value = strdup("unselected"); } - else + else if (eina_value_type_get(v) != EINA_VALUE_TYPE_ERROR) { value = eina_value_to_string(v); } diff --git a/src/lib/elementary/efl_ui_view_list.c b/src/lib/elementary/efl_ui_view_list.c index abcb0d5..8af043a 100644 --- a/src/lib/elementary/efl_ui_view_list.c +++ b/src/lib/elementary/efl_ui_view_list.c @@ -674,7 +674,7 @@ _efl_ui_view_list_efl_object_finalize(Eo *obj, Efl_Ui_View_List_Data *pd) { if (!pd->factory) - pd->factory = efl_add_ref(EFL_UI_LAYOUT_FACTORY_CLASS, NULL); + pd->factory = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, obj); if(!pd->relayout) { @@ -744,7 +744,6 @@ _efl_ui_view_list_efl_ui_view_model_set(Eo *obj EINA_UNUSED, Efl_Ui_View_List_Da if (pd->model == model) return; - if (pd->model) { if (pd->relayout) @@ -754,11 +753,8 @@ _efl_ui_view_list_efl_ui_view_model_set(Eo *obj EINA_UNUSED, Efl_Ui_View_List_Da efl_replace(&pd->model, model); - if (model) - { - if (pd->relayout) - efl_ui_view_list_relayout_model_set(pd->relayout, model); - } + if (pd->model && pd->relayout) + efl_ui_view_list_relayout_model_set(pd->relayout, pd->model); evas_object_smart_changed(pd->obj); } @@ -868,6 +864,8 @@ static void _efl_ui_view_list_relayout_set(Eo *obj EINA_UNUSED, Efl_Ui_View_List_Data *pd EINA_UNUSED, Efl_Ui_View_List_Relayout *object) { efl_replace(&pd->relayout, object); + if (pd->model && pd->relayout) + efl_ui_view_list_relayout_model_set(pd->relayout, pd->model); } static Efl_Ui_View_List_Relayout * @@ -899,6 +897,7 @@ _children_slice_then(void * data, const Eina_Value v, const Eina_Future *dead_fu pd->slice.start = pd->slice.count = 0; pd->slice.future = NULL; + efl_ui_view_list_relayout_layout_do(pd->relayout, pd->obj, pd->segarray_first, pd->segarray); on_error: return v; } @@ -1001,16 +1000,17 @@ _efl_ui_view_list_efl_ui_view_list_model_unrealize(Eo *obj, Efl_Ui_View_List_Dat EOLIAN static void _efl_ui_view_list_efl_ui_view_list_model_load_range_set(Eo* obj, Efl_Ui_View_List_Data* pd, int first, int count) { - Eina_Future *f; - if (pd->slice.future) return ; pd->slice.start = first; pd->slice.count = count; - f = efl_model_children_slice_get(pd->model, first, count); - f = eina_future_then(f, _children_slice_then, pd); - pd->slice.future = efl_future_Eina_FutureXXX_then(obj, f); + 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); + pd->slice.future = efl_future_Eina_FutureXXX_then(obj, f); + } } EOLIAN static int diff --git a/src/lib/elementary/efl_ui_view_list_precise_layouter.c b/src/lib/elementary/efl_ui_view_list_precise_layouter.c index 5922831..ee5c181 100644 --- a/src/lib/elementary/efl_ui_view_list_precise_layouter.c +++ b/src/lib/elementary/efl_ui_view_list_precise_layouter.c @@ -239,7 +239,7 @@ _child_added_cb(void *data, const Efl_Event *event) Request *r; r = calloc(1, sizeof (Request)); - if (!r) return ; + if (!r) return; r->index = evt->index; r->pd = pd; @@ -310,13 +310,22 @@ _child_removed_cb(void *data, const Efl_Event *event) evas_object_smart_changed(pd->modeler); } +static void +_child_count_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) +{ + Efl_Ui_View_List_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_View_List_Precise_Layouter_Data *pd, Efl_Ui_View_List_Model *modeler, Efl_Ui_View_List_SegArray *segarray) { if(pd->initialized) return EINA_TRUE; - if(!pd->model) + if(!pd->model || !pd->count_total) return EINA_FALSE; pd->recalc = EINA_TRUE; @@ -325,11 +334,11 @@ _initilize(Eo *obj EINA_UNUSED, Efl_Ui_View_List_Precise_Layouter_Data *pd, Efl_ pd->modeler = modeler; pd->segarray = segarray; - evas_object_event_callback_add(modeler, EVAS_CALLBACK_RESIZE, _on_modeler_resize, pd); + efl_ui_view_list_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); - efl_ui_view_list_model_load_range_set(modeler, 0, 0); // load all + evas_object_event_callback_add(modeler, EVAS_CALLBACK_RESIZE, _on_modeler_resize, pd); pd->min.w = 0; pd->min.h = 0; @@ -345,6 +354,7 @@ _finalize(Eo *obj EINA_UNUSED, Efl_Ui_View_List_Precise_Layouter_Data *pd) evas_object_event_callback_del_full(pd->modeler, EVAS_CALLBACK_RESIZE, _on_modeler_resize, pd); 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; Eina_Accessor *nodes = efl_ui_view_list_segarray_node_accessor_get(pd->segarray); EINA_ACCESSOR_FOREACH(nodes, i, node) @@ -364,6 +374,7 @@ _finalize(Eo *obj EINA_UNUSED, Efl_Ui_View_List_Precise_Layouter_Data *pd) pd->modeler = NULL; pd->initialized = EINA_FALSE; + pd->recalc = EINA_TRUE; } static void @@ -473,8 +484,6 @@ _calc_size_job(void *data) pd = efl_data_scope_get(obj, MY_CLASS); if (EINA_UNLIKELY(!pd)) return; - pd->recalc = EINA_FALSE; - Eina_Accessor *nodes = efl_ui_view_list_segarray_node_accessor_get(pd->segarray); while (eina_accessor_data_get(nodes, pd->calc_progress, (void **)&node)) { @@ -521,6 +530,7 @@ _calc_size_job(void *data) eina_accessor_free(nodes); pd->calc_progress = 0; pd->calc_job = NULL; + pd->recalc = EINA_FALSE; evas_object_smart_changed(pd->modeler); } @@ -567,17 +577,13 @@ _efl_ui_view_list_precise_layouter_efl_ui_view_list_relayout_model_set(Eo *obj E efl_replace(&pd->model, model); - pd->count_total = 0; - - if (model) + if (pd->model) { pd->count_total = efl_model_children_count_get(pd->model); - - if (pd->modeler && (pd->count_total != efl_ui_view_list_segarray_count(pd->segarray))) - { - pd->recalc = EINA_TRUE; - efl_ui_view_list_model_load_range_set(pd->modeler, 0, pd->count_total); // load all - } + if (pd->count_total && pd->modeler) + efl_ui_view_list_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); } } -- 2.7.4