diff options
author | William Wilgus <wilgus.william@gmail.com> | 2024-05-04 08:41:16 -0400 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2024-05-05 14:01:43 -0400 |
commit | d7c541742f5e6ec07dbcc8e1346efde9d807437e (patch) | |
tree | 2c3325b652999bd9b2443eb96d8d32035d3c4c18 /apps/filetree.c | |
parent | efcea6628024c5f6796c3850c3779801db4b6874 (diff) | |
download | rockbox-d7c541742f5e6ec07dbcc8e1346efde9d807437e.tar.gz rockbox-d7c541742f5e6ec07dbcc8e1346efde9d807437e.zip |
Allow first level folders in plugin menu
add sorting directories as files
move picross files to a hidden folder
use directory for lua_scripts, sgt_puzzles
make plugin browser able to handle 1st level directories
Change-Id: I30852d71dc992c378d5790756e94f06f5a2e9bef
Diffstat (limited to 'apps/filetree.c')
-rw-r--r-- | apps/filetree.c | 68 |
1 files changed, 35 insertions, 33 deletions
diff --git a/apps/filetree.c b/apps/filetree.c index b5f5dece5a..594a0bd6f1 100644 --- a/apps/filetree.c +++ b/apps/filetree.c | |||
@@ -224,7 +224,11 @@ static int compare(const void* p1, const void* p2) | |||
224 | struct entry* e2 = (struct entry*)p2; | 224 | struct entry* e2 = (struct entry*)p2; |
225 | int criteria; | 225 | int criteria; |
226 | 226 | ||
227 | if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) | 227 | if (cmp_data.sort_dir == SORT_AS_FILE) |
228 | { /* treat as two files */ | ||
229 | criteria = global_settings.sort_file; | ||
230 | } | ||
231 | else if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) | ||
228 | { /* two directories */ | 232 | { /* two directories */ |
229 | criteria = cmp_data.sort_dir; | 233 | criteria = cmp_data.sort_dir; |
230 | 234 | ||
@@ -326,18 +330,17 @@ int ft_load(struct tree_context* c, const char* tempdir) | |||
326 | info = dir_get_info(dir, entry); | 330 | info = dir_get_info(dir, entry); |
327 | len = strlen((char *)entry->d_name); | 331 | len = strlen((char *)entry->d_name); |
328 | 332 | ||
329 | /* skip directories . and .. */ | ||
330 | if ((info.attribute & ATTR_DIRECTORY) && | ||
331 | (((len == 1) && (!strncmp((char *)entry->d_name, ".", 1))) || | ||
332 | ((len == 2) && (!strncmp((char *)entry->d_name, "..", 2))))) { | ||
333 | continue; | ||
334 | } | ||
335 | |||
336 | /* Skip FAT volume ID */ | 333 | /* Skip FAT volume ID */ |
337 | if (info.attribute & ATTR_VOLUME_ID) { | 334 | if (info.attribute & ATTR_VOLUME_ID) { |
338 | continue; | 335 | continue; |
339 | } | 336 | } |
340 | 337 | ||
338 | dptr->attr = info.attribute; | ||
339 | int dir_attr = (dptr->attr & ATTR_DIRECTORY); | ||
340 | /* skip directories . and .. */ | ||
341 | if (dir_attr && is_dotdir_name(entry->d_name)) | ||
342 | continue; | ||
343 | |||
341 | /* filter out dotfiles and hidden files */ | 344 | /* filter out dotfiles and hidden files */ |
342 | if (*c->dirfilter != SHOW_ALL && | 345 | if (*c->dirfilter != SHOW_ALL && |
343 | ((entry->d_name[0]=='.') || | 346 | ((entry->d_name[0]=='.') || |
@@ -345,48 +348,45 @@ int ft_load(struct tree_context* c, const char* tempdir) | |||
345 | continue; | 348 | continue; |
346 | } | 349 | } |
347 | 350 | ||
348 | dptr->attr = info.attribute; | ||
349 | int dir_attr = (dptr->attr & ATTR_DIRECTORY); | ||
350 | |||
351 | /* check for known file types */ | 351 | /* check for known file types */ |
352 | if ( !(dir_attr) ) | 352 | if ( !(dir_attr) ) |
353 | dptr->attr |= filetype_get_attr((char *)entry->d_name); | 353 | dptr->attr |= filetype_get_attr((char *)entry->d_name); |
354 | 354 | ||
355 | int file_attr = (dptr->attr & FILE_ATTR_MASK); | 355 | int file_attr = (dptr->attr & FILE_ATTR_MASK); |
356 | 356 | ||
357 | #define CHK_FT(show,attr) (*c->dirfilter == (show) && file_attr != (attr)) | ||
357 | /* filter out non-visible files */ | 358 | /* filter out non-visible files */ |
358 | if ((!(dir_attr) && ((*c->dirfilter == SHOW_PLAYLIST && | 359 | if ((!(dir_attr) && (CHK_FT(SHOW_PLAYLIST, FILE_ATTR_M3U) || |
359 | file_attr != FILE_ATTR_M3U) || | 360 | (CHK_FT(SHOW_MUSIC, FILE_ATTR_AUDIO) && file_attr != FILE_ATTR_M3U) || |
360 | ((*c->dirfilter == SHOW_MUSIC && file_attr != FILE_ATTR_AUDIO) && | ||
361 | file_attr != FILE_ATTR_M3U) || | ||
362 | (*c->dirfilter == SHOW_SUPPORTED && !filetype_supported(dptr->attr)))) || | 361 | (*c->dirfilter == SHOW_SUPPORTED && !filetype_supported(dptr->attr)))) || |
363 | (*c->dirfilter == SHOW_WPS && file_attr != FILE_ATTR_WPS) || | 362 | CHK_FT(SHOW_WPS, FILE_ATTR_WPS) || |
364 | (*c->dirfilter == SHOW_FONT && file_attr != FILE_ATTR_FONT) || | 363 | CHK_FT(SHOW_FONT, FILE_ATTR_FONT) || |
365 | (*c->dirfilter == SHOW_SBS && file_attr != FILE_ATTR_SBS) || | 364 | CHK_FT(SHOW_SBS, FILE_ATTR_SBS) || |
366 | #if CONFIG_TUNER | 365 | #if CONFIG_TUNER |
367 | (*c->dirfilter == SHOW_FMS && file_attr != FILE_ATTR_FMS) || | 366 | CHK_FT(SHOW_FMS, FILE_ATTR_FMS) || |
367 | CHK_FT(SHOW_FMR, FILE_ATTR_FMR) || | ||
368 | #endif | 368 | #endif |
369 | #ifdef HAVE_REMOTE_LCD | 369 | #ifdef HAVE_REMOTE_LCD |
370 | (*c->dirfilter == SHOW_RWPS && file_attr != FILE_ATTR_RWPS) || | 370 | CHK_FT(SHOW_RWPS, FILE_ATTR_RWPS) || |
371 | (*c->dirfilter == SHOW_RSBS && file_attr != FILE_ATTR_RSBS) || | 371 | CHK_FT(SHOW_RSBS, FILE_ATTR_RSBS) || |
372 | #if CONFIG_TUNER | 372 | #if CONFIG_TUNER |
373 | (*c->dirfilter == SHOW_RFMS && file_attr != FILE_ATTR_RFMS) || | 373 | CHK_FT(SHOW_RFMS, FILE_ATTR_RFMS) || |
374 | #endif | ||
375 | #endif | 374 | #endif |
376 | #if CONFIG_TUNER | ||
377 | (*c->dirfilter == SHOW_FMR && file_attr != FILE_ATTR_FMR) || | ||
378 | #endif | 375 | #endif |
379 | (*c->dirfilter == SHOW_M3U && file_attr != FILE_ATTR_M3U) || | 376 | CHK_FT(SHOW_M3U, FILE_ATTR_M3U) || |
380 | (*c->dirfilter == SHOW_CFG && file_attr != FILE_ATTR_CFG) || | 377 | CHK_FT(SHOW_CFG, FILE_ATTR_CFG) || |
381 | (*c->dirfilter == SHOW_LNG && file_attr != FILE_ATTR_LNG) || | 378 | CHK_FT(SHOW_LNG, FILE_ATTR_LNG) || |
382 | (*c->dirfilter == SHOW_MOD && file_attr != FILE_ATTR_MOD) || | 379 | CHK_FT(SHOW_MOD, FILE_ATTR_MOD) || |
383 | (*c->dirfilter == SHOW_PLUGINS && file_attr != FILE_ATTR_ROCK && | 380 | /* show first level directories */ |
384 | file_attr != FILE_ATTR_LUA && | 381 | ((!(dir_attr) || c->dirlevel > 0) && |
385 | file_attr != FILE_ATTR_OPX) || | 382 | CHK_FT(SHOW_PLUGINS, FILE_ATTR_ROCK) && |
383 | file_attr != FILE_ATTR_LUA && | ||
384 | file_attr != FILE_ATTR_OPX) || | ||
386 | (callback_show_item && !callback_show_item(entry->d_name, dptr->attr, c))) | 385 | (callback_show_item && !callback_show_item(entry->d_name, dptr->attr, c))) |
387 | { | 386 | { |
388 | continue; | 387 | continue; |
389 | } | 388 | } |
389 | #undef CHK_FT | ||
390 | 390 | ||
391 | if (len > c->cache.name_buffer_size - name_buffer_used - 1) { | 391 | if (len > c->cache.name_buffer_size - name_buffer_used - 1) { |
392 | /* Tell the world that we ran out of buffer space */ | 392 | /* Tell the world that we ran out of buffer space */ |
@@ -408,7 +408,9 @@ int ft_load(struct tree_context* c, const char* tempdir) | |||
408 | c->dirlength = files_in_dir; | 408 | c->dirlength = files_in_dir; |
409 | closedir(dir); | 409 | closedir(dir); |
410 | 410 | ||
411 | cmp_data.sort_dir = c->sort_dir; | 411 | /* allow directories to be sorted into file list */ |
412 | cmp_data.sort_dir = (*c->dirfilter == SHOW_PLUGINS) ? SORT_AS_FILE : c->sort_dir; | ||
413 | |||
412 | if (global_settings.sort_case) | 414 | if (global_settings.sort_case) |
413 | { | 415 | { |
414 | if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER) | 416 | if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER) |