|
|
|
NavigationPersonal tools |
MVC List
In order to provide this Model-View-Controller, we need to specify a API to allow these parts to be developed. The suggested API is: typedef void (*MVC_Value_Set)(Evas_Object *list,
Evas_Object *row_renderer,
void *row_data, /* row contents */
void *data);
typedef Evas_Object *(*MVC_View_Add)(Evas *evas,
void *data);
typedef void (*Data_Free)(void *data);
typedef struct MVC_Model_Funcs {
int (*length)(void *model),
void *(*value_get)(void *model, int index),
void *(*slice_get)(void *model, int *start, int *end)
/* TODO: will slice be an array, list or an iterator or ...? */
} MVC_Model_Funcs;
void mvc_list_callback_value_set_set(Evas_Object *list,
MVC_Value_Set *value_set,
void *data,
Data_Free data_free);
void mvc_list_callback_view_add_set(Evas_Object *list,
MVC_View_Add *renderer_add,
void *data,
Data_Free data_free);
void mvc_list_model_set(Evas_Object *list,
void *model,
Data_Free model_free,
MVC_Model_Funcs *funcs,
Data_Free funcs_free);
Usage Example: void value_set(Evas_Object *list
Evas_Object *row_renderer,
void *row_data,
void *data)
{
edje_object_part_text_set(row_renderer, "text", row_data);
}
Evas_Object *renderer_add(Evas *evas,
void *data)
{
Evas_Object *o;
struct edje_spec *spec = data;
o = edje_object_add(evas);
edje_object_file_set(o, spec->file, spec->group);
return o;
}
void spec_free(void *data)
{
struct edje_spec *spec = data;
free(spec->file);
free(spec->group);
free(spec);
}
struct edje_spec *spec;
spec = malloc(sizeof(*spec));
spec->file = strdup("file.edj");
spec->group = strdup("group");
Model *model;
model = model_new();
Evas_Object *view;
view = my_mvc_list_add(evas); /* some mvc implementation */
mvc_list_callback_value_set_set(view, value_set, NULL, NULL);
mvc_list_callback_view_add_set(view, renderer_add, spec, spec_free);
mvc_list_model_set(view, model, model_free, model_funcs, NULL);
model_append(model, "some value");
mvc_list_model_changed(view);
|