Make the Edje Smart inheritable.

Pretty much moving some things around and extending the smart class
to allow overloading some common functions. Edje_Edit will make use
of this.


SVN revision: 47841
This commit is contained in:
Iván Briano 2010-04-08 19:21:54 +00:00
parent 57c16867e2
commit 3c61844af1
6 changed files with 107 additions and 50 deletions

View File

@ -3642,7 +3642,7 @@ edje_edit_state_external_param_bool_get(Evas_Object *obj, const char *part, cons
EINA_LIST_FOREACH(pd->external_params, l, p)
if (!strcmp(p->name, param))
{
if (p->type != EDJE_EXTERNAL_PARAM_TYPE_INT)
if (p->type != EDJE_EXTERNAL_PARAM_TYPE_BOOL)
return EINA_FALSE;
if (val)
*val = p->i;

View File

@ -10,7 +10,6 @@ static Eina_Bool _edje_file_collection_hash_foreach(const Eina_Hash *hash, const
#ifdef EDJE_PROGRAM_CACHE
static Eina_Bool _edje_collection_free_prog_cache_matches_free_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
#endif
static int _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *group, Eina_List *group_path);
static void _edje_object_pack_item_hints_set(Evas_Object *obj, Edje_Pack_Element *it);
static void _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char *source);
@ -33,7 +32,12 @@ static Eina_List *_edje_swallows_collect(Edje *ed);
EAPI Eina_Bool
edje_object_file_set(Evas_Object *obj, const char *file, const char *group)
{
return _edje_object_file_set_internal(obj, file, group, NULL);
Edje *ed;
ed = _edje_fetch(obj);
if (!ed)
return EINA_FALSE;
return ed->api->file_set(obj, file, group);
}
/* FIXDOC: Verify/expand doc. */
@ -272,7 +276,7 @@ _edje_programs_patterns_init(Edje *ed)
ssp->sources_patterns = edje_match_programs_source_init(ssp->globing);
}
static int
int
_edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *group, Eina_List *group_path)
{
Edje *ed;

View File

@ -200,25 +200,6 @@ edje_shutdown(void)
/* Private Routines */
Edje *
_edje_add(Evas_Object *obj)
{
Edje *ed;
ed = calloc(1, sizeof(Edje));
if (!ed) return NULL;
ed->evas = evas_object_evas_get(obj);
ed->clipper = evas_object_rectangle_add(ed->evas);
evas_object_smart_member_add(ed->clipper, obj);
evas_object_color_set(ed->clipper, 255, 255, 255, 255);
evas_object_move(ed->clipper, -10000, -10000);
evas_object_resize(ed->clipper, 20000, 20000);
evas_object_pass_events_set(ed->clipper, 1);
ed->have_objects = 1;
ed->references = 1;
return ed;
}
void
_edje_del(Edje *ed)
{

View File

@ -111,6 +111,26 @@ EAPI extern int _edje_default_log_dom ;
#endif
/* Inheritable Edje Smart API. For now private so only Edje Edit makes
* use of this, but who knows what will be possible in the future */
#define EDJE_SMART_API_VERSION 1
typedef struct _Edje_Smart_Api Edje_Smart_Api;
struct _Edje_Smart_Api
{
Evas_Smart_Class base;
int version;
Eina_Bool (*file_set)(Evas_Object *obj, const char *file, const char *group);
};
/* Basic macro to init the Edje Smart API */
#define EDJE_SMART_API_INIT(smart_class_init) {smart_class_init, EDJE_SMART_API_VERSION, NULL}
#define EDJE_SMART_API_INIT_NULL EDJE_SMART_API_INIT(EVAS_SMART_CLASS_INIT_NULL)
#define EDJE_SMART_API_INIT_VERSION EDJE_SMART_API_INIT(EVAS_SMART_CLASS_INIT_VERSION)
#define EDJE_SMART_API_INIT_NAME_VERSION(name) EDJE_SMART_API_INIT(EVAS_SMART_CLASS_INIT_NAME_VERSION(name))
/* increment this when the EET data descriptors have changed and old
* EETs cannot be loaded/used correctly anymore.
*/
@ -766,6 +786,7 @@ typedef struct _Edje_Signals_Sources_Patterns Edje_Signals_Sources_Patterns;
struct _Edje
{
const Edje_Smart_Api *api;
const char *path;
const char *group;
const char *parent;
@ -1247,6 +1268,8 @@ void _edje_callbacks_focus_del(Evas_Object *obj, Edje *ed);
void _edje_edd_init(void);
void _edje_edd_shutdown(void);
int _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *group, Eina_List *group_path);
void _edje_file_add(Edje *ed);
void _edje_file_del(Edje *ed);
void _edje_file_free(Edje_File *edf);
@ -1254,8 +1277,9 @@ void _edje_file_cache_shutdown(void);
void _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec);
void _edje_collection_free_part_description_free(Edje_Part_Description *desc, Eina_Bool free_strings);
void _edje_object_smart_set(Edje_Smart_Api *sc);
const Edje_Smart_Api * _edje_object_smart_class_get(void);
Edje *_edje_add(Evas_Object *obj);
void _edje_del(Edje *ed);
void _edje_ref(Edje *ed);
void _edje_unref(Edje *ed);

View File

@ -15,6 +15,9 @@ static void _edje_smart_clip_set(Evas_Object * obj, Evas_Object * clip);
static void _edje_smart_clip_unset(Evas_Object * obj);
static void _edje_smart_calculate(Evas_Object * obj);
static Eina_Bool _edje_smart_file_set(Evas_Object *obj, const char *file, const char *group);
static Edje_Smart_Api _edje_smart_class = EDJE_SMART_API_INIT_NAME_VERSION("edje");
static Evas_Smart *_edje_smart = NULL;
Eina_List *_edje_edjes = NULL;
@ -33,38 +36,79 @@ edje_object_add(Evas *evas)
{
if (!_edje_smart)
{
static const Evas_Smart_Class sc =
{
"edje",
EVAS_SMART_CLASS_VERSION,
_edje_smart_add,
_edje_smart_del,
_edje_smart_move,
_edje_smart_resize,
_edje_smart_show,
_edje_smart_hide,
_edje_smart_color_set,
_edje_smart_clip_set,
_edje_smart_clip_unset,
_edje_smart_calculate,
NULL,
NULL,
NULL
};
_edje_smart = evas_smart_class_new(&sc);
_edje_object_smart_set(&_edje_smart_class);
_edje_smart = evas_smart_class_new((Evas_Smart_Class *)&_edje_smart_class);
}
return evas_object_smart_add(evas, _edje_smart);
}
void
_edje_object_smart_set(Edje_Smart_Api *sc)
{
if (!sc)
return;
sc->base.add = _edje_smart_add;
sc->base.del = _edje_smart_del;
sc->base.move = _edje_smart_move;
sc->base.resize = _edje_smart_resize;
sc->base.show = _edje_smart_show;
sc->base.hide = _edje_smart_hide;
sc->base.color_set = _edje_smart_color_set;
sc->base.clip_set = _edje_smart_clip_set;
sc->base.clip_unset = _edje_smart_clip_unset;
sc->base.calculate = _edje_smart_calculate;
sc->base.member_add = NULL;
sc->base.member_del = NULL;
sc->file_set = _edje_smart_file_set;
}
const Edje_Smart_Api *
_edje_object_smart_class_get(void)
{
static const Edje_Smart_Api *class = NULL;
if (class)
return class;
_edje_object_smart_set(&_edje_smart_class);
class = &_edje_smart_class;
return class;
}
/* Private Routines */
static void
_edje_smart_add(Evas_Object *obj)
{
Edje *ed;
ed = _edje_add(obj);
if (!ed) return;
evas_object_smart_data_set(obj, ed);
ed = evas_object_smart_data_get(obj);
if (!ed)
{
const Evas_Smart *smart;
const Evas_Smart_Class *sc;
ed = calloc(1, sizeof(Edje));
if (!ed) return;
smart = evas_object_smart_smart_get(obj);
sc = evas_smart_class_get(smart);
ed->api = (const Edje_Smart_Api *)sc;
evas_object_smart_data_set(obj, ed);
}
ed->evas = evas_object_evas_get(obj);
ed->clipper = evas_object_rectangle_add(ed->evas);
evas_object_smart_member_add(ed->clipper, obj);
evas_object_color_set(ed->clipper, 255, 255, 255, 255);
evas_object_move(ed->clipper, -10000, -10000);
evas_object_resize(ed->clipper, 20000, 20000);
evas_object_pass_events_set(ed->clipper, 1);
ed->have_objects = 1;
ed->references = 1;
evas_object_geometry_get(obj, &(ed->x), &(ed->y), &(ed->w), &(ed->h));
ed->obj = obj;
_edje_edjes = eina_list_append(_edje_edjes, obj);
@ -273,3 +317,9 @@ _edje_smart_calculate(Evas_Object *obj)
if (!ed) return;
_edje_recalc_do(ed);
}
static Eina_Bool
_edje_smart_file_set(Evas_Object *obj, const char *file, const char *group)
{
return _edje_object_file_set_internal(obj, file, group, NULL);
}

View File

@ -4337,11 +4337,9 @@ Edje *
_edje_fetch(const Evas_Object *obj)
{
Edje *ed;
char *type;
type = (char *)evas_object_type_get(obj);
if (!type) return NULL;
if (strcmp(type, "edje")) return NULL;
if (!evas_object_smart_type_check(obj, "edje"))
return NULL;
ed = evas_object_smart_data_get(obj);
if ((ed) && (ed->delete_me)) return NULL;
return ed;