📄 tree.c
字号:
lcd_setfont(FONT_UI); lcd_getstringsize("A", &fw, &fh); tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh; line_height = fh;#else tree_max_on_screen = TREE_MAX_ON_SCREEN;#endif /* new dir? cache it */ if (strncmp(path,lastdir,sizeof(lastdir)) || reload_dir) { if (!load_and_sort_directory(path, dirfilter, &filesindir, &dir_buffer_full)) return -1; if ( dir_buffer_full || filesindir == max_files_in_dir ) {#ifdef HAVE_LCD_CHARCELLS lcd_double_height(false);#endif lcd_clear_display(); lcd_puts(0,0,str(LANG_SHOWDIR_ERROR_BUFFER)); lcd_puts(0,1,str(LANG_SHOWDIR_ERROR_FULL)); lcd_update(); sleep(HZ*2); lcd_clear_display(); } } if (start == -1) { int diff_files; /* use lastfile to determine start (default=0) */ start = 0; for (i=0; i<filesindir; i++) { if (!strcasecmp(dircache[i].name, lastfile)) { start = i; break; } } diff_files = filesindir - start; if (diff_files < tree_max_on_screen) { int oldstart = start; start -= (tree_max_on_screen - diff_files); if (start < 0) start = 0; dircursor = oldstart - start; } dirstart = start; } /* The cursor might point to an invalid line, for example if someone deleted the last file in the dir */ if(filesindir) { while(start + dircursor >= filesindir) { if(start) start--; else if(dircursor) dircursor--; } dirstart = start; }#ifdef HAVE_LCD_CHARCELLS lcd_stop_scroll(); lcd_double_height(false);#endif lcd_clear_display();#ifdef HAVE_LCD_BITMAP lcd_setmargins(MARGIN_X,MARGIN_Y); /* leave room for cursor and icon */ lcd_setfont(FONT_UI);#endif for ( i=start; i < start+tree_max_on_screen; i++ ) { int len; unsigned j; if ( i >= filesindir ) break; len = strlen(dircache[i].name); if (dircache[i].attr & ATTR_DIRECTORY) { icon_type = Folder; } else { /* search which icon to use */ icon_type = -1; /* default to none */ for (j=0; j<sizeof(filetypes)/sizeof(*filetypes); j++) { if ((dircache[i].attr & TREE_ATTR_MASK) == filetypes[j].tree_attr) { icon_type = filetypes[j].icon; break; } } if (icon_type == -1) {#ifdef HAVE_LCD_BITMAP icon_type = 0;#else icon_type = Unknown;#endif } } if (icon_type && global_settings.show_icons) {#ifdef HAVE_LCD_BITMAP int offset=0; if ( line_height > 8 ) offset = (line_height - 8) / 2; lcd_bitmap(bitmap_icons_6x8[icon_type], CURSOR_X * 6 + CURSOR_WIDTH, MARGIN_Y+(i-start)*line_height + offset, 6, 8, true);#else lcd_putc(LINE_X-1, i-start, icon_type);#endif } showfileline(i-start, i, false, dirfilter); /* no scroll */ }#ifdef HAVE_LCD_BITMAP if (global_settings.scrollbar && (filesindir > tree_max_on_screen)) scrollbar(SCROLLBAR_X, SCROLLBAR_Y, SCROLLBAR_WIDTH - 1, LCD_HEIGHT - SCROLLBAR_Y, filesindir, start, start + tree_max_on_screen, VERTICAL);#endif status_draw(true); return filesindir;}static bool ask_resume(bool ask_once){ bool stop = false;#ifdef HAVE_LCD_CHARCELLS lcd_double_height(false);#endif if (usb_detect()) { usb_screen(); return false; } /* always resume? */ if ( global_settings.resume == RESUME_ON ) return true; lcd_clear_display(); lcd_puts(0,0,str(LANG_RESUME_ASK));#ifdef HAVE_LCD_CHARCELLS status_draw(false); lcd_puts(0,1,str(LANG_RESUME_CONFIRM_PLAYER));#else lcd_puts(0,1,str(LANG_CONFIRM_WITH_PLAY_RECORDER)); lcd_puts(0,2,str(LANG_CANCEL_WITH_ANY_RECORDER));#endif lcd_update(); while (!stop) { switch (button_get(true)) { case BUTTON_PLAY:#ifdef BUTTON_RC_PLAY case BUTTON_RC_PLAY:#endif return true;#ifdef BUTTON_ON /* ignore the ON button, since it might still be pressed since booting */ case BUTTON_ON: case BUTTON_ON | BUTTON_REL: case BUTTON_ON | BUTTON_REPEAT: break;#endif case SYS_USB_CONNECTED: usb_screen(); stop = true; break; default: stop = true; break; } } if ( global_settings.resume == RESUME_ASK_ONCE && ask_once) { global_settings.resume_index = -1; settings_save(); } return false;}/* load tracks from specified directory to resume play */void resume_directory(char *dir){ bool buffer_full; if (!load_and_sort_directory(dir, &global_settings.dirfilter, &filesindir, &buffer_full)) return; lastdir[0] = 0; build_playlist(0);}/* Returns the current working directory and also writes cwd to buf if non-NULL. In case of error, returns NULL. */char *getcwd(char *buf, int size){ if (!buf) return currdir; else if (size > 0) { strncpy(buf, currdir, size); return buf; } else return NULL;}/* Force a reload of the directory next time directory browser is called */void reload_directory(void){ reload_dir = true;}static void start_resume(bool ask_once){ if ( global_settings.resume && global_settings.resume_index != -1 ) { DEBUGF("Resume index %X offset %X\n", global_settings.resume_index, global_settings.resume_offset); if (!ask_resume(ask_once)) return; if (playlist_resume() != -1) { playlist_start(global_settings.resume_index, global_settings.resume_offset); start_wps = true; } else return; }}void set_current_file(char *path){ char *name; unsigned int i; /* separate directory from filename */ name = strrchr(path+1,'/'); if (name) { *name = 0; strcpy(currdir, path); *name = '/'; name++; } else { strcpy(currdir, "/"); name = path+1; } strcpy(lastfile, name); dircursor = 0; dirstart = -1; if (strncmp(currdir,lastdir,sizeof(lastdir))) { dirlevel = 0; dirpos[dirlevel] = -1; cursorpos[dirlevel] = 0; /* use '/' to calculate dirlevel */ for (i=1; i<strlen(path)+1; i++) { if (path[i] == '/') { dirlevel++; dirpos[dirlevel] = -1; cursorpos[dirlevel] = 0; } } }}#ifdef BUTTON_ONstatic bool handle_on(int *ds, int *dc, int numentries, int tree_max_on_screen, int *dirfilter){ bool exit = false; bool used = false; int dirstart = *ds; int dircursor = *dc; char buf[MAX_PATH];#ifdef HAVE_LCD_BITMAP int fw, fh; lcd_getstringsize("A", &fw, &fh);#endif while (!exit) { switch (button_get(true)) { case TREE_PREV:#ifdef BUTTON_RC_LEFT case BUTTON_RC_LEFT:#endif#ifdef BUTTON_ON case BUTTON_ON | TREE_PREV: case BUTTON_ON | TREE_PREV | BUTTON_REPEAT:#endif used = true; if ( dirstart ) { dirstart -= tree_max_on_screen; if ( dirstart < 0 ) dirstart = 0; } else dircursor = 0; break; case TREE_NEXT:#ifdef BUTTON_RC_RIGHT case BUTTON_RC_RIGHT:#endif#ifdef BUTTON_ON case BUTTON_ON | TREE_NEXT: case BUTTON_ON | TREE_NEXT | BUTTON_REPEAT:#endif used = true; if ( dirstart < numentries - tree_max_on_screen ) { dirstart += tree_max_on_screen; if ( dirstart > numentries - tree_max_on_screen ) dirstart = numentries - tree_max_on_screen; } else dircursor = numentries - dirstart - 1; break; case BUTTON_PLAY:#ifdef BUTTON_RC_PLAY case BUTTON_RC_PLAY:#endif#ifdef BUTTON_ON case BUTTON_ON | BUTTON_PLAY:#endif { int onplay_result; if(!numentries) onplay_result = onplay(NULL, 0); else { if (currdir[1]) snprintf(buf, sizeof buf, "%s/%s", currdir, dircache[dircursor+dirstart].name); else snprintf(buf, sizeof buf, "/%s", dircache[dircursor+dirstart].name); onplay_result = onplay(buf, dircache[dircursor+dirstart].attr); } switch (onplay_result) { case ONPLAY_OK: used = true; break; case ONPLAY_RELOAD_DIR: reload_dir = 1; used = true; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -