forked from enlightenment/enlightenment
Use the new e_fm_operation_registry infrastructure to show file operation progress in efm
SVN revision: 39682
This commit is contained in:
parent
4c074624bf
commit
9d6e1a6542
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue