From 9d6e1a65424d09722e886038016f6efcce36b015 Mon Sep 17 00:00:00 2001 From: Davide Andreoli Date: Tue, 24 Mar 2009 14:52:06 +0000 Subject: [PATCH] Use the new e_fm_operation_registry infrastructure to show file operation progress in efm SVN revision: 39682 --- src/modules/fileman/e_fwin.c | 233 ++++++++++++++++++----------------- src/modules/fileman/e_fwin.h | 1 - 2 files changed, 120 insertions(+), 114 deletions(-) diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c index e346b73a7..422e2b096 100644 --- a/src/modules/fileman/e_fwin.c +++ b/src/modules/fileman/e_fwin.c @@ -45,7 +45,10 @@ struct _E_Fwin E_Toolbar *tbar; Ecore_Event_Handler *zone_handler; Ecore_Event_Handler *zone_del_handler; - + + Ecore_Event_Handler *fm_op_entry_add_handler; + Ecore_Event_Handler *fm_op_entry_del_handler; + unsigned char geom_save_ready : 1; }; @@ -76,8 +79,6 @@ static void _e_fwin_cb_delete(E_Win *win); static void _e_fwin_cb_move(E_Win *win); static void _e_fwin_cb_resize(E_Win *win); static void _e_fwin_deleted(void *data, Evas_Object *obj, void *event_info); -static int _e_fwin_ipc_progress_data(void *data __UNUSED__, int type __UNUSED__, void *event); -static void _e_fwin_progress_update(E_Fwin *fwin, int slave_id, int percent, int seconds, size_t done, size_t total, char *src, char *dst); static const char *_e_fwin_custom_file_path_eval(E_Fwin *fwin, Efreet_Desktop *ef, const char *prev_path, const char *key); static void _e_fwin_changed(void *data, Evas_Object *obj, void *event_info); static void _e_fwin_selected(void *data, Evas_Object *obj, void *event_info); @@ -113,9 +114,13 @@ static void _e_fwin_toolbar_resize(E_Fwin *fwin); static int _e_fwin_dlg_cb_desk_sort(Efreet_Desktop *d1, Efreet_Desktop *d2); static int _e_fwin_dlg_cb_desk_list_sort(const void *data1, const void *data2); +static void _e_fwin_op_registry_listener_cb(void *data, const E_Fm2_Op_Registry_Entry *ere); +static int _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event); +static int _e_fwin_op_registry_entry_del_cb(void *data, int type, void *event); +static void _e_fwin_op_registry_entry_iter(E_Fwin *fwin); + /* local subsystem globals */ static Eina_List *fwins = NULL; -static Ecore_Event_Handler *ipc = NULL; /* externally accessible functions */ EAPI int @@ -131,7 +136,6 @@ e_fwin_shutdown(void) { E_Fwin *fwin; - if (ipc) ecore_event_handler_del(ipc); //FIXME this is never called EINA_LIST_FREE(fwins, fwin) e_object_del(E_OBJECT(fwin)); @@ -316,18 +320,106 @@ e_fwin_zone_find(E_Zone *zone) return 0; } -EAPI void -e_fwin_progress_update_all(int slave_id, int percent, int seconds, size_t done, size_t total, char *src, char *dst) -{ - Eina_List *l; - E_Fwin *fwin; - EINA_LIST_FOREACH(fwins, l, fwin) - _e_fwin_progress_update(fwin, slave_id, percent, seconds, done, total, src, dst); +/* e_fm_op_registry */ + +#define CONF_ALIGN_X 1.0 //TODO need to make this a config option +#define CONF_ALIGN_Y 1.0 + +static void +_e_fwin_op_registry_listener_cb(void *data, const E_Fm2_Op_Registry_Entry *ere) +{ + Evas_Object *o = data; + char buf[PATH_MAX]; + char *dir; + + // Update element + edje_object_part_drag_size_set(o, "e.gauge.bar", 0.0, ((double)(ere->percent)) / 100); + + snprintf(buf, PATH_MAX, "Progress from slave #%d", ere->id); + edje_object_part_text_set(o, "e.text.label1", buf); + snprintf(buf, PATH_MAX, _("Done %ld / %ld byte"), ere->done, ere->total); + edje_object_part_text_set(o, "e.text.label2", buf); + if (!ere->finished) + snprintf(buf, PATH_MAX, _("Done %d%% - left ?? sec"), ere->percent); + else + snprintf(buf, PATH_MAX, _("Complete")); + edje_object_part_text_set(o, "e.text.label3", buf); + edje_object_part_text_set(o, "e.text.label4", ecore_file_file_get(ere->src)); + //~ dir = ecore_file_dir_get(ere->dst); + //~ edje_object_part_text_set(o, "e.text.label5", dir); + //~ E_FREE(dir); + + //evas_object_raise(fwin->box_obj); //TODO use layer?? +} + +static int +_e_fwin_op_registry_entry_add_cb(void *data, int type, void *event) +{ + E_Fm2_Op_Registry_Entry *ere = (E_Fm2_Op_Registry_Entry *)event; + E_Fwin *fwin = data; + Evas_Object *o; + int mw, mh; + + o = edje_object_add(e_win_evas_get(fwin->win)); + e_theme_edje_object_set(o, "base/theme/fileman", + "e/fileman/default/progress"); + evas_object_data_set(o, "e_fwin_ere", ere); + edje_object_size_min_get(o, &mw, &mh); + evas_object_resize(o, mw * e_scale, mh * e_scale); + //evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + // _size_hint_changed_cb, NULL); + evas_object_show(o); + + // Append the element to the box + evas_object_box_append(fwin->box_obj, o); + evas_object_size_hint_align_set(o, CONF_ALIGN_X, CONF_ALIGN_Y); + + //Listen to progress changes + e_fm2_op_registry_entry_listener_add(ere, _e_fwin_op_registry_listener_cb, + o, NULL); + + return ECORE_CALLBACK_RENEW; +} + +static int +_e_fwin_op_registry_entry_del_cb(void *data, int type, void *event) +{ + const E_Fm2_Op_Registry_Entry *ere = event; + E_Fwin *fwin = data; + Evas_Object *o; + Eina_List *l; + + // Search the element + EINA_LIST_FOREACH(evas_object_box_children_get(fwin->box_obj), l, o) + { + if (evas_object_data_get(o, "e_fwin_ere") == ere) + break; + else + o = NULL; + } + + // Delete the element //TODO delay hide by some seconds + if (o) + { + evas_object_box_remove(fwin->box_obj, o); + evas_object_del(o); + } + return ECORE_CALLBACK_RENEW; +} + +static void +_e_fwin_op_registry_entry_iter(E_Fwin *fwin) +{ + Eina_Iterator *itr; + E_Fm2_Op_Registry_Entry *ere; + + itr = e_fm2_op_registry_iterator_new(); + EINA_ITERATOR_FOREACH(itr, ere) + _e_fwin_op_registry_entry_add_cb(fwin, 0, ere); + eina_iterator_free(itr); } -#define CONF_ALIGN_X 1.0 -#define CONF_ALIGN_Y 1.0 /* local subsystem functions */ static E_Fwin * _e_fwin_new(E_Container *con, const char *dev, const char *path) @@ -447,9 +539,14 @@ _e_fwin_new(E_Container *con, const char *dev, const char *path) eina_stringshare_add("system-file-manager"); } - if (!ipc) - ipc = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, - _e_fwin_ipc_progress_data, NULL); + fwin->fm_op_entry_add_handler = + ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_ADD, + _e_fwin_op_registry_entry_add_cb, fwin); + fwin->fm_op_entry_del_handler = + ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_DEL, + _e_fwin_op_registry_entry_del_cb, fwin); + _e_fwin_op_registry_entry_iter(fwin); + return fwin; } @@ -472,7 +569,12 @@ _e_fwin_free(E_Fwin *fwin) ecore_event_handler_del(fwin->zone_handler); if (fwin->zone_del_handler) ecore_event_handler_del(fwin->zone_del_handler); - + + if (fwin->fm_op_entry_add_handler) + ecore_event_handler_del(fwin->fm_op_entry_add_handler); + if (fwin->fm_op_entry_del_handler) + ecore_event_handler_del(fwin->fm_op_entry_del_handler); + fwins = eina_list_remove(fwins, fwin); if (fwin->wallpaper_file) eina_stringshare_del(fwin->wallpaper_file); if (fwin->overlay_file) eina_stringshare_del(fwin->overlay_file); @@ -566,101 +668,6 @@ _e_fwin_deleted(void *data, Evas_Object *obj, void *event_info) e_object_del(E_OBJECT(fwin)); } -static int -_e_fwin_ipc_progress_data(void *data __UNUSED__, int type __UNUSED__, void *event) -{ - Ecore_Ipc_Event_Client_Data *e = event; - int percent, seconds; - size_t done, total; - char *src = NULL; - char *dst = NULL; - void *p; - - if (!(e->major == E_IPC_DOMAIN_FM && e->minor == E_FM_OP_PROGRESS)) - return 0; - if (!e->data) return 0; - - p = e->data; -#define UP(value, type) (value) = *(type *)p; p += sizeof(type) - UP(percent, int); - UP(seconds, int); - UP(done, size_t); - UP(total, size_t); -#undef UP - src = p; - dst = p + strlen(src) + 1; - //printf("%s:%s(%d) Progress from slave #%d:\n\t%d%% done,\n\t%d seconds left,\n\t%d done,\n\t%d total,\n\tsrc = %s,\n\tdst = %s.\n", __FILE__, __FUNCTION__, __LINE__, e->ref, percent, seconds, done, total, src, dst); - e_fwin_progress_update_all(e->ref, percent, seconds, done, total, src, dst); - - return 1; -} - -static void -_e_fwin_progress_update(E_Fwin *fwin, int slave_id, int percent, int seconds, size_t done, size_t total, char *src, char *dst) -{ - Evas_Object *o = NULL; - Eina_List *l; - char buf[PATH_MAX]; - char *dir; - int mw, mh, id; - - if (!fwin || !fwin->box_obj) return; - - // Search for existing progress object - EINA_LIST_FOREACH(evas_object_box_children_get(fwin->box_obj), l, o) - { - id = (int)evas_object_data_get(o, "e_fm_prog_id"); - if (id == slave_id) - break; - else - o = NULL; - } - - // Not found. Create a new one - if (!o) - { - o = edje_object_add(e_win_evas_get(fwin->win)); - e_theme_edje_object_set(o, "base/theme/fileman", - "e/fileman/default/progress"); - evas_object_data_set(o, "e_fm_prog_id", (void*)slave_id); - edje_object_size_min_get(o, &mw, &mh); - evas_object_resize(o, mw * e_scale, mh * e_scale); - //evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - // _size_hint_changed_cb, NULL); - evas_object_show(o); - - // Append the element to the box - evas_object_box_append(fwin->box_obj, o); - evas_object_size_hint_align_set(o, CONF_ALIGN_X, CONF_ALIGN_Y); - } - - // Update element - edje_object_part_drag_size_set(o, "e.gauge.bar", 0.0, ((double)(percent)) / 100); - - snprintf(buf, PATH_MAX, "Progress from slave #%d", slave_id); - edje_object_part_text_set(o, "e.text.label1", buf); - snprintf(buf, PATH_MAX, _("Done %ld / %ld byte"), done, total); - edje_object_part_text_set(o, "e.text.label2", buf); - if (percent < 100) - snprintf(buf, PATH_MAX, _("Done %d%% - left %d sec"), percent, seconds); - else - snprintf(buf, PATH_MAX, _("Complete")); - edje_object_part_text_set(o, "e.text.label3", buf); - edje_object_part_text_set(o, "e.text.label4", ecore_file_file_get(src)); - dir = ecore_file_dir_get(dst); - edje_object_part_text_set(o, "e.text.label5", dir); - E_FREE(dir); - - evas_object_raise(fwin->box_obj); //TODO use layer?? - - if (percent == 100) //TODO delay hide by some seconds - { - // Delete the element - evas_object_box_remove(fwin->box_obj, o); - evas_object_del(o); - } -} - static const char * _e_fwin_custom_file_path_eval(E_Fwin *fwin, Efreet_Desktop *ef, const char *prev_path, const char *key) { diff --git a/src/modules/fileman/e_fwin.h b/src/modules/fileman/e_fwin.h index 5b0af39ad..70f304643 100644 --- a/src/modules/fileman/e_fwin.h +++ b/src/modules/fileman/e_fwin.h @@ -15,7 +15,6 @@ EAPI void e_fwin_zone_shutdown (E_Zone *zone); EAPI void e_fwin_all_unsel (void *data); EAPI void e_fwin_reload_all (void); EAPI int e_fwin_zone_find (E_Zone *zone); -EAPI void e_fwin_progress_update_all(int slave_id, int percent, int seconds, size_t done, size_t total, char *src, char *dst); #endif #endif