elm: fix efl_model property_get and children_slice_get in views
authorLarry Lira <larry@expertisesolutions.com.br>
Thu, 7 Jun 2018 21:44:37 +0000 (18:44 -0300)
committerJongmin Lee <jm105.lee@samsung.com>
Tue, 12 Jun 2018 05:47:19 +0000 (14:47 +0900)
src/lib/elementary/efl_ui_image.c
src/lib/elementary/efl_ui_layout_object.c
src/lib/elementary/efl_ui_view_list.c
src/lib/elementary/efl_ui_view_list_precise_layouter.c

index 035de7e..1a4987b 100644 (file)
@@ -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
index 4c68241..51e22ce 100644 (file)
@@ -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);
      }
index abcb0d5..8af043a 100644 (file)
@@ -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
index 5922831..ee5c181 100644 (file)
@@ -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);
      }
 }