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