Support
Contribute
Contact
Tracker
Navigation
Personal tools
 

MVC List


EFL could provide a Model-View-Controller (MVC) list in order to have high-performance lists for huge amount of data. This is possible because MVC decouple data (Model) from what is required to display it (View), so we don't need to have one Evas_Object per existing list row.

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


Extra Ideas:

  • Provide easier way (helpers) to work with Edje as row renderers;
  • Provide standard Evas_List-like (or based) models;
  • Provide a row for standard models that do introspection somehow, enable automatic mapping to Edje object parts. Example
  • Enable Embryo to issue edje_object_part_*_set() so we can use Embryo to write value_set() and also add new models.