Enlightenment CVS committal

Author  : codewarrior
Project : e17
Module  : apps/exhibit

Dir     : e17/apps/exhibit/src/bin


Modified Files:
        exhibit_main.c 


Log Message:
big dirs load much faster now. tested on a dir with 3000 images without any gui 
blocks. note: sorting is done after everything is loaded for now, this needs 
fixing

===================================================================
RCS file: /cvs/e/e17/apps/exhibit/src/bin/exhibit_main.c,v
retrieving revision 1.109
retrieving revision 1.110
diff -u -3 -r1.109 -r1.110
--- exhibit_main.c      6 Jul 2007 11:11:49 -0000       1.109
+++ exhibit_main.c      6 Jul 2007 18:58:10 -0000       1.110
@@ -3,9 +3,23 @@
  */
 #include "exhibit.h"
 
+/* defines the max number of additions to the tree per timer tick */
+#define MAX_INSERTS_PER_ITERATION 200
+
+/* defines the timer tick interval for tree inserts */
+#define INSERTS_INTERVAL 0.15
+
 extern pid_t pid;
 extern Evas_List *thumb_list;
 
+typedef struct _Ex_Populate_Data Ex_Populate_Data;
+
+struct _Ex_Populate_Data
+{
+   char *selected_file;
+   Ex_Tree_Update update;
+};
+
 Exhibit *e;
 Evas_List  *event_handlers;
 
@@ -202,44 +216,31 @@
    return strcasecmp(dir1, dir2);
 }
 
-void
-_ex_main_populate_files(const char *selected_file, Ex_Tree_Update update)
+int
+_ex_main_populate_files_timer_cb(void *fdata)
 {
-   char back[PATH_MAX];
-   DIR *dir;
+   Ex_Populate_Data *data;
+   int i = 0;
+   static DIR *dir = NULL;
    struct dirent *dir_entry;
-
-   _ex_main_image_unset();
-   chdir(e->cur_tab->dir);
-   
-   if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS)
-     {
-       snprintf(back, PATH_MAX, "..");
-       etk_tree_row_append(ETK_TREE(e->cur_tab->dtree), NULL, e->cur_tab->dcol,
-                     etk_theme_icon_path_get(), "actions/go-up_16", back, 
NULL);
-     }
-
-   if (e->cur_tab->monitor)
+      
+   data = fdata;
+   if (!dir)
      {
-       D(("Removing old monitoring\n"));
-       ecore_file_monitor_del(e->cur_tab->monitor);
-       e->cur_tab->monitor = NULL;
+       if ((dir = opendir(".")) == NULL)
+         {
+            if (data)
+              {
+                 if (data->selected_file)
+                   free(data->selected_file);
+                 free(data);
+              }
+            return 0;
+         }
      }
 
-   if ((dir = opendir(".")) == NULL)
-     return;
-
    etk_tree_freeze(ETK_TREE(e->cur_tab->itree));
-   etk_tree_freeze(ETK_TREE(e->cur_tab->dtree));
-   
-   getcwd(e->cur_tab->cur_path, PATH_MAX);
-   if (strlen(e->cur_tab->cur_path) < PATH_MAX - 2)
-     {
-       int len = strlen(e->cur_tab->cur_path);
-       e->cur_tab->cur_path[len] = '/';
-       e->cur_tab->cur_path[len + 1] = '\0';
-     }
-   
etk_entry_text_set(ETK_ENTRY(etk_combobox_entry_entry_get(ETK_COMBOBOX_ENTRY(e->combobox_entry))),
 e->cur_tab->cur_path);
+   etk_tree_freeze(ETK_TREE(e->cur_tab->dtree));   
    
    while ((dir_entry = readdir(dir)) != NULL)
      {
@@ -247,6 +248,7 @@
        char imagereal[PATH_MAX];
        struct stat st;
 
+       ++i;
         /* Do not include current dir/above dir */
        if ((!strcmp (dir_entry->d_name, ".")) || (!strcmp (dir_entry->d_name, 
"..")))
          continue;
@@ -254,10 +256,10 @@
         /* Show hidden files and directories? */
        if ((!e->options->list_hidden) && (dir_entry->d_name[0] == '.'))
          continue;
-
+       
        snprintf(image, PATH_MAX, "%s", dir_entry->d_name);
 
-       if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS)
+       if (data->update == EX_TREE_UPDATE_ALL || data->update == 
EX_TREE_UPDATE_DIRS)
          {
             if(stat(image, &st) == -1) continue;
             if(S_ISDIR(st.st_mode))
@@ -273,7 +275,7 @@
          }
 
        /* If we don't want to do the rtree updating */
-       if (update == EX_TREE_UPDATE_DIRS)
+       if (data->update == EX_TREE_UPDATE_DIRS)
          continue;
 
        if ((!e->options->show_all_filetypes) && 
(!_ex_file_is_viewable(dir_entry->d_name)))
@@ -282,13 +284,19 @@
        if(!realpath(image, imagereal))
          snprintf(imagereal, PATH_MAX, "%s", image);
 
-       _ex_main_itree_add(imagereal, selected_file);   
+       _ex_main_itree_add(imagereal, data->selected_file);
+       
+       if (i == MAX_INSERTS_PER_ITERATION)
+         {
+            etk_tree_thaw(ETK_TREE(e->cur_tab->itree));
+            etk_tree_thaw(ETK_TREE(e->cur_tab->dtree));
+            
+            ecore_timer_add(INSERTS_INTERVAL, 
_ex_main_populate_files_timer_cb, data);
+            return 0;
+         }
      }
 
-   etk_tree_thaw(ETK_TREE(e->cur_tab->itree));
-   etk_tree_thaw(ETK_TREE(e->cur_tab->dtree));
-
-   if (update == EX_TREE_UPDATE_FILES || update == EX_TREE_UPDATE_ALL)
+   if (data->update == EX_TREE_UPDATE_FILES || data->update == 
EX_TREE_UPDATE_ALL)
      {
        if (e->options->default_sort == EX_SORT_BY_DATE)
          _ex_sort_date_cb(NULL, NULL);
@@ -300,9 +308,12 @@
          _ex_sort_resol_cb(NULL, NULL);
      }
 
-   if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS)
-     etk_tree_col_sort_full(e->cur_tab->dcol, _ex_main_dtree_compare_cb, 
-                           NULL, ETK_TRUE);
+   if (data->update == EX_TREE_UPDATE_ALL || data->update == 
EX_TREE_UPDATE_DIRS)
+     etk_tree_col_sort_full(e->cur_tab->dcol, _ex_main_dtree_compare_cb,
+                           NULL, ETK_TRUE);   
+   
+   etk_tree_thaw(ETK_TREE(e->cur_tab->itree));
+   etk_tree_thaw(ETK_TREE(e->cur_tab->dtree));   
 
    if (!e->cur_tab->monitor)
      {
@@ -310,13 +321,58 @@
        e->cur_tab->monitor = ecore_file_monitor_add(e->cur_tab->cur_path, 
              _ex_main_monitor_dir, NULL);
      }
+      
+   dir = NULL;
+   closedir(dir);
+   free(data->selected_file);
+   free(data);
+   return 0;
+}
+
+void
+_ex_main_populate_files(const char *selected_file, Ex_Tree_Update update)
+{
+   char back[PATH_MAX];
+   Ex_Populate_Data *data;
+   
+   _ex_main_image_unset();
+   chdir(e->cur_tab->dir);
+   
+   if (update == EX_TREE_UPDATE_ALL || update == EX_TREE_UPDATE_DIRS)
+     {
+       snprintf(back, PATH_MAX, "..");
+       etk_tree_row_append(ETK_TREE(e->cur_tab->dtree), NULL, e->cur_tab->dcol,
+                     etk_theme_icon_path_get(), "actions/go-up_16", back, 
NULL);
+     }
 
+   if (e->cur_tab->monitor)
+     {
+       D(("Removing old monitoring\n"));
+       ecore_file_monitor_del(e->cur_tab->monitor);
+       e->cur_tab->monitor = NULL;
+     }
+   
+   getcwd(e->cur_tab->cur_path, PATH_MAX);
+   if (strlen(e->cur_tab->cur_path) < PATH_MAX - 2)
+     {
+       int len = strlen(e->cur_tab->cur_path);
+       e->cur_tab->cur_path[len] = '/';
+       e->cur_tab->cur_path[len + 1] = '\0';
+     }
+   
etk_entry_text_set(ETK_ENTRY(etk_combobox_entry_entry_get(ETK_COMBOBOX_ENTRY(e->combobox_entry))),
 e->cur_tab->cur_path);
+   
+   data = calloc(1, sizeof(Ex_Populate_Data));
+   if (selected_file)
+     data->selected_file = strdup(selected_file);
+   else
+     data->selected_file = NULL;
+   data->update = update;
+   ecore_timer_add(0.001, _ex_main_populate_files_timer_cb, data);  
+   
    /* Set the dir to the current dir at the end so we avoid stepdown 
     * like ".." if we just call the refresh on the listing like after a delete
     */
-   e->cur_tab->dir = strdup(".");
-   
-   closedir(dir);
+   e->cur_tab->dir = strdup(".");      
 }
 
 void



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to