Index: apps/filetree.c =================================================================== --- apps/filetree.c (revision 31426) +++ apps/filetree.c (working copy) @@ -52,6 +52,7 @@ #include "radio.h" #endif #include "wps.h" +#include "logf.h" static int compare_sort_dir; /* qsort key for sorting directories */ @@ -293,6 +294,13 @@ int ft_load(struct tree_context* c, cons c->dirsindir = 0; c->dirfull = false; +#ifdef HAVE_DIRCACHE + while(dircache_is_initializing()) { + splash(0, str(LANG_SCANNING_DISK)); + sleep(0); + } +#endif /* HAVE_DIRCACHE */ + tree_lock_cache(c); while ((entry = readdir(dir))) { int len; @@ -323,6 +331,32 @@ int ft_load(struct tree_context* c, cons continue; } +#ifdef HAVE_DIRCACHE + /* Hide empty directories */ + /* XXX:Empty directories are displayed until dircache is initialized */ + if ((info.attribute & ATTR_DIRECTORY) && ( + (*c->dirfilter != SHOW_ALL) && + (info.attribute & ATTR_DIR_EMPTY))) + { + logf("filetree: %s", entry->d_name); + continue; + } + + /* filter out non-visible directories */ + /* XXX:filter out directories are displayed until dircache is initialized */ + if (dircache_is_enabled() && + (info.attribute & ATTR_DIRECTORY) && ( + (*c->dirfilter == SHOW_PLAYLIST && + (!((info.attribute & ATTR_DIR_MASK) & ATTR_DIR_M3U))) || + ((*c->dirfilter == SHOW_MUSIC && + (!((info.attribute & ATTR_DIR_MASK) & (ATTR_DIR_AUDIO | ATTR_DIR_M3U))))) || + ((*c->dirfilter == SHOW_SUPPORTED && + (!((info.attribute & ATTR_DIR_MASK) & ATTR_DIR_SUPPORTED)))))) + { + continue; + } +#endif /* HAVE_DIRCACHE */ + dptr->attr = info.attribute; /* check for known file types */ Index: apps/main.c =================================================================== --- apps/main.c (revision 31426) +++ apps/main.c (working copy) @@ -384,6 +384,7 @@ static void init(void) settings_reset(); settings_load(SETTINGS_ALL); settings_apply(true); + filetype_init(); init_dircache(true); init_dircache(false); #ifdef HAVE_TAGCACHE @@ -391,7 +392,6 @@ static void init(void) #endif sleep(HZ/2); tree_mem_init(); - filetype_init(); playlist_init(); shortcuts_init(); @@ -654,6 +654,7 @@ static void init(void) CHART(">settings_apply(true)"); settings_apply(true); CHART("init_dircache(false)"); init_dircache(false); CHART("= 0 && ce) { if(ce->d_name != NULL && ce->down != NULL && strcmp(ce->d_name, ".") && strcmp(ce->d_name, "..")) rc = sab_process_dir(ce->startcluster, ce->down); + + if (!(ce->info.attribute & ATTR_HIDDEN)) { + if (ce->info.attribute & ATTR_DIRECTORY) { + if (strcmp(ce->d_name, ".") && strcmp(ce->d_name, "..") && + !(ce->info.attribute & ATTR_DIR_EMPTY)) + fc++; + attr |= ATTR_DIR_MASK & ce->info.attribute; + } else { + fc++; + int fattr = filetype_get_attr((char *)ce->d_name); + if (fattr == FILE_ATTR_AUDIO) + attr |= ATTR_DIR_AUDIO; + if (fattr == FILE_ATTR_M3U) + attr |= ATTR_DIR_M3U; + if (filetype_supported(fattr)) + attr |= ATTR_DIR_SUPPORTED; + } + } ce = ce->next; } + + if (first_ce->up) { + if (!fc) + first_ce->up->info.attribute |= ATTR_DIR_EMPTY; + first_ce->up->info.attribute |= attr; + } return rc; } @@ -417,6 +444,8 @@ static int sab_process_dir(struct dircac { struct dirent_uncached *entry; struct dircache_entry *first_ce = ce; + int fc = 0; /* file counter */ + int attr = 0; DIR_UNCACHED *dir = opendir_uncached(sab_path); if(dir == NULL) { @@ -460,6 +489,22 @@ static int sab_process_dir(struct dircac closedir_uncached(dir); return rc; } + if (!(ce->info.attribute & ATTR_HIDDEN)) { + if (!(ce->info.attribute & ATTR_DIR_EMPTY)) + fc++; + attr |= ATTR_DIR_MASK & ce->info.attribute; + } + } else { + if (!(ce->info.attribute & ATTR_HIDDEN)) { + fc++; + int fattr = filetype_get_attr((char *)ce->d_name); + if (fattr == FILE_ATTR_AUDIO) + attr |= ATTR_DIR_AUDIO; + if (fattr == FILE_ATTR_M3U) + attr |= ATTR_DIR_M3U; + if (filetype_supported(fattr)) + attr |= ATTR_DIR_SUPPORTED; + } } ce = dircache_gen_next(ce); @@ -475,6 +520,12 @@ static int sab_process_dir(struct dircac yield(); } } + + if (first_ce->up) { + if (!fc) + first_ce->up->info.attribute |= ATTR_DIR_EMPTY; + first_ce->up->info.attribute |= attr; + } /* add "." and ".." */ ce->d_name = dot;