From 8510d3dcf1e2fe360dae2178c3536ebe9d08bd33 Mon Sep 17 00:00:00 2001 From: jlzapata Date: Thu, 16 Feb 2006 03:13:30 +0000 Subject: [PATCH] efm: - two more states for the fileman edje, hover - unhover - implemented hover functions when dragging - relative actions / default relative action in place (not working yet) - there is SERIOUS BUG when using multiple windows of efm, when dragging or using the band on 2+ windows for the first time segvs, i think this was also before my changes. - still there are lots of things to be coded, dont expect to work cleanly yet SVN revision: 20511 --- data/themes/default_fileman.edc | 23 ++ src/bin/e_fileman_mime.c | 2 +- src/bin/e_fileman_mime.h | 1 + src/bin/e_fileman_smart.c | 578 +++++++++++++++++++------------- src/bin/e_fileman_smart.h | 43 ++- 5 files changed, 397 insertions(+), 250 deletions(-) diff --git a/data/themes/default_fileman.edc b/data/themes/default_fileman.edc index cd9dc1e86..00bcf53f4 100644 --- a/data/themes/default_fileman.edc +++ b/data/themes/default_fileman.edc @@ -1129,6 +1129,11 @@ group { inherit: "default" 0.0; color: 10 10 10 30; } + description { + state: "hover" 0.0; + inherit: "default" 0.0; + color: 10 10 10 30; + } } part { name: "icon_box"; @@ -1264,6 +1269,24 @@ group { target: "icon_title"; target: "icon_overlay"; } + program { + name: "hover"; + signal: "hover"; + source: ""; + action: STATE_SET "hover" 0.0; + transition: LINEAR 0.2; + target: "icon_title"; + target: "icon_overlay"; + } + program { + name: "unhover"; + signal: "unhover"; + source: ""; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.2; + target: "icon_title"; + target: "icon_overlay"; + } } } diff --git a/src/bin/e_fileman_mime.c b/src/bin/e_fileman_mime.c index e227a8027..cada37d1f 100644 --- a/src/bin/e_fileman_mime.c +++ b/src/bin/e_fileman_mime.c @@ -349,7 +349,7 @@ e_fm_mime_action_call(E_Fm_Smart_Data *sd, E_Fm_Mime_Action *action) } else { - command = _e_fm_mime_string_tokenizer(sd->operation.files,sd->operation.dir,action->cmd); + command = _e_fm_mime_string_tokenizer(sd->operation.files,sd->operation.hover,action->cmd); printf("going to execute %s\n", command); exe = ecore_exe_run(command, NULL); diff --git a/src/bin/e_fileman_mime.h b/src/bin/e_fileman_mime.h index ae4d81ab6..0161017bc 100644 --- a/src/bin/e_fileman_mime.h +++ b/src/bin/e_fileman_mime.h @@ -30,6 +30,7 @@ struct _E_Fm_Mime_Entry int level; /* the level on the three for easy search/comparsion */ E_Fm_Mime_Entry *parent; E_Fm_Mime_Action *action_default; /* the default action also exists on the actions list */ + E_Fm_Mime_Action *action_default_relative; Evas_List *actions; /* the autodetect features */ char *suffix; diff --git a/src/bin/e_fileman_smart.c b/src/bin/e_fileman_smart.c index ce99fcec9..324c9ce1f 100644 --- a/src/bin/e_fileman_smart.c +++ b/src/bin/e_fileman_smart.c @@ -3,6 +3,16 @@ */ #include "e.h" +/* mouse use + * ========= + * + * + * + * + * + */ + + /* TODO: * * - if we resize efm while we're generating files, we crash @@ -2125,6 +2135,7 @@ _e_fm_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) evas_object_hide(sd->selection.band.obj); sd->selection.band.files = evas_list_free(sd->selection.band.files); } + printf("mouse up on the window\n"); } static void @@ -2151,57 +2162,11 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info icon->sd->operation.files = NULL; _e_fm_selections_clear(icon->sd); _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); - icon->sd->operation.dir = icon->sd->dir; + icon->sd->operation.hover = NULL; icon->sd->operation.files = evas_list_append(icon->sd->operation.files, icon->file); icon->sd->operation.mime = icon->file->mime; e_fm_mime_action_default_call(icon->sd); } - - -#if 0 - if (icon->file->type == E_FM_FILE_TYPE_DIRECTORY && (ev->flags == EVAS_BUTTON_DOUBLE_CLICK)) - { - char *fullname; - - if(icon->sd->win) - icon->sd->drag.start = 0; - - if (!strcmp(icon->file->name, ".")) return; /* this case cant happen!? */ - - if (!strcmp(icon->file->name, "..")) - { - fullname = _e_fm_dir_pop(icon->sd->dir); - } - else - { - fullname = strdup(icon->file->path); - } - - /* FIXME: we need to fix this, uber hack alert */ - if (fullname) - { - if (icon->sd->win) - e_win_title_set(icon->sd->win, fullname); - _e_fm_dir_set(icon->sd, fullname); - free(fullname); - } - } - else if (icon->file->type == E_FM_FILE_TYPE_FILE && (ev->flags == EVAS_BUTTON_DOUBLE_CLICK)) - { - if(icon->sd->win) - icon->sd->drag.start = 0; - - if(icon->sd->is_selector) - { - _e_fm_selector_send_file(icon); - return; - } - - /*if ((!e_fm_file_assoc_exec(icon->file)) && - (e_fm_file_can_exec(icon->file))) - e_fm_file_exec(icon->file);*/ - } -#endif else { if(icon->sd->is_selector && icon->file->type == E_FM_FILE_TYPE_FILE) @@ -2213,8 +2178,8 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info evas_object_geometry_get(icon->icon_obj, &x, &y, NULL, NULL); - icon->sd->drag.start = 1; - icon->sd->drag.doing = 0; + icon->sd->drag.status = E_FILEMAN_DRAG_START; + icon->sd->drag.button = E_FILEMAN_DRAG_PRIMARY; icon->sd->drag.x = ev->canvas.x; icon->sd->drag.y = ev->canvas.y; icon->sd->drag.icon_obj = icon; @@ -2235,8 +2200,8 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info evas_object_geometry_get(icon->icon_obj, &x, &y, NULL, NULL); - icon->sd->drag.start = 1; - icon->sd->drag.doing = 0; + icon->sd->drag.status = E_FILEMAN_DRAG_START; + icon->sd->drag.button = E_FILEMAN_DRAG_SECONDARY; icon->sd->drag.x = ev->canvas.x; icon->sd->drag.y = ev->canvas.y; icon->sd->drag.icon_obj = icon; @@ -2260,7 +2225,7 @@ _e_fm_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) ev = event_info; icon = data; - + if(!strcmp(edje_object_part_state_get(icon->sd->edje_obj, "typebuffer", NULL), "shown")) { E_Fm_Icon *i; @@ -2274,72 +2239,95 @@ _e_fm_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) edje_object_signal_emit(icon->sd->edje_obj, "default", ""); } - if(icon->sd->win) - icon->sd->drag.start = 0; - switch(ev->button) { - - /* selection */ case 1: - /* the xdnd_drop will handle this case */ - if(icon->sd->drag.doing) - break; - - /* if we arent doing a drag its a simple mouse out */ - if (!icon->state.selected) - { - if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control")) - _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); - else - { - _e_fm_selections_clear(icon->sd); - _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); - } - } - else - { - if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control")) - _e_fm_selections_del(icon); - else - { - _e_fm_selections_clear(icon->sd); - _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); - } - } + /* selection */ + if(icon->sd->drag.status == E_FILEMAN_DRAG_START) + { + if (!icon->state.selected) + { + if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control")) + _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); + else + { + _e_fm_selections_clear(icon->sd); + _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); + } + } + else + { + if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control")) + _e_fm_selections_del(icon); + else + { + _e_fm_selections_clear(icon->sd); + _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); + } + } + icon->sd->drag.status = E_FILEMAN_DRAG_NONE; + } + else if(icon->sd->drag.status == E_FILEMAN_DRAG_DOING) + { + icon->sd->drag.button = E_FILEMAN_DRAG_PRIMARY; + } + /* relative action */ + else if(icon->sd->drag.status == E_FILEMAN_DRAG_DONE) + { + printf("call the default relative action\n"); + } break; - /* action / context */ + case 3: - /* the xdnd_drop will handle this case */ - if(icon->sd->drag.doing) - break; - - /* Free file list before recreating */ - while (icon->sd->operation.files) - { - E_Fm_File *file; + /* action menu */ + if(icon->sd->drag.status == E_FILEMAN_DRAG_START) + { + if (!icon->state.selected) + { + if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control")) + _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); + else + { + _e_fm_selections_clear(icon->sd); + _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); + } + } + /* Free file list before recreating */ + while (icon->sd->operation.files) + { + E_Fm_File *file; - file = icon->sd->operation.files->data; - icon->sd->operation.files = evas_list_remove_list( + file = icon->sd->operation.files->data; + icon->sd->operation.files = evas_list_remove_list( icon->sd->operation.files, icon->sd->operation.files); /* * FIXME: should this be freed, it looks like we just need to free the list here? * e_object_del(E_OBJECT(file)); */ - } - - /* set the operation files equal to the selected icons */ - for(l = icon->sd->selection.icons; l; l = l->next) + } + /* set the operation files equal to the selected icons */ + for(l = icon->sd->selection.icons; l; l = l->next) + { + E_Fm_Icon *ic; + ic = (E_Fm_Icon *)l->data; + icon->sd->operation.files = evas_list_append(icon->sd->operation.files, ic->file); + } + /* get the overall mime entry for the selected files */ + icon->sd->operation.hover = NULL; + icon->sd->operation.mime = e_fm_mime_get_from_list(icon->sd->operation.files); + icon->sd->drag.status = E_FILEMAN_DRAG_NONE; + _e_fm_menu_action_display(icon->sd, ev->output.x, ev->output.y, ev->timestamp); + } + else if(icon->sd->drag.status == E_FILEMAN_DRAG_DOING) + { + icon->sd->drag.button = E_FILEMAN_DRAG_SECONDARY; + } + /* context menu */ + else if(icon->sd->drag.status == E_FILEMAN_DRAG_DONE) { - E_Fm_Icon *ic; - - ic = (E_Fm_Icon *)l->data; - icon->sd->operation.files = evas_list_append(icon->sd->operation.files, ic->file); + printf("popping up the context menu\n"); + //_e_fm_menu_context_display(icon->sd, ev->output.x, ev->output.y, ev->timestamp); } - /* get the overall mime entry for the selected files */ - icon->sd->operation.dir = icon->sd->dir; - icon->sd->operation.mime = e_fm_mime_get_from_list(icon->sd->operation.files); - _e_fm_menu_action_display(icon->sd, ev->output.x, ev->output.y, ev->timestamp); break; default: @@ -2381,12 +2369,14 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info ev = event_info; sd = data; + + //printf("icon mouse move\n"); if(sd->win) icon = sd->drag.icon_obj; if (!icon) return; - if (sd->drag.start && sd->win) + if ((sd->drag.status == E_FILEMAN_DRAG_START) && sd->win) { if ((sd->drag.x == -1) && (sd->drag.y == -1)) { @@ -2412,9 +2402,8 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info char *tmp; char **drop_types = NULL; - - icon->sd->drag.doing = 1; - + + //printf("creating a new fake window\n"); _e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon)); data = calloc(PATH_MAX, sizeof(char)); @@ -2422,8 +2411,7 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info drop_types = calloc(1,sizeof(char*)); drop_types[0] = strdup("text/uri-list"); - - + /* send the dragged signal to all the selected icons */ for(l = sd->selection.icons, i = 0; l; l = l->next, i++) { @@ -2457,6 +2445,7 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info sd->drag.ecore_evas = ecore_evas_software_x11_new(NULL, 0, cx + x, cy + y, w, h); sd->drag.evas = ecore_evas_get(sd->drag.ecore_evas); sd->drag.win = ecore_evas_software_x11_window_get(sd->drag.ecore_evas); + sd->drag.status = E_FILEMAN_DRAG_DOING; ecore_evas_shaped_set(sd->drag.ecore_evas, 1); ecore_evas_borderless_set(sd->drag.ecore_evas, 1); @@ -2481,9 +2470,6 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info ecore_x_dnd_types_set(sd->drag.win, drop_types, 1); ecore_x_dnd_begin(sd->drag.win, data, PATH_MAX * sizeof(char)); - sd->drag.start = 0; - - e_fm_drag_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _e_fm_drag_mouse_move_cb, sd); @@ -2504,7 +2490,8 @@ _e_fm_icon_autoscroll_cb (void *data) sd = data; - /*if(sd->autoscroll.direction & E_FILEMAN_AUTOSCROLL_UP) +#if 0 + if(sd->autoscroll.direction & E_FILEMAN_AUTOSCROLL_UP) { sd->child.y -= sd->autoscroll.timer_int; if(sd->child.y < 0) sd->child.y = 0; @@ -2536,7 +2523,7 @@ _e_fm_icon_autoscroll_cb (void *data) evas_object_move(sd->layout, sd->x - sd->child.x, sd->y - sd->child.y); e_icon_canvas_xy_thaw(sd->layout); evas_object_smart_callback_call(sd->object, "changed", NULL);*/ - +#endif return 1; } @@ -3262,6 +3249,9 @@ static int _e_fm_xdnd_enter_cb(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Enter *ev; + Evas *e; + Evas_Object *eo; + Evas_Smart *s; E_Fm_Smart_Data *sd; ev = event; @@ -3269,19 +3259,6 @@ _e_fm_xdnd_enter_cb(void *data, int type, void *event) if (ev->win != sd->win->evas_win) return 1; - - if (ev->win == sd->win->evas_win) - { - if(sd->drag.doing) - { - //e_fm_icon_signal_emit(icon->icon_obj, "default", ""); - } - else - { - /* split the data from the drop and - * create E_Fm_Files for all the uris */ - } - } return 1; } @@ -3296,13 +3273,30 @@ _e_fm_xdnd_leave_cb(void *data, int type, void *event) if (ev->win != sd->win->evas_win) return 1; - +#if 0 /* in we leaved an efm window with autoscroll disable it*/ if(sd->autoscroll.timer) { ecore_timer_del(sd->autoscroll.timer); sd->autoscroll.timer = NULL; } +#endif + /* if we left any icon hover unhover it */ + { + Evas_List *l; + + for (l = sd->icons; l; l = l->next) + { + E_Fm_Icon *icon; + + icon = l->data; + if(!icon->icon_obj) + continue; + if(icon->state.hover) + e_fm_icon_signal_emit(icon->icon_obj, "unhover", ""); + } + } + return 1; } @@ -3325,6 +3319,8 @@ _e_fm_xdnd_position_cb(void *data, int type, void *event) Ecore_X_Event_Xdnd_Position *ev; E_Fm_Smart_Data *sd; Ecore_X_Rectangle rect; + int x,y; + int dx,dy,dw,dh; ev = event; sd = data; @@ -3334,22 +3330,22 @@ _e_fm_xdnd_position_cb(void *data, int type, void *event) return 1; } - /* autoscroll */ + ecore_evas_geometry_get(sd->win->ecore_evas, &dx, &dy, &dw, &dh); + + //printf("pointer: %d %d, window: %d %d %d %d\n", ev->position.x, ev->position.y, dx,dy,dw,dh); + x = ev->position.x - dx; + y = ev->position.y - dy; + +#if 0 { + /* autoscroll */ /* look to set up the direction of the autoscroll * add timer callbacks for automatic scroll in case the mouse is over * that region, the threshold region to scroll is the 20% of the * window size */ - int dx,dy,dw,dh; int rw,rh; - int x,y; - - ecore_evas_geometry_get(sd->win->ecore_evas, &dx, &dy, &dw, &dh); - - x = ev->position.x - dx; - y = ev->position.y - dy; - + rw = dw * 0.2; rh = dh * 0.2; @@ -3386,6 +3382,46 @@ _e_fm_xdnd_position_cb(void *data, int type, void *event) } } +#endif + + + /* hover */ + { + Evas_List *l; + /* check the position of every icon and compare the coords + * until we find an icon below + */ + sd->operation.hover = NULL; + for (l = sd->icons; l; l = l->next) + { + E_Fm_Icon *icon; + Evas_Coord xx, yy, ww, hh; + + icon = l->data; + if(!icon->icon_obj) + continue; + evas_object_geometry_get(icon->icon_obj, &xx, &yy, &ww, &hh); + if (E_INTERSECTS(x, y, 1, 1, xx, yy, ww, hh)) + { + icon->state.hover = 1; + e_fm_icon_signal_emit(icon->icon_obj, "hover", ""); + sd->operation.hover = icon->file; + } + else + { + /* if the icon is outside the pointer and is hilighted + * unhilight it */ + if(icon->state.hover) + { + e_fm_icon_signal_emit(icon->icon_obj, "unhover", ""); + icon->state.hover = 0; + } + if(icon->state.selected) + e_fm_icon_signal_emit(icon->icon_obj, "clicked", ""); + } + } + } + rect.x = 0; rect.y = 0; rect.width = 0; @@ -3404,20 +3440,29 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event) Evas_List *l; int dx, dy, dw, dh; int x,y; + static E_Fm_Drag_Button button; ev = event; sd = data; - if (ev->win != sd->win->evas_win) - { - return 1; - } - /* we will receive this callback for every efm window, even if the drop isnt done * on this window */ + if (ev->win != sd->win->evas_win) + { + /* this event will be the first we have, the source window. + * store the button that started the drag + */ + if(sd->drag.status == E_FILEMAN_DRAG_DOING) + { + //printf("inside drop saving the correct button %d\n", sd->drag.button); + button = sd->drag.button; + } + return 1; + } + ecore_evas_geometry_get(sd->win->ecore_evas, &dx, &dy, &dw, &dh); - if(sd->drag.doing) + if(sd->drag.status == E_FILEMAN_DRAG_DOING) { /* send the dropped signal to all the selected icons * move the selected icons relative to the cursor that @@ -3440,31 +3485,33 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event) iy += y; e_icon_canvas_child_move(ic->icon_obj,ix,iy); e_fm_icon_signal_emit(ic->icon_obj, "dropped", ""); - } - /*if(sd->meta) - { - Evas_List *l; - for(l = sd->meta->icons; l; l = l->next) + + if(sd->meta) { - E_Fm_Icon_Metadata *m; - - m = l->data; - if(!strcmp(m->name, sd->drag.icon_obj->file->name)) + Evas_List *l; + for(l = sd->meta->files; l; l = l->next) { - m->x = x; - m->y = y; - break; + E_Fm_Icon_Metadata *m; + + m = l->data; + if(!strcmp(m->name, sd->drag.icon_obj->file->name)) + { + /* FIXME here we need the position relative to the canvas + * not the window */ + //m->x = ix; + //m->y = iy; + break; + } } } - }*/ + } } - sd->drag.doing = 0; - sd->drag.start = 0; } /* if we drop over another efm window */ else { - printf("outside drop\n"); + //printf("outside drop setting the correct button %d\n", button); + sd->drag.button = button; } /* if we drop on an auto scrollable area, delete the timer */ @@ -3473,9 +3520,7 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event) ecore_timer_del(sd->autoscroll.timer); sd->autoscroll.timer = NULL; } - ecore_x_selection_xdnd_request(sd->win->evas_win, "text/uri-list"); - return 1; } @@ -3489,23 +3534,43 @@ _e_fm_xdnd_selection_cb(void *data, int type, void *event) ev = event; sd = data; + if (ev->win != sd->win->evas_win) return 1; - - files = ev->data; - - /* FIXME: Add this file to the current files */ - for (i = 0; i < files->num_files; i++) + + switch(ev->selection) { - char new_file[PATH_MAX]; + case ECORE_X_SELECTION_XDND: + if(!strcmp(ev->target, "text/uri-list")) + { + int i; + int remove = 7; /* 7 = file:// */ + files = ev->data; + if(files->num_files < 1) + break; + + /* FIXME clean in a better way the list */ + sd->operation.files = NULL; + i = 0; + do + { + E_Fm_File *f; - snprintf(new_file, PATH_MAX, "%s/%s", sd->dir, - ecore_file_get_file(files->files[i])); - ecore_file_cp(strstr(files->files[i], "/"), new_file); + f = e_fm_file_new(files->files[i] + remove); + sd->operation.files = evas_list_append(sd->operation.files,f); + i++; + remove = 0; + } while(i < files->num_files); + + sd->operation.mime = e_fm_mime_get_from_list(sd->operation.files); + sd->drag.status = E_FILEMAN_DRAG_DONE; + _e_fm_fake_mouse_up_later(sd->win->evas,sd->drag.button); + } + break; + default: + break; } - ecore_x_dnd_send_finished(); - _e_fm_redraw(sd); - + return 1; } @@ -3716,6 +3781,7 @@ _e_fm_dir_meta_save(E_Fm_Smart_Data *sd) ret = eet_data_write(ef, _e_fm_dir_meta_edd, "metadata", sd->meta, 1); eet_close(ef); free(hash); + return ret; } @@ -3739,9 +3805,8 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns E_Menu *mn,*mo; E_Menu_Item *mi; int x, y, w, h; - E_Fm_Assoc_App *assoc; - Evas_List *l,*actions,*mimes = NULL; + Evas_List *l; E_Fm_Mime_Action *action; E_Fm_Mime_Action *default_action; E_Fm_Mime_Entry *mime; @@ -3757,64 +3822,10 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns mn = e_menu_new(); e_menu_category_set(mn,"fileman/action"); - e_menu_category_data_set("fileman/action",sd->selection.icons); + e_menu_category_data_set("fileman/action",sd); mi = NULL; -#if 0 - if((mo = evas_hash_find(sd->mime_menu_hash,icon->file->mime)) == NULL) - { - /*- Arrange -*/ - mo = e_menu_new(); - for (l = icon->sd->conf.main->apps; l; l = l->next) - { - assoc = l->data; - if (e_fm_file_has_mime(icon->file, assoc->mime)) - { - mi = e_menu_item_new(mo); - e_menu_item_label_set(mi, _(assoc->app)); - e_menu_item_radio_set(mi, 1); - e_menu_item_radio_group_set(mi, 2); - - /* - if (!((assoc->app->icon_class) && - (e_util_menu_item_edje_icon_list_set(mi, assoc->app->icon_class)))) - e_menu_item_icon_edje_set(mi, assoc->app->path, "item"); - */ - e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon); - } - assoc = NULL; - } - if(mi) - { - icon->sd->mime_menu_hash = evas_hash_add(icon->sd->mime_menu_hash,strdup(icon->file->mime), mo); - mi = e_menu_item_new(mn); - e_menu_item_submenu_set(mi, mo); - e_menu_item_label_set(mi, _("Open with")); - e_menu_item_icon_edje_set(mi, - (char *)e_theme_edje_file_get("base/theme/fileman", - "fileman/button/open"), - "fileman/button/open"); - } - } - else - { - mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, _("Open with")); - e_menu_item_icon_edje_set(mi, - (char *)e_theme_edje_file_get("base/theme/fileman", - "fileman/button/open"), - "fileman/button/open"); - e_menu_item_submenu_set(mi, mo); - } - mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, _("Open")); - e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon); - e_menu_item_icon_edje_set(mi, - (char *)e_theme_edje_file_get("base/theme/fileman", - "fileman/button/open"), - "fileman/button/open"); -#endif mime = sd->operation.mime; printf("mime for selection %s\n", mime->name); @@ -3838,7 +3849,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns e_menu_item_label_set(mi, _(action->label)); e_menu_item_callback_set(mi, _e_fm_menu_actions, sd); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", - "fileman/button/properties"),"fileman/button/properties"); + "fileman/button/open"),"fileman/button/open"); mi = e_menu_item_new(mn); e_menu_item_separator_set(mi, 1); @@ -3851,6 +3862,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns mime = sd->operation.mime; do { + Evas_List *actions; printf("mime %s\n", mime->name); actions = mime->actions; for(l = actions; l; l = l->next) @@ -3867,7 +3879,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns e_menu_item_label_set(mi, _(action->label)); e_menu_item_callback_set(mi, _e_fm_menu_actions, sd); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", - "fileman/button/properties"),"fileman/button/properties"); + "fileman/button/open"),"fileman/button/open"); } mime = mime->parent; @@ -3923,7 +3935,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/properties"), "fileman/button/properties"); - //icon->menu = mn; + //sd->selection.icon->menu = mn; if (!sd->win) return; @@ -3933,14 +3945,104 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns } -/* displays the context menu for a list of @files on the coordinate - * @dx, @dy relative to the sd window +/* displays the context menu on the coordinate + * @dx, @dy relative to the @sd window */ static void _e_fm_menu_context_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, unsigned int timestamp) { + E_Menu *mn,*mo; + E_Menu_Item *mi; -; + int x, y, w, h; + int multiple = 0; + Evas_List *l; + + E_Fm_Mime_Entry *mime; + E_Fm_Mime_Action *action; + E_Fm_Mime_Action *default_action; + + /* if we dont have any selection, how do we get here ? */ + if(!sd->selection.icons) + return; + /* to know if the action can be performed on multiple files */ + if(sd->operation.files->next) + multiple = 1; + + mn = e_menu_new(); + e_menu_category_set(mn,"fileman/action"); + e_menu_category_data_set("fileman/action",sd); + + mi = NULL; + + mime = sd->operation.mime; + printf("mime for selection %s\n", mime->name); + /* the default relative action */ + do + { + action = mime->action_default_relative; + + if(!action) + { + mime = mime->parent; + continue; + } + if(!action->multiple && multiple) + { + mime = mime->parent; + continue; + } + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _(action->label)); + e_menu_item_callback_set(mi, _e_fm_menu_actions, sd); + e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", + "fileman/button/open"),"fileman/button/open"); + + mi = e_menu_item_new(mn); + e_menu_item_separator_set(mi, 1); + + default_action = action; + break; + + } while(mime); + + /* the other relative actions */ + mime = sd->operation.mime; + do + { + Evas_List *actions; + + printf("mime %s\n", mime->name); + actions = mime->actions; + for(l = actions; l; l = l->next) + { + + action = (E_Fm_Mime_Action*)l->data; + /* if its not relative skip it */ + if(!action->relative) + continue; + if(!action->multiple && multiple) + continue; + /* if its the same as the default one, skip it */ + if(action == default_action) + continue; + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _(action->label)); + e_menu_item_callback_set(mi, _e_fm_menu_actions, sd); + e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", + "fileman/button/open"),"fileman/button/open"); + + } + mime = mime->parent; + } while(mime); + + if (!sd->win) return; + + ecore_evas_geometry_get(sd->win->ecore_evas, &x, &y, &w, &h); + e_menu_activate_mouse(mn, sd->win->border->zone,x + dx, y + dy, 1, 1, + E_MENU_POP_DIRECTION_DOWN, timestamp); } /* callback when a mime action is clicked on the actions menu */ diff --git a/src/bin/e_fileman_smart.h b/src/bin/e_fileman_smart.h index 9bde5ca30..62366ff78 100644 --- a/src/bin/e_fileman_smart.h +++ b/src/bin/e_fileman_smart.h @@ -9,13 +9,16 @@ typedef struct _E_Fm_Icon_CFData E_Fm_Icon_CFData; typedef struct _E_Fm_Config E_Fm_Config; typedef struct _E_Fm_Dir_Metadata E_Fm_Dir_Metadata; typedef struct _E_Fm_Fake_Mouse_Up_Info E_Fm_Fake_Mouse_Up_Info; -typedef enum _E_Fm_Arrange E_Fm_Arrange; -typedef enum _E_Fm_State E_Fm_State; -typedef enum _E_Fm_Autoscroll E_Fm_Autoscroll; typedef struct _E_Event_Fm_Reconfigure E_Event_Fm_Reconfigure; typedef struct _E_Event_Fm_Directory_Change E_Event_Fm_Directory_Change; typedef struct _E_Fm_Assoc_App E_Fm_Assoc_App; +typedef enum _E_Fm_Arrange E_Fm_Arrange; +typedef enum _E_Fm_State E_Fm_State; +typedef enum _E_Fm_Autoscroll E_Fm_Autoscroll; +typedef enum _E_Fm_Drag_Status E_Fm_Drag_Status; +typedef enum _E_Fm_Drag_Button E_Fm_Drag_Button; + #else #ifndef E_FM_SMART_H #define E_FM_SMART_H @@ -46,7 +49,8 @@ struct _E_Fm_Icon struct { unsigned char selected : 1; - unsigned char visible : 1; + unsigned char hover : 1; + unsigned char visible : 1; /* FIXME what was it for?to stop comparing icon_obj to NULL */ } state; @@ -72,15 +76,15 @@ struct _E_Fm_Icon_CFData enum _E_Fm_Arrange { E_FILEMAN_CANVAS_ARRANGE_NAME = 0, - E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1, - E_FILEMAN_CANVAS_ARRANGE_SIZE = 2, + E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1, + E_FILEMAN_CANVAS_ARRANGE_SIZE = 2, }; enum _E_Fm_State { E_FILEMAN_STATE_IDLE = 0, - E_FILEMAN_STATE_TYPEBUFFER = 1, - E_FILEMAN_STATE_RENAME = 2, + E_FILEMAN_STATE_TYPEBUFFER = 1, + E_FILEMAN_STATE_RENAME = 2, }; enum _E_Fm_Autoscroll @@ -92,6 +96,23 @@ enum _E_Fm_Autoscroll E_FILEMAN_AUTOSCROLL_RIGHT = 8, }; +enum _E_Fm_Drag_Status +{ + E_FILEMAN_DRAG_NONE = 0, /* to not create the drag window on every mouse move */ + E_FILEMAN_DRAG_START = 1, /* to create the fake window and identify the fileman sd + that does the drag */ + E_FILEMAN_DRAG_DOING = 2, /* to know when to launch the context menu/call default + relative action */ + E_FILEMAN_DRAG_DONE = 3, /* the mouse up event is *before* the xdnd selection, + we need this */ +}; + +enum _E_Fm_Drag_Button +{ + E_FILEMAN_DRAG_PRIMARY = 1, + E_FILEMAN_DRAG_SECONDARY = 3, +}; + struct _E_Fm_Fake_Mouse_Up_Info { Evas *canvas; @@ -141,8 +162,8 @@ struct _E_Fm_Smart_Data Evas_Coord x, y, w, h; struct { - unsigned char start : 1; - unsigned char doing : 1; + E_Fm_Drag_Status status; + E_Fm_Drag_Button button; int x, y; /* the position of the pointer's x,y, relative to the canvas */ int dx, dy; /* the difference from the icon's x,y and the pointer's x,y */ Ecore_Evas *ecore_evas; @@ -192,7 +213,7 @@ struct _E_Fm_Smart_Data struct { Evas_List *files; /* list of E_Fm_Files */ - E_Fm_File *dir; /* the file of the relative directory for operations */ + E_Fm_File *hover; /* the file of the relative directory for operations */ E_Fm_Mime_Entry *mime; /* overall mime for all the icons we are going to operate wirh */ } operation; /* the operating files, for wich we are going to make actions