edj_viewer: track the images and update live view whenever they were modified.

This commit is contained in:
ChunEon Park 2015-07-01 16:20:28 +09:00
parent fe2ad1f07b
commit 976685ae10
1 changed files with 90 additions and 3 deletions

View File

@ -25,8 +25,12 @@ struct viewer_s
Ecore_Idler *idler;
Ecore_Animator *animator;
Ecore_Timer *timer;
Eio_Monitor *edj_monitor;
Ecore_Event_Handler *monitor_event;
Eina_List *img_monitors;
Eio_Monitor *img_monitor;
Ecore_Event_Handler *edj_monitor_event;
Ecore_Event_Handler *img_monitor_event;
Ecore_Event_Handler *exe_del_event;
void (*del_cb)(void *data);
void *data;
@ -41,6 +45,40 @@ struct viewer_s
/* Internal method implementation */
/*****************************************************************************/
static Eina_Bool
img_changed_animator_cb(void *data)
{
view_data *vd = data;
Eina_File *file = eina_file_open(eio_monitor_path_get(vd->img_monitor),
EINA_FALSE);
if (!file) return ECORE_CALLBACK_RENEW;
vd->edj_reload_need = EINA_TRUE;
vd->timer = NULL;
vd->img_monitor = NULL;
build_edc();
eina_file_close(file);
return ECORE_CALLBACK_CANCEL;
}
static Eina_Bool
img_changed_cb(void *data, int type EINA_UNUSED, void *event)
{
view_data *vd = data;
Eio_Monitor_Event *ev = event;
Eina_List *l;
Eio_Monitor *monitor = NULL;
EINA_LIST_FOREACH(vd->img_monitors, l, monitor)
{
if (ev->monitor != monitor) continue;
vd->img_monitor = monitor;
ecore_timer_del(vd->timer);
vd->timer = ecore_timer_add(0.025, img_changed_animator_cb, vd);
return ECORE_CALLBACK_DONE;
}
return ECORE_CALLBACK_PASS_ON;
}
static void
view_obj_min_update(view_data *vd)
{
@ -53,6 +91,44 @@ view_obj_min_update(view_data *vd)
((double)vd->view_config_size.h * scale));
}
static void
view_images_monitor_set(view_data *vd)
{
Eina_List *l, *l2;
char *path, *img;
char buf[PATH_MAX];
Eio_Monitor *monitor;
//Free the previous monitors
EINA_LIST_FREE(vd->img_monitors, monitor)
eio_monitor_del(monitor);
Eina_List *imgs = edje_edit_images_list_get(vd->layout);
Eina_List *paths = build_path_get(ENVENTOR_PATH_TYPE_IMAGE);
Eina_List *imgs_pathes = NULL;
//List up new image pathes and add monitors
EINA_LIST_FOREACH(imgs, l, img)
{
EINA_LIST_FOREACH(paths, l2, path)
{
if (path[strlen(path) - 1] == '/')
snprintf(buf, sizeof(buf), "%s%s", path, img);
else
snprintf(buf, sizeof(buf), "%s/%s", path, img);
if (ecore_file_exists(buf))
{
monitor = eio_monitor_add(buf);
vd->img_monitors = eina_list_append(vd->img_monitors,
monitor);
}
}
}
edje_edit_string_list_free(imgs);
}
static void
view_obj_create_post_job(view_data *vd)
{
@ -62,6 +138,7 @@ view_obj_create_post_job(view_data *vd)
view_obj_min_update(vd);
evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_LOADED,
(void*)edj_mgr_obj_get());
view_images_monitor_set(vd);
}
static Eina_Bool
@ -210,6 +287,7 @@ exe_del_event_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
return ECORE_CALLBACK_DONE;
}
view_images_monitor_set(vd);
view_obj_min_update(vd);
view_part_highlight_set(vd, vd->part_name);
dummy_obj_update(vd->layout);
@ -377,8 +455,10 @@ view_init(Evas_Object *enventor, const char *group,
vd->data = data;
view_part_highlight_set(vd, NULL);
vd->monitor_event =
vd->edj_monitor_event =
ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, edj_changed_cb, vd);
vd->img_monitor_event =
ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, img_changed_cb, vd);
/* Is this required?? Suddenly, something is changed and
it won't successful with EIO_MONITOR_FILE_MODIFIED to reload the edj file
@ -407,8 +487,15 @@ view_term(view_data *vd)
evas_object_del(vd->scroller);
ecore_idler_del(vd->idler);
ecore_animator_del(vd->animator);
ecore_timer_del(vd->timer);
eio_monitor_del(vd->edj_monitor);
ecore_event_handler_del(vd->monitor_event);
Eio_Monitor *monitor;
EINA_LIST_FREE(vd->img_monitors, monitor)
eio_monitor_del(monitor);
ecore_event_handler_del(vd->edj_monitor_event);
ecore_event_handler_del(vd->img_monitor_event);
ecore_event_handler_del(vd->exe_del_event);
free(vd);