Enlightenment CVS committal

Author  : codewarrior
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_fileman_smart.c 


Log Message:
- being keyboard navigation for efm
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_fileman_smart.c,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -3 -r1.72 -r1.73
--- e_fileman_smart.c   2 Nov 2005 06:28:52 -0000       1.72
+++ e_fileman_smart.c   2 Nov 2005 16:08:21 -0000       1.73
@@ -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 @@
    } 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_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_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 @@
                                         
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,20 +1611,31 @@
     }
    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)
 {
    Evas_List *l;
@@ -1637,7 +1655,7 @@
               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 @@
               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 @@
    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 @@
                 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 @@
                 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 @@
        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 @@
    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)
 {




-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to