Enlightenment CVS committal

Author  : codewarrior
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_fileman_smart.c e_icon_layout.c 


Log Message:
- optimize e_icon_layout (still need to do unpack)
- optimize loading of large folders (10,000+ files load well now)

Please test and report bugs. I have found a couple myself but havent traced 
them down yet.


===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_fileman_smart.c,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -3 -r1.88 -r1.89
--- e_fileman_smart.c   5 Nov 2005 12:42:59 -0000       1.88
+++ e_fileman_smart.c   6 Nov 2005 13:09:54 -0000       1.89
@@ -122,6 +122,10 @@
    Evas_Object *entry_object;
 
    char *dir;
+   DIR  *dir2;
+   
+   double timer_int;
+   Ecore_Timer *timer;
 
    Evas_List *event_handlers;
 
@@ -208,7 +212,7 @@
 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 int                _e_fm_dir_files_get          (void *data);
 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);
@@ -496,6 +500,9 @@
    sd->icon_info.x_space = 12;
    sd->icon_info.y_space = 10;
 
+   sd->timer_int = 0.001;
+   sd->timer = NULL;
+   
    sd->evas = evas_object_evas_get(object);
    sd->frozen = 0;
    sd->is_selector = 0;
@@ -606,6 +613,14 @@
 
    e_config_domain_save("efm", sd->conf.main_edd, sd->conf.main);
 
+   if(sd->timer)
+     {
+       if(sd->dir2)
+         closedir(sd->dir2);   
+       ecore_timer_del(sd->timer);
+       sd->timer = NULL;
+     }
+   
    if (sd->monitor) ecore_file_monitor_del(sd->monitor);
    sd->monitor = NULL;
 
@@ -621,7 +636,7 @@
        _e_fm_file_free(sd->files->data);
        sd->files = evas_list_remove_list(sd->files, sd->files);
     }
-
+   
    evas_object_del(sd->selection.band.obj);
    evas_object_del(sd->clip);
    evas_object_del(sd->bg);
@@ -1317,10 +1332,13 @@
    Evas_List *l;
    E_Event_Fm_Reconfigure *ev;
    E_Event_Fm_Directory_Change *ev2;
+   DIR           *dir2;
 
    if (!dir) return;
    if ((sd->dir) && (!strcmp(sd->dir, dir))) return;
 
+   if (!(dir2 = opendir(dir))) return;
+   
    if (sd->dir) free (sd->dir);
    sd->dir = strdup(dir);
 
@@ -1336,9 +1354,9 @@
        _e_fm_file_free(sd->files->data);
        sd->files = evas_list_remove_list(sd->files, sd->files);
     }
+   e_icon_layout_reset(sd->layout);   
 
    /* Get new files */
-   sd->files = _e_fm_dir_files_get(sd, E_FM_FILE_TYPE_NORMAL);
    if (sd->monitor) ecore_file_monitor_del(sd->monitor);
    sd->monitor = ecore_file_monitor_add(sd->dir, _e_fm_dir_monitor_cb, sd);
 
@@ -1346,8 +1364,8 @@
    if (strcmp(sd->dir, "/"))
      {
        E_Fm_Icon *icon;
-       char path[PATH_MAX];
-
+       char       path[PATH_MAX];      
+       
        icon = E_NEW(E_Fm_Icon, 1);
        if (icon)
          {
@@ -1357,79 +1375,45 @@
             icon->file->type = E_FM_FILE_TYPE_DIRECTORY;
             icon->icon_object = e_fm_icon_add(sd->evas);
             icon->sd = sd;
-            e_fm_icon_file_set(icon->icon_object, icon->file);      
-            //evas_object_resize(icon->icon_object, 
-            //sd->icon_info.w,
-            //sd->icon_info.h);
+            e_fm_icon_file_set(icon->icon_object, icon->file);
             sd->files = evas_list_prepend(sd->files, icon);
+            e_icon_layout_pack(sd->layout, icon->icon_object);
+            evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
+            evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_UP, _e_fm_icon_mouse_up_cb, icon);
+            evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
+            evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_OUT, _e_fm_icon_mouse_out_cb, icon);      
          }
-     }
-
-   /* Add icons to layout */
-   e_icon_layout_freeze(sd->layout);
-   for (l = sd->files; l; l = l->next)
-     {
-       E_Fm_Icon *icon;
-
-       icon = l->data;
-
-       //evas_object_resize(icon->icon_object, 
-       //                 sd->icon_info.w, 
-       //                 sd->icon_info.h);
-       evas_object_show(icon->icon_object);
-       e_icon_layout_pack(sd->layout, icon->icon_object);
-       evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
-       evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_UP, _e_fm_icon_mouse_up_cb, icon);
-       evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
-       evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_OUT, _e_fm_icon_mouse_out_cb, icon);
-     }
-   e_icon_layout_thaw(sd->layout);
-
-   /* Draw layout */
-   _e_fm_redraw(sd);
-
-   /* raise dir change event */
-   ev2 = E_NEW(E_Event_Fm_Directory_Change, 1);
-   if (ev2)
-     {
-       ev2->object = sd->object;
-       ev2->w = sd->child.w;
-       ev2->h = sd->child.h;
-       ecore_event_add(E_EVENT_FM_DIRECTORY_CHANGE, ev2, NULL, NULL);
-     }
-
-   if (sd->frozen)
-     return;
-
-   /* raise reconfigure event */
-   e_icon_layout_virtual_size_get(sd->layout, &sd->child.w, &sd->child.h);   
-   evas_object_smart_callback_call(sd->object, "changed", NULL);
+     }   
    
-   ev = E_NEW(E_Event_Fm_Reconfigure, 1);
-   if (ev)
-     {
-       e_icon_layout_virtual_size_get(sd->layout, &sd->child.w, &sd->child.h);
-       ev->object = sd->object;
-       ev->w = sd->child.w;
-       ev->h = sd->child.h;
-       //ecore_event_add(E_EVENT_FM_RECONFIGURE, ev, NULL, NULL);
-     }
+   sd->dir2 = dir2;
+   if(sd->timer)
+     ecore_timer_del(sd->timer);
+   sd->timer = ecore_timer_add(sd->timer_int, _e_fm_dir_files_get, sd);   
 }
 
-static Evas_List *
-_e_fm_dir_files_get(E_Fm_Smart_Data *sd, int type)
+static int
+_e_fm_dir_files_get(void *data)
 {
-   DIR           *dir;
-   char           path[PATH_MAX];
-   struct dirent *dir_entry;
-   Evas_List     *files = NULL;
+   E_Fm_Smart_Data *sd;
+   Evas_List       *l;
+   E_Fm_Icon       *icon;   
+   struct dirent   *dir_entry;   
+   char             path[PATH_MAX];
+   int              i;
+   int              type;
 
-   if (!(dir = opendir(sd->dir))) return NULL;
+   /* FIXME: This needs to be passed in to decide what file types to show */  
+   type = E_FM_FILE_TYPE_NORMAL; 
+   i = 0;
+   sd = data;
+   
+   e_icon_layout_freeze(sd->layout);   
 
-   while ((dir_entry = readdir(dir)) != NULL)
-    {
-       E_Fm_Icon *icon;
-       
+   while (i < 2)
+    {     
+       dir_entry = readdir(sd->dir2);
+       if(!dir_entry)
+        break;
        if ((!strcmp(dir_entry->d_name, ".") || (!strcmp (dir_entry->d_name, 
"..")))) continue;
        if ((dir_entry->d_name[0] == '.') && (!(type & E_FM_FILE_TYPE_HIDDEN))) 
continue;
 
@@ -1446,17 +1430,45 @@
            icon->icon_object = e_fm_icon_add(sd->evas);
            icon->sd = sd;
            e_fm_icon_file_set(icon->icon_object, icon->file);
-           //evas_object_resize(icon->icon_object,
-           //sd->icon_info.w,
-           //sd->icon_info.h);
-           files = evas_list_append(files, icon);
+           sd->files = evas_list_append(sd->files, icon);
+           evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_DOWN, _e_fm_icon_mouse_down_cb, icon);
+           evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_UP, _e_fm_icon_mouse_up_cb, icon);
+           evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_IN, _e_fm_icon_mouse_in_cb, icon);
+           evas_object_event_callback_add(icon->icon_object, 
EVAS_CALLBACK_MOUSE_OUT, _e_fm_icon_mouse_out_cb, icon);
+           evas_object_show(icon->icon_object);            
+           e_icon_layout_pack(sd->layout, icon->icon_object);              
         }
+       i++;
     }
-   closedir(dir);
-
-   files = evas_list_sort(files, evas_list_count(files), 
_e_fm_files_sort_name_cb);
 
-   return files;
+   e_icon_layout_thaw(sd->layout);
+   
+   e_icon_layout_virtual_size_get(sd->layout, &sd->child.w, &sd->child.h);   
+   evas_object_smart_callback_call(sd->object, "changed", NULL);   
+   
+   if(!dir_entry) {
+      closedir(sd->dir2);
+      sd->files = evas_list_sort(sd->files, 
+                                evas_list_count(sd->files),
+                                _e_fm_files_sort_name_cb);
+      
+      e_icon_layout_freeze(sd->layout);      
+      e_icon_layout_reset(sd->layout);
+      
+      for(l = sd->files; l; l = l->next)
+       {
+          icon = l->data;
+          e_icon_layout_pack(sd->layout, icon->icon_object);
+       }
+      e_icon_layout_thaw(sd->layout);
+      sd->timer = NULL;
+      return 0;
+   }
+   else
+     {
+       sd->timer = ecore_timer_add(sd->timer_int, _e_fm_dir_files_get, sd);
+       return 0;
+     }
 }
 
 static char *
@@ -2354,7 +2366,6 @@
             if(!E_CONTAINS(sd->x, sd->y, sd->w, sd->h, x, y, w, h))
               {
                  E_Event_Fm_Reconfigure *ev;
-                 printf("!E_CONTAINS %s\n", icon->file->name);
                  ev = E_NEW(E_Event_Fm_Reconfigure, 1);
                  if (ev)
                    {                       
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_icon_layout.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- e_icon_layout.c     4 Nov 2005 14:58:03 -0000       1.13
+++ e_icon_layout.c     6 Nov 2005 13:09:54 -0000       1.14
@@ -13,6 +13,7 @@
    Evas_Coord       vw, vh;
    Evas_Coord       xs, ys;
    Evas_Coord       xc, yc;
+   Evas_Coord       mw, mh;
    Evas_Object     *clip;
    Evas_Object     *obj;
    int              frozen;
@@ -143,8 +144,40 @@
    _e_icon_layout_smart_adopt(sd, child);
    sd->items = evas_list_append(sd->items, child);
    li = evas_object_data_get(child, "e_icon_layout_data");
-   li->x = sd->xc;
-   li->y = sd->yc;
+
+   if (sd->fixed == 0)
+    {     
+       if(li->h > sd->mh) sd->mh = li->h;
+       if(sd->xc > sd->x + sd->vw || sd->xc + li->w > sd->x + sd->vw)
+        {
+           sd->xc = sd->x + sd->xs;
+           sd->yc += sd->mh + sd->ys;
+           sd->mh = 0;
+        }
+       
+       li->x = sd->xc;
+       li->y = sd->yc;
+                  
+       sd->xc += li->w + sd->xs;              
+       sd->vh = sd->yc - sd->y;         
+    }       
+   else
+     {
+       if(li->w > sd->mw) sd->mw = li->w;         
+       
+       if(sd->yc > sd->y + sd->vh || sd->yc + li->h > sd->y + sd->vh)
+         {
+            sd->yc = sd->y + sd->ys;
+            sd->xc += sd->mw + sd->xs;
+            sd->mw = 0;
+         }
+       
+       li->x = sd->xc;
+       li->y = sd->yc;
+               
+       sd->yc += li->h + sd->ys;
+       sd->vw = sd->xc - sd->x;        
+     }
    _e_icon_layout_smart_move_resize_item(li);
 }
 
@@ -171,8 +204,8 @@
    
    li = evas_object_data_get(obj, "e_icon_layout_data");
    if (!li) return;
-   sd = li->sd;
-   sd->items = evas_list_remove(sd->items, obj);
+   sd = li->sd;         
+   sd->items = evas_list_remove(sd->items, obj);         
    _e_icon_layout_smart_disown(obj);
 }
 
@@ -221,6 +254,8 @@
    
    sd->xc = sd->x + sd->xs;
    sd->yc = sd->y + sd->ys;
+   sd->mw = 0;
+   sd->mh = 0;
    
    while (sd->items)
     {
@@ -258,16 +293,16 @@
 _e_icon_layout_smart_adopt(E_Smart_Data *sd, Evas_Object *obj)
 {
    E_Icon_Layout_Item *li;
+   Evas_Coord w, h;
    
    li = calloc(1, sizeof(E_Icon_Layout_Item));
    if (!li) return NULL;
    li->sd = sd;
    li->obj = obj;
+   evas_object_geometry_get(obj, NULL, NULL, &li->w, &li->h);
    /* defaults */
    li->x = 0;
    li->y = 0;
-   li->w = 0;
-   li->h = 0;
    evas_object_clip_set(obj, sd->clip);
    evas_object_smart_member_add(obj, li->sd->obj);
    evas_object_show(obj);
@@ -312,7 +347,7 @@
    Evas_Coord x, y, w, h, maxw, maxh;
    Evas_List *l;
    
-   //if (!sd->changed) return;
+   if (!sd->changed) return;
    
    x = sd->x + sd->xs;
    y = sd->y + sd->ys;
@@ -390,11 +425,13 @@
 static void
 _e_icon_layout_smart_move_resize_item(E_Icon_Layout_Item *li)
 {                                     
-   if(li->w == 0 || li->h == 0)    
-     evas_object_geometry_get(li->obj, NULL, NULL, &li->w, &li->h);
+   if(li->w == 0 || li->h == 0)
+     {
+       evas_object_geometry_get(li->obj, NULL, NULL, &li->w, &li->h);
+       evas_object_resize(li->obj, li->w, li->h);
+     }
    
-   evas_object_move(li->obj, li->x, li->y);
-   //evas_object_resize(li->obj, li->w, li->h);
+   evas_object_move(li->obj, li->x, li->y);   
 }
                                       
 static void
@@ -455,6 +492,8 @@
    sd->ys = 0;
    sd->xc = 0;
    sd->yc = 0;
+   sd->mw = 0;
+   sd->mh = 0;
    sd->fixed = 0;
    sd->clip = evas_object_rectangle_add(evas_object_evas_get(obj));
    evas_object_move(sd->clip, 0, 0);




-------------------------------------------------------
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