- being keyboard navigation for efm

SVN revision: 18219
This commit is contained in:
codewarrior 2005-11-02 16:08:21 +00:00 committed by codewarrior
parent ffa5a66879
commit a4b88871a1
1 changed files with 238 additions and 34 deletions

View File

@ -21,8 +21,6 @@
* - is the offset code working properly? i have a feeling we're displayin
* more icons that the visible space can take and they are being hidden.
*
* - emit all sorts of signals on double click, right click, single click...
*
* - add typebuffer like in evidence.
*
* - keyboard shortcuts for directory and file navigation.
@ -35,8 +33,6 @@
* - double check dir monitoring. note: when we are in a dir that is constantly
* changing, we cant keep calling redraw_new as it will kill us.
*
* - we need to fix the icon edc to allow us to have icon labels what will
* wrap on wrap=char
*/
/* BUGS:
@ -161,16 +157,20 @@ struct _E_Fm_Smart_Data
} child;
struct {
Evas_List *files;
E_Fm_Icon *current_file;
struct {
unsigned char enabled : 1;
Evas_Coord x, y;
Evas_Object *obj;
Evas_List *files;
} band;
Evas_List *files;
struct {
E_Fm_Icon *file;
Evas_List *ptr;
} current;
struct {
unsigned char enabled : 1;
Evas_Coord x, y;
Evas_Object *obj;
Evas_List *files;
} band;
} selection;
struct {
@ -207,15 +207,16 @@ static void _e_fm_menu_refresh_cb(void *data, E_Menu *m, E_Menu_I
static void _e_fm_file_rename (E_Fm_Icon *icon, const char *name);
static void _e_fm_file_delete (E_Fm_Icon *icon);
static void _e_fm_dir_set (E_Fm_Smart_Data *sd, const char *dir);
static Evas_List *_e_fm_dir_files_get (E_Fm_Smart_Data *sd, int type);
static char *_e_fm_dir_pop (const char *path);
static void _e_fm_file_free (E_Fm_Icon *icon);
static void _e_fm_dir_monitor_cb (void *data, Ecore_File_Monitor *ecore_file_monitor, Ecore_File_Event event, const char *path);
static void _e_fm_selections_clear (E_Fm_Smart_Data *sd);
static void _e_fm_selections_add (E_Fm_Icon *icon);
static void _e_fm_selections_rect_add (E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
static void _e_fm_selections_del (E_Fm_Icon *icon);
static void _e_fm_dir_set (E_Fm_Smart_Data *sd, const char *dir);
static Evas_List *_e_fm_dir_files_get (E_Fm_Smart_Data *sd, int type);
static char *_e_fm_dir_pop (const char *path);
static void _e_fm_file_free (E_Fm_Icon *icon);
static void _e_fm_dir_monitor_cb (void *data, Ecore_File_Monitor *ecore_file_monitor, Ecore_File_Event event, const char *path);
static void _e_fm_selections_clear (E_Fm_Smart_Data *sd);
static void _e_fm_selections_add (E_Fm_Icon *icon, Evas_List *icon_ptr);
static void _e_fm_selections_current_set (E_Fm_Icon *icon, Evas_List *icon_ptr);
static void _e_fm_selections_rect_add (E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
static void _e_fm_selections_del (E_Fm_Icon *icon);
static void _e_fm_fake_mouse_up_later (Evas *evas, int button);
static void _e_fm_fake_mouse_up_all_later (Evas *evas);
@ -230,6 +231,7 @@ static void _e_fm_icon_mouse_in_cb (void *data, Evas *e, Evas_O
static void _e_fm_icon_mouse_out_cb (void *data, Evas *e, Evas_Object *obj, void *event_info);
static int _e_fm_win_mouse_move_cb (void *data, int type, void *event);
static int _e_fm_win_mouse_up_cb (void *data, int type, void *event);
static int _e_fm_win_key_down_cb (void *data, int type, void *event);
static int _e_fm_drop_enter_cb (void *data, int type, void *event);
static int _e_fm_drop_leave_cb (void *data, int type, void *event);
@ -562,6 +564,11 @@ _e_fm_smart_add(Evas_Object *object)
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,
_e_fm_win_mouse_move_cb,
sd));
sd->event_handlers = evas_list_append(sd->event_handlers,
ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
_e_fm_win_key_down_cb,
sd));
sd->monitor = NULL;
sd->position = 0.0;
@ -1604,19 +1611,30 @@ _e_fm_selections_clear(E_Fm_Smart_Data *sd)
}
sd->selection.files = evas_list_free(sd->selection.files);
sd->selection.band.files = evas_list_free(sd->selection.band.files);
sd->selection.current_file = NULL;
sd->selection.current.file = NULL;
sd->selection.current.ptr = NULL;
}
static void
_e_fm_selections_add(E_Fm_Icon *icon)
_e_fm_selections_add(E_Fm_Icon *icon, Evas_List *icon_ptr)
{
icon->sd->selection.current.file = icon;
icon->sd->selection.current.ptr = icon_ptr;
if (icon->state.selected) return;
e_fm_icon_signal_emit(icon->icon_object, "clicked", "");
icon->sd->selection.current_file = icon;
icon->sd->selection.files = evas_list_append(icon->sd->selection.files, icon);
icon->state.selected = 1;
}
static void
_e_fm_selections_current_set(E_Fm_Icon *icon, Evas_List *icon_ptr)
{
icon->sd->selection.current.file = icon;
icon->sd->selection.current.ptr = icon_ptr;
if (icon->state.selected) return;
e_fm_icon_signal_emit(icon->icon_object, "hilight", "");
}
static void
_e_fm_selections_rect_add(E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
@ -1637,7 +1655,7 @@ _e_fm_selections_rect_add(E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_
if (icon->state.selected)
_e_fm_selections_del(icon);
else
_e_fm_selections_add(icon);
_e_fm_selections_add(icon, l);
icon->sd->selection.band.files = evas_list_append(icon->sd->selection.band.files, icon);
}
}
@ -1648,7 +1666,7 @@ _e_fm_selections_rect_add(E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_
if (icon->state.selected)
_e_fm_selections_del(icon);
else
_e_fm_selections_add(icon);
_e_fm_selections_add(icon, l);
icon->sd->selection.band.files = evas_list_remove(icon->sd->selection.band.files, icon);
}
}
@ -1661,11 +1679,11 @@ _e_fm_selections_del(E_Fm_Icon *icon)
if (!icon->state.selected) return;
e_fm_icon_signal_emit(icon->icon_object, "unclicked", "");
icon->sd->selection.files = evas_list_remove(icon->sd->selection.files, icon);
if (icon->sd->selection.current_file == icon)
if (icon->sd->selection.current.file == icon)
{
icon->sd->selection.current_file = NULL;
icon->sd->selection.current.file = NULL;
if (icon->sd->selection.files)
icon->sd->selection.current_file = icon->sd->selection.files->data;
icon->sd->selection.current.file = icon->sd->selection.files->data;
}
icon->state.selected = 0;
}
@ -1996,7 +2014,7 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
else
_e_fm_selections_clear(icon->sd);
_e_fm_selections_add(icon);
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
}
else
{
@ -2005,7 +2023,7 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
else
{
_e_fm_selections_clear(icon->sd);
_e_fm_selections_add(icon);
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
}
}
@ -2018,7 +2036,7 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
int x, y, w, h;
_e_fm_selections_clear(icon->sd);
_e_fm_selections_add(icon);
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->files, icon));
mn = e_menu_new();
mi = e_menu_item_new(mn);
@ -2231,6 +2249,192 @@ _e_fm_win_mouse_up_cb(void *data, int type, void *event)
return 0;
}
static void
_e_fm_icon_select_up(E_Fm_Smart_Data *sd)
{
Evas_List *l;
if(sd->selection.current.ptr)
{
E_Fm_Icon *icon;
Evas_Coord x, y, x2, y2;
l = sd->selection.current.ptr;
icon = l->data;
evas_object_geometry_get(icon->icon_object, &x, &y, NULL, NULL);
x2 = x + 1;
l = l->prev;
while(l && x != x2)
{
icon = l->data;
evas_object_geometry_get(icon->icon_object, &x2, &y2, NULL, NULL);
if (evas_key_modifier_is_set(evas_key_modifier_get(sd->evas), "Control"))
{
if(icon->state.selected)
{
_e_fm_selections_del(l->data);
_e_fm_selections_current_set(l->data, l);
}
else
_e_fm_selections_add(l->data, l);
}
l = l->prev;
}
if(l && !evas_key_modifier_is_set(evas_key_modifier_get(sd->evas), "Control"))
{
if(l->next) l = l->next;
if(!l) return;
_e_fm_selections_clear(sd);
_e_fm_selections_add(l->data, l);
}
}
else
_e_fm_selections_add(sd->files->data, sd->files);
}
static void
_e_fm_icon_select_down(E_Fm_Smart_Data *sd)
{
Evas_List *l;
if(sd->selection.current.ptr)
{
E_Fm_Icon *icon;
Evas_Coord x, y, x2, y2;
l = sd->selection.current.ptr;
icon = l->data;
evas_object_geometry_get(icon->icon_object, &x, &y, NULL, NULL);
x2 = x + 1;
l = l->next;
while(l && x != x2)
{
icon = l->data;
evas_object_geometry_get(icon->icon_object, &x2, &y2, NULL, NULL);
if (evas_key_modifier_is_set(evas_key_modifier_get(sd->evas), "Control"))
{
if(icon->state.selected)
{
_e_fm_selections_del(l->data);
_e_fm_selections_current_set(l->data, l);
}
else
_e_fm_selections_add(l->data, l);
}
l = l->next;
}
if(l && !evas_key_modifier_is_set(evas_key_modifier_get(sd->evas), "Control"))
{
if(l->prev) l = l->prev;
if(!l) return;
_e_fm_selections_clear(sd);
_e_fm_selections_add(l->data, l);
}
}
else
_e_fm_selections_add(sd->files->data, sd->files);
}
static void
_e_fm_icon_select_left(E_Fm_Smart_Data *sd)
{
Evas_List *prev;
if(sd->selection.current.ptr)
{
if(sd->selection.current.ptr->prev)
{
prev = sd->selection.current.ptr->prev;
if (evas_key_modifier_is_set(evas_key_modifier_get(sd->evas), "Control"))
{
E_Fm_Icon *icon;
icon = prev->data;
if(icon->state.selected)
{
_e_fm_selections_del(prev->data);
_e_fm_selections_current_set(prev->data, prev);
}
else
_e_fm_selections_add(prev->data, prev);
}
else
{
_e_fm_selections_clear(sd);
_e_fm_selections_add(prev->data, prev);
}
}
}
else
_e_fm_selections_add(sd->files->data, sd->files);
}
static void
_e_fm_icon_select_right(E_Fm_Smart_Data *sd)
{
Evas_List *next;
if(sd->selection.current.ptr)
{
if(sd->selection.current.ptr->next)
{
next = sd->selection.current.ptr->next;
if (evas_key_modifier_is_set(evas_key_modifier_get(sd->evas), "Control"))
{
E_Fm_Icon *icon;
icon = next->data;
if(icon->state.selected)
{
_e_fm_selections_del(next->data);
_e_fm_selections_current_set(next->data, next);
}
else
_e_fm_selections_add(next->data, next);
}
else
{
_e_fm_selections_clear(sd);
_e_fm_selections_add(next->data, next);
}
}
}
else
_e_fm_selections_add(sd->files->data, sd->files);
}
static void
_e_fm_icon_run(E_Fm_Smart_Data *sd)
{
}
static int
_e_fm_win_key_down_cb(void *data, int type, void *event)
{
Ecore_X_Event_Key_Down *ev;
E_Fm_Smart_Data *sd;
ev = event;
sd = data;
// make this call generic
if (ev->win != ecore_evas_software_x11_subwindow_get(sd->win->ecore_evas))
return 1;
if(!strcmp(ev->keysymbol, "Up"))
_e_fm_icon_select_up(sd);
else if(!strcmp(ev->keysymbol, "Down"))
_e_fm_icon_select_down(sd);
else if(!strcmp(ev->keysymbol, "Left"))
_e_fm_icon_select_left(sd);
else if(!strcmp(ev->keysymbol, "Right"))
_e_fm_icon_select_right(sd);
else if(!strcmp(ev->keysymbol, "Return"))
_e_fm_icon_run(sd);
}
static int
_e_fm_drop_enter_cb(void *data, int type, void *event)
{