2016-05-24 04:40:18 -07:00
|
|
|
#ifndef _ELM_PART_HELPER_H
|
|
|
|
#define _ELM_PART_HELPER_H
|
|
|
|
|
|
|
|
#include "elm_layout_internal_part.eo.h"
|
|
|
|
|
2016-05-25 22:06:52 -07:00
|
|
|
//#define ELM_PART_HOOK do { ERR("%p:%s [%d]", pd->obj, pd->part, (int) pd->temp); } while(0)
|
|
|
|
#define ELM_PART_HOOK
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
#define ELM_PART_REF(obj, pd) do { if (!(pd->temp++)) efl_ref(obj); } while(0)
|
2016-08-10 07:23:04 -07:00
|
|
|
#define ELM_PART_UNREF(obj, pd) do { if (pd->temp) { if (!(--pd->temp)) efl_del(obj); } } while(0)
|
2016-05-25 22:06:52 -07:00
|
|
|
#define ELM_PART_RETURN_VAL(a) do { ELM_PART_HOOK; typeof(a) _ret = a; ELM_PART_UNREF(obj, pd); return _ret; } while(0)
|
|
|
|
#define ELM_PART_RETURN_VOID do { ELM_PART_HOOK; ELM_PART_UNREF(obj, pd); return; } while(0)
|
2016-05-24 04:40:18 -07:00
|
|
|
#define ELM_PART_CALL(a) ({ ELM_PART_REF(obj, pd); a; })
|
|
|
|
|
|
|
|
typedef struct _Elm_Part_Data Elm_Part_Data;
|
|
|
|
struct _Elm_Part_Data
|
|
|
|
{
|
|
|
|
Eo *obj;
|
|
|
|
void *sd;
|
|
|
|
char *part;
|
|
|
|
unsigned char temp;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Note: this generic implementation can be improved to support part object
|
|
|
|
// caching or something...
|
|
|
|
|
2016-05-25 22:06:52 -07:00
|
|
|
#define ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \
|
2016-05-24 04:40:18 -07:00
|
|
|
static EOLIAN void \
|
2016-08-10 07:23:04 -07:00
|
|
|
_ ## type ## _internal_part_efl_object_destructor(Eo *obj, partdata *pd) \
|
2016-05-24 04:40:18 -07:00
|
|
|
{ \
|
2016-05-25 22:06:52 -07:00
|
|
|
ELM_PART_HOOK; \
|
2016-05-24 04:40:18 -07:00
|
|
|
free(pd->part); \
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_data_xunref(pd->obj, pd->sd, obj); \
|
|
|
|
efl_destructor(efl_super(obj, TYPE ## _INTERNAL_PART_CLASS)); \
|
2016-05-24 04:40:18 -07:00
|
|
|
} \
|
2016-05-25 22:06:52 -07:00
|
|
|
|
|
|
|
// Main part proxy implementation
|
|
|
|
#define ELM_PART_IMPLEMENT(type, TYPE, typedata, partdata) \
|
|
|
|
ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \
|
2016-08-10 07:23:04 -07:00
|
|
|
static EOLIAN Efl_Object * \
|
2016-05-24 04:40:18 -07:00
|
|
|
_ ## type ## _efl_part_part(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \
|
|
|
|
{ \
|
|
|
|
partdata *pd; \
|
|
|
|
Eo *proxy; \
|
|
|
|
\
|
2016-08-15 06:44:41 -07:00
|
|
|
proxy = efl_add(TYPE ## _INTERNAL_PART_CLASS, (Eo *) obj); \
|
|
|
|
pd = efl_data_scope_get(proxy, TYPE ## _INTERNAL_PART_CLASS); \
|
2016-05-24 04:40:18 -07:00
|
|
|
if (pd) \
|
|
|
|
{ \
|
|
|
|
pd->obj = (Eo *) obj; \
|
2016-08-15 06:44:41 -07:00
|
|
|
pd->sd = efl_data_xref(pd->obj, TYPE ## _CLASS, proxy); \
|
2016-05-24 04:40:18 -07:00
|
|
|
pd->part = part ? strdup(part) : NULL; \
|
|
|
|
pd->temp = 1; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
return proxy; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_PART_IMPLEMENT_CONTENT_SET(type, TYPE, typedata, partdata) \
|
|
|
|
static EOLIAN Eina_Bool \
|
|
|
|
_ ## type ## _internal_part_efl_container_content_set(Eo *obj, partdata *pd, Efl_Gfx *content) \
|
|
|
|
{ \
|
|
|
|
ELM_PART_RETURN_VAL(_ ## type ## _content_set(pd->obj, pd->sd, pd->part, content)); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_PART_IMPLEMENT_CONTENT_GET(type, TYPE, typedata, partdata) \
|
|
|
|
static EOLIAN Efl_Gfx * \
|
|
|
|
_ ## type ## _internal_part_efl_container_content_get(Eo *obj, partdata *pd) \
|
|
|
|
{ \
|
|
|
|
ELM_PART_RETURN_VAL(_ ## type ## _content_get(pd->obj, pd->sd, pd->part)); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_PART_IMPLEMENT_CONTENT_UNSET(type, TYPE, typedata, partdata) \
|
|
|
|
static EOLIAN Efl_Gfx * \
|
|
|
|
_ ## type ## _internal_part_efl_container_content_unset(Eo *obj, partdata *pd) \
|
|
|
|
{ \
|
|
|
|
ELM_PART_RETURN_VAL(_ ## type ## _content_unset(pd->obj, pd->sd, pd->part)); \
|
|
|
|
}
|
|
|
|
|
|
|
|
// For widgets that inherit from something with parts (eg. from Elm.Layout)
|
|
|
|
#define ELM_PART_OVERRIDE(type, TYPE, SUPER, typedata, partdata) \
|
2016-08-10 07:23:04 -07:00
|
|
|
static EOLIAN Efl_Object * \
|
2016-05-24 04:40:18 -07:00
|
|
|
_ ## type ## _efl_part_part(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \
|
|
|
|
{ \
|
|
|
|
partdata *pd; \
|
|
|
|
Eo *proxy; \
|
|
|
|
\
|
2016-08-15 06:44:41 -07:00
|
|
|
proxy = efl_add(TYPE ## _INTERNAL_PART_CLASS, (Eo *) obj); \
|
|
|
|
pd = efl_data_scope_get(proxy, SUPER ## _INTERNAL_PART_CLASS); \
|
2016-05-24 04:40:18 -07:00
|
|
|
if (pd) \
|
|
|
|
{ \
|
|
|
|
pd->obj = (Eo *) obj; \
|
2016-08-15 06:44:41 -07:00
|
|
|
pd->sd = efl_data_xref(pd->obj, SUPER ## _CLASS, proxy); \
|
2016-05-24 04:40:18 -07:00
|
|
|
pd->part = part ? strdup(part) : NULL; \
|
|
|
|
pd->temp = 1; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
return proxy; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_PART_OVERRIDE_CONTENT_SET(type, TYPE, SUPER, typedata, partdata) \
|
|
|
|
static EOLIAN Eina_Bool \
|
|
|
|
_ ## type ## _internal_part_efl_container_content_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Gfx *content) \
|
|
|
|
{ \
|
2016-08-15 06:44:41 -07:00
|
|
|
partdata *pd = efl_data_scope_get(obj, SUPER ## _INTERNAL_PART_CLASS); \
|
|
|
|
typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
|
2016-05-29 20:28:18 -07:00
|
|
|
ELM_PART_RETURN_VAL(_ ## type ## _content_set(pd->obj, sd, pd->part, content)); \
|
2016-05-24 04:40:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_PART_OVERRIDE_CONTENT_GET(type, TYPE, SUPER, typedata, partdata) \
|
|
|
|
static EOLIAN Efl_Gfx * \
|
|
|
|
_ ## type ## _internal_part_efl_container_content_get(Eo *obj, void *_pd EINA_UNUSED) \
|
|
|
|
{ \
|
2016-08-15 06:44:41 -07:00
|
|
|
partdata *pd = efl_data_scope_get(obj, SUPER ## _INTERNAL_PART_CLASS); \
|
|
|
|
typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
|
2016-05-29 20:28:18 -07:00
|
|
|
ELM_PART_RETURN_VAL(_ ## type ## _content_get(pd->obj, sd, pd->part)); \
|
2016-05-24 04:40:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#define ELM_PART_OVERRIDE_CONTENT_UNSET(type, TYPE, SUPER, typedata, partdata) \
|
|
|
|
static EOLIAN Efl_Gfx * \
|
|
|
|
_ ## type ## _internal_part_efl_container_content_unset(Eo *obj, void *_pd EINA_UNUSED) \
|
|
|
|
{ \
|
2016-08-15 06:44:41 -07:00
|
|
|
partdata *pd = efl_data_scope_get(obj, SUPER ## _INTERNAL_PART_CLASS); \
|
|
|
|
typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
|
2016-05-29 20:28:18 -07:00
|
|
|
ELM_PART_RETURN_VAL(_ ## type ## _content_unset(pd->obj, sd, pd->part)); \
|
2016-05-24 04:40:18 -07:00
|
|
|
}
|
|
|
|
|
2017-01-04 03:17:21 -08:00
|
|
|
#define EFL_TEXT_DEFAULT_IMPLEMENT(type, Type) \
|
|
|
|
EOLIAN static void \
|
|
|
|
_ ## type ## _efl_text_text_set(Eo *obj, Type *pd EINA_UNUSED, const char *text) \
|
|
|
|
{ \
|
|
|
|
elm_layout_text_set(obj, NULL, text); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
EOLIAN static const char * \
|
2017-05-21 20:48:12 -07:00
|
|
|
_ ## type ## _efl_text_text_get(Eo *obj, Efl_Ui_Button_Data *pd EINA_UNUSED) \
|
2017-01-04 03:17:21 -08:00
|
|
|
{ \
|
|
|
|
return elm_layout_text_get(obj, NULL); \
|
|
|
|
}
|
|
|
|
|
2016-05-24 04:40:18 -07:00
|
|
|
#endif
|