forked from enlightenment/efl
elm: fix efl_model property_get and children_slice_get in views
This commit is contained in:
parent
1fb268ac3c
commit
0dfadc2322
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue