⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -