2014-09-30 07:56:16 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2013-07-20 01:51:56 -07:00
|
|
|
#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
|
|
|
|
|
2014-09-30 07:56:16 -07:00
|
|
|
#include <Enventor.h>
|
2013-07-20 01:51:56 -07:00
|
|
|
#include <Edje_Edit.h>
|
2014-09-30 07:56:16 -07:00
|
|
|
#include "enventor_private.h"
|
2013-07-20 01:51:56 -07:00
|
|
|
|
|
|
|
typedef struct part_obj_s
|
|
|
|
{
|
|
|
|
Evas_Object *obj;
|
|
|
|
Eina_Stringshare *name;
|
|
|
|
} part_obj;
|
|
|
|
|
2014-02-04 04:48:06 -08:00
|
|
|
typedef struct dummy_obj_s
|
2013-07-20 01:51:56 -07:00
|
|
|
{
|
|
|
|
Evas_Object *layout;
|
|
|
|
Eina_List *swallows;
|
2015-12-16 00:29:55 -08:00
|
|
|
Eina_List *spacers;
|
2013-08-25 10:31:43 -07:00
|
|
|
Ecore_Animator *animator;
|
2014-02-04 04:48:06 -08:00
|
|
|
} dummy_obj;
|
2013-07-20 01:51:56 -07:00
|
|
|
|
2013-07-20 12:57:14 -07:00
|
|
|
const char *DUMMYOBJ = "dummy_obj";
|
2015-12-21 16:25:53 -08:00
|
|
|
const char *EDIT_LAYOUT_KEY = "edit_layout";
|
2013-07-20 01:51:56 -07:00
|
|
|
|
2014-09-30 07:56:16 -07:00
|
|
|
/*****************************************************************************/
|
|
|
|
/* Internal method implementation */
|
|
|
|
/*****************************************************************************/
|
2015-12-21 16:25:53 -08:00
|
|
|
static void
|
|
|
|
edje_part_clicked(void *data, Evas *e EINA_UNUSED,
|
|
|
|
Evas_Object *obj, void *ei EINA_UNUSED)
|
|
|
|
{
|
|
|
|
part_obj *po = (part_obj *)data;
|
|
|
|
Evas_Object *layout = evas_object_data_get(obj, EDIT_LAYOUT_KEY);
|
|
|
|
evas_object_smart_callback_call(layout, "dummy,clicked", (char *)(po->name));
|
|
|
|
}
|
2014-09-30 07:56:16 -07:00
|
|
|
|
|
|
|
static void
|
2013-07-20 12:56:34 -07:00
|
|
|
dummy_objs_update(dummy_obj *dummy)
|
2013-07-20 01:51:56 -07:00
|
|
|
{
|
2013-09-07 02:49:36 -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;
|
2015-12-16 00:29:55 -08:00
|
|
|
Edje_Part_Type type = EDJE_PART_TYPE_NONE;
|
2013-07-20 01:51:56 -07:00
|
|
|
part_obj *po;
|
2014-08-27 01:21:01 -07:00
|
|
|
Evas *evas = evas_object_evas_get(dummy->layout);
|
2013-07-20 03:04:23 -07:00
|
|
|
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
|
|
|
{
|
2013-10-07 08:02:05 -07:00
|
|
|
removed = EINA_TRUE;
|
2013-07-20 03:04:23 -07:00
|
|
|
|
2013-07-20 01:51:56 -07:00
|
|
|
EINA_LIST_FOREACH(parts, l2, part_name)
|
|
|
|
{
|
2016-02-23 04:32:35 -08:00
|
|
|
if (!part_name || !po->name[0]) continue;
|
2013-10-07 08:02:05 -07:00
|
|
|
if (po->name[0] != part_name[0]) continue;
|
2015-12-21 18:01:11 -08:00
|
|
|
if ((strlen(po->name) != strlen(part_name))) continue;
|
2013-10-07 08:02:05 -07:00
|
|
|
if (!strcmp(po->name, part_name))
|
2013-07-20 01:51:56 -07:00
|
|
|
{
|
2015-12-16 00:29:55 -08:00
|
|
|
type = edje_edit_part_type_get(dummy->layout, part_name);
|
2015-12-21 18:01:11 -08:00
|
|
|
if ((type == EDJE_PART_TYPE_SWALLOW))
|
2013-10-07 08:02:05 -07:00
|
|
|
removed = EINA_FALSE;
|
2013-07-20 03:04:23 -07:00
|
|
|
break;
|
|
|
|
}
|
2013-07-20 01:51:56 -07:00
|
|
|
}
|
|
|
|
if (removed)
|
|
|
|
{
|
|
|
|
evas_object_del(po->obj);
|
|
|
|
eina_stringshare_del(po->name);
|
2015-12-21 18:01:11 -08:00
|
|
|
dummy->swallows = eina_list_remove_list(dummy->swallows, l);
|
|
|
|
free(po);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//Remove the fake swallow objects that parts are removed.
|
|
|
|
EINA_LIST_FOREACH_SAFE(dummy->spacers, l, l_next, po)
|
|
|
|
{
|
|
|
|
removed = EINA_TRUE;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(parts, l2, part_name)
|
|
|
|
{
|
|
|
|
if (po->name[0] != part_name[0]) continue;
|
|
|
|
if ((strlen(po->name) != strlen(part_name))) continue;
|
|
|
|
if (!strcmp(po->name, part_name))
|
|
|
|
{
|
|
|
|
type = edje_edit_part_type_get(dummy->layout, part_name);
|
|
|
|
if ((type == EDJE_PART_TYPE_SPACER))
|
|
|
|
removed = EINA_FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (removed)
|
|
|
|
{
|
|
|
|
evas_object_del(po->obj);
|
|
|
|
eina_stringshare_del(po->name);
|
|
|
|
dummy->spacers = eina_list_remove_list(dummy->spacers, 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)
|
|
|
|
{
|
2013-09-07 02:49:36 -07:00
|
|
|
type = edje_edit_part_type_get(dummy->layout, part_name);
|
2013-07-20 01:51:56 -07:00
|
|
|
|
|
|
|
if (type == EDJE_PART_TYPE_SWALLOW)
|
|
|
|
{
|
2015-12-21 16:25:53 -08:00
|
|
|
//Check this part is exist
|
2013-09-07 02:49:36 -07:00
|
|
|
if (edje_object_part_swallow_get(dummy->layout, part_name))
|
|
|
|
continue;
|
2013-07-20 01:51:56 -07:00
|
|
|
|
2013-09-12 06:14:16 -07:00
|
|
|
po = malloc(sizeof(part_obj));
|
2014-07-27 21:40:58 -07:00
|
|
|
if (!po)
|
|
|
|
{
|
|
|
|
EINA_LOG_ERR("Failed to allocate Memory!");
|
|
|
|
continue;
|
|
|
|
}
|
2013-07-20 02:39:23 -07:00
|
|
|
|
2013-07-20 01:51:56 -07:00
|
|
|
//New part. Add fake object.
|
2014-08-27 01:21:01 -07:00
|
|
|
Evas_Object *obj = edje_object_add(evas);
|
2013-09-07 02:49:36 -07:00
|
|
|
edje_object_file_set(obj, EDJE_PATH, "swallow");
|
|
|
|
edje_object_part_swallow(dummy->layout, part_name, obj);
|
2013-07-20 01:51:56 -07:00
|
|
|
|
|
|
|
po->obj = obj;
|
2015-12-21 16:25:53 -08:00
|
|
|
evas_object_data_set(po->obj, EDIT_LAYOUT_KEY, dummy->layout);
|
2013-07-20 01:51:56 -07:00
|
|
|
po->name = eina_stringshare_add(part_name);
|
2013-07-20 12:56:34 -07:00
|
|
|
dummy->swallows = eina_list_append(dummy->swallows, po);
|
2015-12-21 16:25:53 -08:00
|
|
|
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
|
|
|
|
edje_part_clicked, po);
|
2013-07-20 01:51:56 -07:00
|
|
|
}
|
2015-12-16 00:29:55 -08:00
|
|
|
else if (type == EDJE_PART_TYPE_SPACER)
|
|
|
|
{
|
|
|
|
Eina_List *spacer_l;
|
|
|
|
Evas_Object *obj = NULL;
|
|
|
|
int x = 0, y = 0, w = 0, h = 0, lx = 0, ly = 0;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(dummy->spacers, spacer_l, po)
|
|
|
|
if (po->name == part_name)
|
|
|
|
{
|
|
|
|
obj = po->obj;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!obj)
|
|
|
|
{
|
|
|
|
Evas_Object *scroller = view_obj_get(VIEW_DATA);
|
|
|
|
Evas_Object *scroller_edje = elm_layout_edje_get(scroller);
|
|
|
|
Evas_Object *clipper =
|
|
|
|
(Evas_Object *)edje_object_part_object_get(scroller_edje,
|
|
|
|
"clipper");
|
|
|
|
obj = elm_layout_add(scroller);
|
|
|
|
elm_layout_file_set(obj, EDJE_PATH, "spacer");
|
|
|
|
evas_object_smart_member_add(obj, scroller);
|
|
|
|
|
|
|
|
|
|
|
|
po = malloc(sizeof(part_obj));
|
|
|
|
po->obj = obj;
|
|
|
|
po->name = eina_stringshare_add(part_name);
|
|
|
|
dummy->spacers = eina_list_append(dummy->spacers, po);
|
|
|
|
evas_object_show(obj);
|
|
|
|
evas_object_clip_set(obj, clipper);
|
2015-12-21 16:25:53 -08:00
|
|
|
evas_object_data_set(obj, EDIT_LAYOUT_KEY, dummy->layout);
|
|
|
|
|
|
|
|
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
|
|
|
|
edje_part_clicked, po);
|
2015-12-16 00:29:55 -08:00
|
|
|
}
|
|
|
|
evas_object_geometry_get(dummy->layout, &lx, &ly, NULL, NULL);
|
|
|
|
edje_object_part_geometry_get(dummy->layout, part_name, &x, &y, &w, &h);
|
|
|
|
evas_object_resize(obj, w, h);
|
|
|
|
evas_object_move(obj, lx + x, ly + y);
|
|
|
|
}
|
2013-07-20 01:51:56 -07:00
|
|
|
}
|
2014-07-18 23:07:25 -07:00
|
|
|
|
|
|
|
edje_edit_string_list_free(parts);
|
2013-07-20 01:51:56 -07:00
|
|
|
}
|
|
|
|
|
2015-12-16 00:29:55 -08:00
|
|
|
static void
|
|
|
|
layout_geom_changed_cb(void *data, Evas *evas EINA_UNUSED,
|
|
|
|
Evas_Object *obj, void *ei EINA_UNUSED)
|
|
|
|
{
|
|
|
|
dummy_obj *dummy = (dummy_obj *)data;
|
|
|
|
|
|
|
|
Eina_List *spacer_l;
|
|
|
|
part_obj *po;
|
|
|
|
int x = 0, y = 0, w = 0, h = 0, lx = 0, ly = 0;
|
|
|
|
|
|
|
|
evas_object_geometry_get(obj, &lx, &ly, NULL, NULL);
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(dummy->spacers, spacer_l, po)
|
|
|
|
if (edje_object_part_exists(obj, po->name))
|
|
|
|
{
|
|
|
|
edje_object_part_geometry_get(obj, po->name, &x, &y, &w, &h);
|
|
|
|
evas_object_resize(po->obj, w, h);
|
|
|
|
evas_object_move(po->obj, lx + x, ly + y);
|
|
|
|
}
|
|
|
|
}
|
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
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2014-09-30 07:56:16 -07:00
|
|
|
/*****************************************************************************/
|
|
|
|
/* Externally accessible calls */
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
2014-07-19 00:03:46 -07:00
|
|
|
void
|
|
|
|
dummy_obj_update(Evas_Object *layout)
|
|
|
|
{
|
|
|
|
dummy_obj *dummy = evas_object_data_get(layout, DUMMYOBJ);
|
|
|
|
if (!dummy) return;
|
|
|
|
dummy_objs_update(dummy);
|
|
|
|
}
|
|
|
|
|
|
|
|
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));
|
2014-07-27 21:40:58 -07:00
|
|
|
if (!dummy)
|
|
|
|
{
|
|
|
|
EINA_LOG_ERR("Failed to allocate Memory!");
|
|
|
|
return;
|
|
|
|
}
|
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
|
|
|
|
2013-07-20 13:12:33 -07:00
|
|
|
evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, layout_del_cb,
|
|
|
|
dummy);
|
2013-07-20 01:51:56 -07:00
|
|
|
|
2015-12-16 00:29:55 -08:00
|
|
|
evas_object_event_callback_add(layout, EVAS_CALLBACK_RESIZE,
|
|
|
|
layout_geom_changed_cb, dummy);
|
|
|
|
evas_object_event_callback_add(layout, EVAS_CALLBACK_MOVE,
|
|
|
|
layout_geom_changed_cb, dummy);
|
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
|
|
|
}
|
|
|
|
|
2014-09-30 07:56:16 -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);
|
2013-07-20 13:12:33 -07:00
|
|
|
if (!dummy) return;
|
2013-07-20 01:51:56 -07:00
|
|
|
|
2015-12-16 00:29:55 -08:00
|
|
|
evas_object_event_callback_del_full(layout, EVAS_CALLBACK_RESIZE,
|
|
|
|
layout_geom_changed_cb, dummy);
|
|
|
|
evas_object_event_callback_del_full(layout, EVAS_CALLBACK_MOVE,
|
|
|
|
layout_geom_changed_cb, dummy);
|
|
|
|
|
2013-07-20 01:51:56 -07:00
|
|
|
part_obj *po;
|
2014-03-15 12:43:17 -07:00
|
|
|
EINA_LIST_FREE(dummy->swallows, po)
|
2013-07-20 01:51:56 -07:00
|
|
|
{
|
|
|
|
evas_object_del(po->obj);
|
|
|
|
eina_stringshare_del(po->name);
|
|
|
|
free(po);
|
|
|
|
}
|
2013-08-25 10:31:43 -07:00
|
|
|
|
2015-12-16 00:29:55 -08:00
|
|
|
EINA_LIST_FREE(dummy->spacers, po)
|
|
|
|
{
|
|
|
|
evas_object_del(po->obj);
|
|
|
|
eina_stringshare_del(po->name);
|
|
|
|
free(po);
|
|
|
|
}
|
|
|
|
|
2014-03-15 19:51:02 -07:00
|
|
|
ecore_animator_del(dummy->animator);
|
2013-07-20 13:30:49 -07:00
|
|
|
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);
|
|
|
|
}
|