enventor/src/bin/dummy_obj.c

163 lines
4.2 KiB
C
Raw Normal View History

2013-07-20 01:51:56 -07:00
#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
#include <Elementary.h>
#include <Edje_Edit.h>
#include "common.h"
typedef struct part_obj_s
{
Evas_Object *obj;
Eina_Stringshare *name;
} part_obj;
2013-07-20 12:52:20 -07:00
struct dummy_obj_s
2013-07-20 01:51:56 -07:00
{
Evas_Object *layout;
Eina_List *swallows;
2013-08-25 10:31:43 -07:00
Ecore_Animator *animator;
2013-07-20 01:51:56 -07:00
};
2013-07-20 12:57:14 -07:00
const char *DUMMYOBJ = "dummy_obj";
2013-07-20 01:51:56 -07:00
void
2013-07-20 12:56:34 -07:00
dummy_objs_update(dummy_obj *dummy)
2013-07-20 01:51:56 -07:00
{
Eina_List *parts = edje_edit_parts_list_get(dummy->layout);
2013-07-20 01:51:56 -07:00
Eina_List *l, *l_next, *l2;
char *part_name;
Edje_Part_Type type;
part_obj *po;
Eina_Bool removed;
2013-07-20 01:51:56 -07:00
//Remove the fake swallow objects that parts are removed.
2013-07-20 12:56:34 -07:00
EINA_LIST_FOREACH_SAFE(dummy->swallows, l, l_next, po)
2013-07-20 01:51:56 -07:00
{
removed = EINA_FALSE;
2013-07-20 01:51:56 -07:00
EINA_LIST_FOREACH(parts, l2, part_name)
{
if (strlen(po->name) > strlen(part_name))
{
if (strcmp(po->name, part_name)) continue;
}
else
{
if (strcmp(part_name, po->name)) continue;
}
if (edje_edit_part_type_get(dummy->layout, part_name) !=
EDJE_PART_TYPE_SWALLOW)
{
removed = EINA_TRUE;
break;
}
2013-07-20 01:51:56 -07:00
}
if (removed)
{
evas_object_del(po->obj);
eina_stringshare_del(po->name);
2013-07-20 12:56:34 -07:00
dummy->swallows = eina_list_remove_list(dummy->swallows, l);
2013-07-20 01:51:56 -07:00
free(po);
}
}
//Add new part object or Update changed part.
EINA_LIST_FOREACH(parts, l, part_name)
{
type = edje_edit_part_type_get(dummy->layout, part_name);
2013-07-20 01:51:56 -07:00
if (type == EDJE_PART_TYPE_SWALLOW)
{
//Check this part is exist
if (edje_object_part_swallow_get(dummy->layout, part_name))
continue;
2013-07-20 01:51:56 -07:00
2013-07-20 02:39:23 -07:00
part_obj *po = malloc(sizeof(part_obj));
if (!po) continue;
2013-07-20 01:51:56 -07:00
//New part. Add fake object.
Evas_Object *obj = edje_object_add(dummy->layout);
edje_object_file_set(obj, EDJE_PATH, "swallow");
2013-07-20 01:51:56 -07:00
evas_object_show(obj);
edje_object_part_swallow(dummy->layout, part_name, obj);
2013-07-20 01:51:56 -07:00
po->obj = obj;
po->name = eina_stringshare_add(part_name);
2013-07-20 12:56:34 -07:00
dummy->swallows = eina_list_append(dummy->swallows, po);
2013-07-20 01:51:56 -07:00
}
}
}
static Eina_Bool
animator_cb(void *data)
{
2013-07-20 12:56:34 -07:00
dummy_obj *dummy = data;
dummy_objs_update(dummy);
2013-08-25 10:31:43 -07:00
dummy->animator = NULL;
2013-07-20 01:51:56 -07:00
return ECORE_CALLBACK_CANCEL;
}
static void
edje_change_file_cb(void *data, Evas_Object *obj EINA_UNUSED,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
{
2013-07-20 12:56:34 -07:00
dummy_obj *dummy = data;
dummy_objs_update(dummy);
2013-07-20 01:51:56 -07:00
}
static void
layout_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
2013-07-20 12:52:20 -07:00
dummy_obj_del(obj);
2013-07-20 01:51:56 -07:00
}
2013-07-20 12:52:20 -07:00
void dummy_obj_new(Evas_Object *layout)
2013-07-20 01:51:56 -07:00
{
2013-07-20 12:56:34 -07:00
dummy_obj *dummy = evas_object_data_get(layout, DUMMYOBJ);
if (dummy) return;
2013-07-20 01:51:56 -07:00
2013-07-20 12:56:34 -07:00
dummy = calloc(1, sizeof(dummy_obj));
2013-07-20 01:51:56 -07:00
edje_object_signal_callback_add(layout,
2013-07-20 01:51:56 -07:00
"edje,change,file", "edje",
2013-07-20 12:56:34 -07:00
edje_change_file_cb, dummy);
2013-07-20 01:51:56 -07:00
2013-08-25 10:31:43 -07:00
Ecore_Animator *animator = ecore_animator_add(animator_cb, dummy);
2013-07-20 12:56:34 -07:00
evas_object_data_set(layout, DUMMYOBJ, dummy);
2013-07-20 01:51:56 -07:00
evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, layout_del_cb,
dummy);
2013-07-20 01:51:56 -07:00
2013-07-20 12:56:34 -07:00
dummy->layout = layout;
2013-08-25 10:31:43 -07:00
dummy->animator = animator;
2013-07-20 01:51:56 -07:00
}
2013-07-20 12:52:20 -07:00
void dummy_obj_del(Evas_Object *layout)
2013-07-20 01:51:56 -07:00
{
2013-07-20 12:56:34 -07:00
dummy_obj *dummy = evas_object_data_get(layout, DUMMYOBJ);
if (!dummy) return;
2013-07-20 01:51:56 -07:00
Eina_List *l;
part_obj *po;
2013-07-20 12:56:34 -07:00
EINA_LIST_FOREACH(dummy->swallows, l, po)
2013-07-20 01:51:56 -07:00
{
evas_object_del(po->obj);
eina_stringshare_del(po->name);
free(po);
}
2013-07-20 12:56:34 -07:00
eina_list_free(dummy->swallows);
2013-08-25 10:31:43 -07:00
if (dummy->animator) ecore_animator_del(dummy->animator);
free(dummy);
2013-07-20 01:51:56 -07:00
2013-07-20 12:56:34 -07:00
evas_object_data_set(layout, DUMMYOBJ, NULL);
2013-07-20 01:51:56 -07:00
evas_object_event_callback_del(layout, EVAS_CALLBACK_DEL, layout_del_cb);
edje_object_signal_callback_del(layout,
"edje,change,file", "edje",
edje_change_file_cb);
2013-07-20 01:51:56 -07:00
}