diff --git a/data/themes/default_fileman.edc b/data/themes/default_fileman.edc index 4263c2f1a..e963d08ec 100644 --- a/data/themes/default_fileman.edc +++ b/data/themes/default_fileman.edc @@ -41,11 +41,56 @@ group { \ } \ } \ } \ + +#define FILEMAN_ICON_CLICKABLE(TYPE) \ +group { \ + name: "fileman/icons/"TYPE; \ + max: 64 64; \ + parts { \ + part { \ + name: "icon"; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + aspect: 1.0 1.0; \ + max: 64 64; \ + image { \ + normal: "e17_icon_fileman_"TYPE".png"; \ + } \ + } \ + description { \ + state: "clicked" 0.0; \ + aspect: 1.0 1.0; \ + max: 64 64; \ + image { \ + normal: "e17_icon_fileman_"TYPE"_clicked.png"; \ + } \ + } \ + } \ + } \ + programs { \ + program { \ + name: "clicked"; \ + signal: "clicked"; \ + source: ""; \ + action: STATE_SET "clicked" 0.0; \ + target: "icon"; \ + } \ + program { \ + name: "unclicked"; \ + signal: "unclicked"; \ + source: ""; \ + action: STATE_SET "default" 0.0; \ + target: "icon"; \ + } \ + } \ +} \ images { image: "e17_fileman_bg.png" COMP; image: "e17_icon_fileman_folder.png" COMP; + image: "e17_icon_fileman_folder_clicked.png" COMP; image: "e17_icon_fileman_file.png" COMP; image: "e17_icon_fileman_pdf.png" COMP; image: "e17_icon_fileman_c.png" COMP; @@ -219,10 +264,6 @@ group { name: "icon_swallow"; type: SWALLOW; mouse_events: 1; - dragable { - x: 1 1 0; - y: 1 1 0; - } description { min: 48 48; max: 128 128; @@ -238,7 +279,6 @@ group { color: 0 0 0 255; } } - part { name: "icon_title"; type: TEXT; @@ -307,10 +347,10 @@ group { program { name: "button_click"; signal: "mouse,down,1"; - source: "icon_event"; + source: ""; action: SIGNAL_EMIT "clicked" ""; - } - } + } + } } @@ -482,7 +522,7 @@ group { } -FILEMAN_ICON("folder"); +FILEMAN_ICON_CLICKABLE("folder"); FILEMAN_ICON("file"); FILEMAN_ICON("pdf"); FILEMAN_ICON("c"); diff --git a/data/themes/images/e17_icon_fileman_folder_clicked.png b/data/themes/images/e17_icon_fileman_folder_clicked.png new file mode 100644 index 000000000..6f9fb0db8 Binary files /dev/null and b/data/themes/images/e17_icon_fileman_folder_clicked.png differ diff --git a/src/bin/e_fileman_smart.c b/src/bin/e_fileman_smart.c index 7e53083ad..e0d069abc 100644 --- a/src/bin/e_fileman_smart.c +++ b/src/bin/e_fileman_smart.c @@ -65,6 +65,11 @@ struct _E_Fileman_File Evas_Object *bg; Evas_List *objects; } prop; + + struct { + unsigned char clicked : 1; + unsigned char selected : 1; + } state; void *data; }; @@ -148,8 +153,12 @@ struct _E_Fileman_Smart_Data struct { int w; int h; - } max; + } max; + struct { + Evas_List *files; + E_Fileman_File *current_file; + } selection; }; static void _e_fm_smart_add(Evas_Object *object); @@ -181,6 +190,8 @@ static Evas_Object *_e_fm_file_icon_mime_get (E_Fileman_File *file); static Evas_Object *_e_fm_file_icon_get (E_Fileman_File *file); static void _e_fm_file_icon_mouse_down_cb (void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_file_icon_mouse_up_cb (void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _e_fm_file_icon_mouse_in_cb (void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _e_fm_file_icon_mouse_out_cb (void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_file_menu_open (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_copy (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_cut (void *data, E_Menu *m, E_Menu_Item *mi); @@ -487,7 +498,9 @@ _e_fm_redraw_update (E_Fileman_Smart_Data *sd) evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_file_icon_mouse_down_cb, file); evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_UP, _e_fm_file_icon_mouse_up_cb, file); - evas_object_repeat_events_set(file->event, FALSE); + evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_IN, _e_fm_file_icon_mouse_in_cb, file); + evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_OUT, _e_fm_file_icon_mouse_out_cb, file); + evas_object_repeat_events_set(file->event, TRUE); sd->files = evas_list_append (sd->files, file); @@ -863,13 +876,14 @@ _e_fm_redraw_new (E_Fileman_Smart_Data *sd) evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_file_icon_mouse_down_cb, file); evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_UP, _e_fm_file_icon_mouse_up_cb, file); + evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_IN, _e_fm_file_icon_mouse_in_cb, file); + evas_object_event_callback_add (file->event, EVAS_CALLBACK_MOUSE_OUT, _e_fm_file_icon_mouse_out_cb, file); evas_object_repeat_events_set(file->event, FALSE); sd->files = evas_list_append (sd->files, file); sd->file_offset++; sd->visible_files++; - printf("visible files: %d\n", sd->visible_files); dirs = dirs->next; } } @@ -1010,7 +1024,10 @@ _e_fm_dir_set (E_Fileman_Smart_Data *sd, const char *dir) sd->dir = calloc (/*strlen(dir) + 1*/PATH_MAX, sizeof (char)); snprintf (sd->dir, PATH_MAX/*strlen(dir) + 1*/, "%s", dir); - + + if(sd->selection.current_file) + sd->selection.current_file = NULL; + _e_fm_redraw_new (sd); } @@ -1052,7 +1069,9 @@ _e_fm_files_free (E_Fileman_Smart_Data *sd) sd->files = NULL; sd->drag.file = NULL; - //sd = NULL; + + if(sd->selection.current_file) + sd->selection.current_file = NULL; } static void @@ -1868,17 +1887,30 @@ static void _e_fm_mouse_down_cb (void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fileman_Smart_Data *sd; - Evas_Event_Mouse_Down *ev; + Evas_Event_Mouse_Down *ev; + E_Menu *mn; + E_Menu_Item *mi; + int x, y, w, h; + ev = (Evas_Event_Mouse_Down *)event_info; sd = data; - if (ev->button == 3) + switch(ev->button) { - E_Menu *mn; - E_Menu_Item *mi; - int x, y, w, h; + case 1: + /* todo: multiple selections */ + if(sd->selection.current_file) + { + edje_object_signal_emit(sd->selection.current_file->icon, "unclicked", ""); + edje_object_signal_emit(sd->selection.current_file->icon_img, "unclicked", ""); + sd->selection.current_file->state.clicked = 0; + } + + break; + + case 3: if (!sd->win) return; mn = e_menu_new (); @@ -1968,6 +2000,7 @@ _e_fm_mouse_down_cb (void *data, Evas *e, Evas_Object *obj, void *event_info) ev->output.x + x, ev->output.y + y, 1, 1, E_MENU_POP_DIRECTION_DOWN,ev->timestamp); _e_fileman_fake_mouse_up_all_later (sd->win->evas); + break; } } @@ -2043,7 +2076,23 @@ _e_fm_file_icon_mouse_down_cb (void *data, Evas *e, Evas_Object *obj, void *even file->sd->drag.y = -1; file->sd->drag.x = -1; file->sd->drag.file = file; - printf("drag file: %s\n", file->dir_entry->d_name); + printf("drag file: %s\n", file->dir_entry->d_name); + + if(!file->state.clicked) + { + /* todo multiple selection with control or shift */ + if(file->sd->selection.current_file) + { + edje_object_signal_emit(file->sd->selection.current_file->icon, "unclicked", ""); + edje_object_signal_emit(file->sd->selection.current_file->icon_img, "unclicked", ""); + file->sd->selection.current_file->state.clicked = 0; + } + + edje_object_signal_emit(file->icon, "clicked", ""); + edje_object_signal_emit(file->icon_img, "clicked", ""); + file->sd->selection.current_file = file; + file->state.clicked = 1; + } } } @@ -2127,6 +2176,32 @@ _e_fm_file_icon_mouse_down_cb (void *data, Evas *e, Evas_Object *obj, void *even } } +static void +_e_fm_file_icon_mouse_in_cb (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Fileman_File *file; + Evas_Event_Mouse_Move *ev; + + ev = (Evas_Event_Mouse_Move *)event_info; + file = data; + + edje_object_signal_emit(file->icon, "hilight", ""); + edje_object_signal_emit(file->icon_img, "hilight", ""); +} + +static void +_e_fm_file_icon_mouse_out_cb (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + E_Fileman_File *file; + Evas_Event_Mouse_Move *ev; + + ev = (Evas_Event_Mouse_Move *)event_info; + file = data; + + edje_object_signal_emit(file->icon, "default", ""); + edje_object_signal_emit(file->icon_img, "default", ""); +} + static void _e_fm_menu_arrange_cb (void *data, E_Menu *m, E_Menu_Item *mi) {