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);
}
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);
}
}
- eina_value_free(vfile);
- eina_value_free(vkey);
free(file);
free(key);
+err:
+ eina_value_free(vfile);
+ eina_value_free(vkey);
}
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);
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)
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);
}
{
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)
{
if (pd->model == model)
return;
-
if (pd->model)
{
if (pd->relayout)
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);
}
_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 *
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;
}
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
Request *r;
r = calloc(1, sizeof (Request));
- if (!r) return ;
+ if (!r) return;
r->index = evt->index;
r->pd = pd;
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;
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;
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)
pd->modeler = NULL;
pd->initialized = EINA_FALSE;
+ pd->recalc = EINA_TRUE;
}
static void
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))
{
eina_accessor_free(nodes);
pd->calc_progress = 0;
pd->calc_job = NULL;
+ pd->recalc = EINA_FALSE;
evas_object_smart_changed(pd->modeler);
}
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);
}
}