elm: fix efl_model property_get and children_slice_get in views

This commit is contained in:
Larry Lira 2018-06-07 18:44:37 -03:00
parent 1fb268ac3c
commit 0dfadc2322
4 changed files with 49 additions and 33 deletions

View File

@ -1782,8 +1782,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);
@ -1792,7 +1796,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);
@ -1807,10 +1812,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

View File

@ -1924,10 +1924,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);
@ -1945,6 +1948,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)
@ -1955,7 +1959,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);
}

View 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

View 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);
}
}