Use the new e_fm_operation_registry infrastructure to show file operation progress in efm

SVN revision: 39682
This commit is contained in:
Davide Andreoli 2009-03-24 14:52:06 +00:00
parent 4c074624bf
commit 9d6e1a6542
2 changed files with 120 additions and 114 deletions

View File

@ -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)
{

View File

@ -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