diff options
Diffstat (limited to 'src/lib/ecore/efl_model_accessor_view.c')
-rw-r--r-- | src/lib/ecore/efl_model_accessor_view.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/lib/ecore/efl_model_accessor_view.c b/src/lib/ecore/efl_model_accessor_view.c new file mode 100644 index 0000000000..6b62b1ddac --- /dev/null +++ b/src/lib/ecore/efl_model_accessor_view.c @@ -0,0 +1,104 @@ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "Eina.h" +#include "Eo.h" + +#include "efl_model_accessor_view_private.h" + +typedef struct _Efl_Model_Accessor +{ + Eina_Accessor vtable; + Eina_Accessor *real_accessor; + void* pdata; + Efl_Model_Accessor_View_Constructor_Cb cb; +} Efl_Model_Accessor; + +static Eina_Bool +_efl_model_acessor_get_at(Efl_Model_Accessor *acc, unsigned int idx, void **data) +{ + void* eo; + Eo *p, *new_eo; + + if(eina_accessor_data_get(acc->real_accessor, idx, &eo)) + { + p = eo; + new_eo = acc->cb(acc->pdata, p); + *data = new_eo; + return EINA_TRUE; + } + else + return EINA_FALSE; +} + +static void * +_efl_model_acessor_get_container(Efl_Model_Accessor *acc) +{ + return eina_accessor_container_get(acc->real_accessor); +} + +static void +_efl_model_acessor_free(Efl_Model_Accessor *acc) +{ + if (acc->real_accessor) + { + eina_accessor_free(acc->real_accessor); + acc->real_accessor = NULL; + } + + free(acc); +} + +static Eina_Bool +_efl_model_acessor_lock(Efl_Model_Accessor *acc) +{ + return eina_accessor_lock(acc->real_accessor); +} + +static Eina_Bool +_efl_model_acessor_unlock(Efl_Model_Accessor *acc) +{ + return eina_accessor_unlock(acc->real_accessor); +} + +static Efl_Model_Accessor * +_efl_model_acessor_clone(Efl_Model_Accessor *acc EINA_UNUSED) +{ + return NULL; +} + +static void +_efl_model_accessor_setup(Efl_Model_Accessor *acc, + Eina_Accessor* real_accessor, + Efl_Model_Accessor_View_Constructor_Cb ctor, + void* pdata) +{ + acc->vtable.version = EINA_ACCESSOR_VERSION; + acc->vtable.get_at = FUNC_ACCESSOR_GET_AT(_efl_model_acessor_get_at); + acc->vtable.get_container = FUNC_ACCESSOR_GET_CONTAINER(_efl_model_acessor_get_container); + acc->vtable.free = FUNC_ACCESSOR_FREE(_efl_model_acessor_free); + + acc->vtable.lock = FUNC_ACCESSOR_LOCK(_efl_model_acessor_lock); + acc->vtable.unlock = FUNC_ACCESSOR_LOCK(_efl_model_acessor_unlock); + + acc->vtable.clone = FUNC_ACCESSOR_CLONE(_efl_model_acessor_clone); + + EINA_MAGIC_SET(&acc->vtable, EINA_MAGIC_ACCESSOR); + + acc->real_accessor = real_accessor; + acc->cb = ctor; + acc->pdata = pdata; +} + +Eina_Accessor* efl_model_accessor_view_new(Eina_Accessor* accessor, + Efl_Model_Accessor_View_Constructor_Cb ctor, + void* data) +{ + Efl_Model_Accessor* acc = calloc(1, sizeof(Efl_Model_Accessor)); + fprintf(stderr, "%s %s:%d\n", __func__, __FILE__, __LINE__); fflush(stderr); + _efl_model_accessor_setup(acc, accessor, ctor, data); + return &acc->vtable; +} + + |