enventor/src/bin/edj_viewer.c

359 lines
9.7 KiB
C
Raw Normal View History

#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1
2013-07-20 01:51:56 -07:00
#include <Elementary.h>
#include <Edje_Edit.h>
2013-07-20 01:51:56 -07:00
#include "common.h"
struct viewer_s
{
stats_data *sd;
config_data *cd;
2013-07-20 01:51:56 -07:00
Evas_Object *parent;
Evas_Object *layout;
Evas_Object *scroller;
Evas_Object *part_obj;
Evas_Object *part_highlight;
Eina_Stringshare *group_name;
Eina_Stringshare *part_name;
Ecore_Idler *idler;
Ecore_Timer *timer;
void (*del_cb)(void *data);
void *data;
2013-09-12 06:14:16 -07:00
Eina_Bool dummy_on;
2013-07-20 01:51:56 -07:00
};
static Eina_Bool
file_set_timer_cb(void *data)
{
view_data *vd = data;
if (!vd->layout)
{
vd->timer = NULL;
return ECORE_CALLBACK_CANCEL;
}
if (edje_object_file_set(vd->layout, config_edj_path_get(vd->cd),
vd->group_name))
{
vd->timer = NULL;
return ECORE_CALLBACK_CANCEL;
}
edj_mgr_reload_need_set(edj_mgr_get(), EINA_TRUE);
return ECORE_CALLBACK_RENEW;
}
2013-07-20 01:51:56 -07:00
static void
part_obj_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
view_data *vd = data;
Evas_Object *part_highlight = vd->part_highlight;
//Create Part Highlight Object
if (!part_highlight && vd->part_name)
{
part_highlight = elm_layout_add(vd->scroller);
evas_object_smart_member_add(part_highlight, vd->scroller);
elm_layout_file_set(part_highlight, EDJE_PATH, "part_highlight");
evas_object_pass_events_set(part_highlight, EINA_TRUE);
evas_object_show(part_highlight);
}
Evas_Coord x, y, w , h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
evas_object_move(part_highlight, x, y);
evas_object_resize(part_highlight, w, h);
vd->part_highlight = part_highlight;
}
static void
part_obj_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
view_data *vd = data;
vd->part_obj = NULL;
}
static void
layout_resize_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
view_data *vd = data;
if (!config_stats_bar_get(vd->cd)) return;
2013-07-20 01:51:56 -07:00
Evas_Coord w, h;
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
config_view_size_set(vd->cd, w, h);
2013-07-20 01:51:56 -07:00
stats_view_size_update(vd->sd);
}
static void
rect_mouse_move_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info)
2013-07-20 01:51:56 -07:00
{
view_data *vd = data;
if (!config_stats_bar_get(vd->cd)) return;
2013-07-20 01:51:56 -07:00
Evas_Event_Mouse_Move *ev = event_info;
Evas_Coord x, y, w, h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
stats_cursor_pos_update(vd->sd, ev->cur.canvas.x - x, ev->cur.canvas.y - y,
(float) (ev->cur.canvas.x - x) / (float) w,
(float) (ev->cur.canvas.y - y) / (float) h);
}
static Evas_Object *
view_scroller_create(Evas_Object *parent)
{
Evas_Object *scroller = elm_scroller_add(parent);
elm_object_focus_allow_set(scroller, EINA_FALSE);
evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(scroller);
return scroller;
}
static void
edje_change_file_cb(void *data, Evas_Object *obj EINA_UNUSED,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
{
view_data *vd = data;
if (!edje_object_file_set(vd->layout, config_edj_path_get(vd->cd),
vd->group_name))
{
vd->del_cb(vd->data);
view_term(vd);
return;
}
view_part_highlight_set(vd, vd->part_name);
}
2013-07-20 01:51:56 -07:00
static void
layout_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
Evas_Coord x, y, w, h;
Evas_Object *rect = data;
evas_object_geometry_get(obj, &x, &y, &w, &h);
evas_object_move(rect, x, y);
evas_object_resize(rect, w, h);
}
static void
layout_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *rect = data;
evas_object_del(rect);
}
2013-09-06 03:11:39 -07:00
static void
event_layer_set(view_data *vd)
{
Evas *e = evas_object_evas_get(vd->layout);
Evas_Object *rect = evas_object_rectangle_add(e);
evas_object_repeat_events_set(rect, EINA_TRUE);
evas_object_color_set(rect, 0, 0, 0, 0);
evas_object_show(rect);
evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE,
layout_geom_cb, rect);
evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_MOVE,
layout_geom_cb, rect);
evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_DEL,
layout_del_cb, rect);
evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_MOVE,
rect_mouse_move_cb, vd);
}
2013-07-20 01:51:56 -07:00
static Evas_Object *
view_obj_create(view_data *vd, const char *file_path, const char *group)
{
Evas *e = evas_object_evas_get(vd->scroller);
Evas_Object *layout = edje_edit_object_add(e);
if (!edje_object_file_set(layout, file_path, group))
{
//FIXME: more optimized way?
vd->timer = ecore_timer_add(1, file_set_timer_cb, vd);
}
2013-07-20 01:51:56 -07:00
evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
EVAS_HINT_EXPAND);
evas_object_event_callback_add(layout, EVAS_CALLBACK_RESIZE,
layout_resize_cb, vd);
edje_object_signal_callback_add(layout,
"edje,change,file", "edje",
edje_change_file_cb, vd);
2013-07-20 01:51:56 -07:00
evas_object_show(layout);
return layout;
}
static Eina_Bool
view_obj_idler_cb(void *data)
{
view_data *vd = data;
2013-09-19 05:05:22 -07:00
vd->layout = view_obj_create(vd, config_edj_path_get(vd->cd),
2013-07-20 01:51:56 -07:00
vd->group_name);
event_layer_set(vd);
2013-07-20 01:51:56 -07:00
elm_object_content_set(vd->scroller, vd->layout);
2013-09-12 06:14:16 -07:00
if (vd->dummy_on)
dummy_obj_new(vd->layout);
2013-07-20 01:51:56 -07:00
vd->idler = NULL;
if (vd->part_name) view_part_highlight_set(vd, vd->part_name);
2013-07-20 01:51:56 -07:00
return ECORE_CALLBACK_CANCEL;
}
void
view_dummy_toggle(view_data *vd, Eina_Bool msg)
{
2013-09-12 06:14:16 -07:00
Eina_Bool dummy_on = config_dummy_swallow_get(vd->cd);
if (dummy_on == vd->dummy_on) return;
if (dummy_on)
{
if (msg) stats_info_msg_update(vd->sd, "Dummy Swallow Enabled.");
dummy_obj_new(vd->layout);
}
else
{
if (msg) stats_info_msg_update(vd->sd, "Dummy Swallow Disabled.");
dummy_obj_del(vd->layout);
}
2013-09-12 06:14:16 -07:00
vd->dummy_on = dummy_on;
}
2013-07-20 01:51:56 -07:00
view_data *
view_init(Evas_Object *parent, const char *group, stats_data *sd,
config_data *cd, void (*del_cb)(void *data), void *data)
2013-07-20 01:51:56 -07:00
{
view_data *vd = calloc(1, sizeof(view_data));
vd->parent = parent;
vd->sd = sd;
vd->cd = cd;
2013-07-20 01:51:56 -07:00
vd->scroller = view_scroller_create(parent);
2013-09-12 06:14:16 -07:00
vd->dummy_on = config_dummy_swallow_get(cd);
2013-07-20 01:51:56 -07:00
vd->group_name = eina_stringshare_add(group);
vd->idler = ecore_idler_add(view_obj_idler_cb, vd);
vd->del_cb = del_cb;
vd->data = data;
view_part_highlight_set(vd, NULL);
2013-07-20 01:51:56 -07:00
return vd;
}
void
view_term(view_data *vd)
{
if (!vd) return;
2013-07-20 01:51:56 -07:00
if (vd->group_name) eina_stringshare_del(vd->group_name);
if (vd->part_name) eina_stringshare_del(vd->part_name);
if (vd->part_obj)
evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_DEL,
part_obj_del_cb);
evas_object_del(vd->scroller);
if (vd->idler) ecore_idler_del(vd->idler);
if (vd->timer) ecore_timer_del(vd->timer);
2013-07-20 01:51:56 -07:00
free(vd);
}
Evas_Object *
view_obj_get(view_data *vd)
{
return vd->scroller;
}
void
view_program_run(view_data *vd, const char *program)
{
2013-09-18 21:42:34 -07:00
if (!vd) return;
if (!program || !vd->layout) return;
edje_edit_program_run(vd->layout, program);
char buf[256];
snprintf(buf, sizeof(buf), "Program Run: \"%s\"", program);
stats_info_msg_update(vd->sd, buf);
}
2013-07-20 01:51:56 -07:00
void
view_part_highlight_set(view_data *vd, const char *part_name)
{
2013-10-03 08:44:21 -07:00
if (!vd) return;
if (!vd->layout)
{
if (vd->idler) vd->part_name = eina_stringshare_add(part_name);
return;
}
2013-07-20 01:51:56 -07:00
if (!part_name)
{
if (vd->part_highlight)
{
evas_object_del(vd->part_highlight);
vd->part_highlight = NULL;
}
if (vd->part_name)
{
eina_stringshare_del(vd->part_name);
vd->part_name = NULL;
}
return;
}
if (vd->part_obj && (vd->part_name == part_name)) return;
//Delete the previous part callbacks
if (vd->part_obj)
{
evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_RESIZE,
part_obj_geom_cb);
evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_MOVE,
part_obj_geom_cb);
evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_DEL,
part_obj_del_cb);
}
Evas_Object *part_obj =
(Evas_Object *) edje_object_part_object_get(vd->layout, part_name);
2013-07-20 01:51:56 -07:00
if (!part_obj) return;
evas_object_event_callback_add(part_obj, EVAS_CALLBACK_RESIZE,
part_obj_geom_cb, vd);
evas_object_event_callback_add(part_obj, EVAS_CALLBACK_MOVE,
part_obj_geom_cb, vd);
evas_object_event_callback_add(part_obj, EVAS_CALLBACK_DEL, part_obj_del_cb,
vd);
vd->part_obj = part_obj;
eina_stringshare_replace(&vd->part_name, part_name);
part_obj_geom_cb(vd, evas_object_evas_get(vd->layout), part_obj, NULL);
2013-07-20 01:51:56 -07:00
}
Eina_Stringshare *
view_group_name_get(view_data *vd)
{
return vd->group_name;
}
void *
view_data_get(view_data *vd)
{
return vd->data;
}