|
11 | 11 | //}#pragma endregion Odroid
|
12 | 12 |
|
13 | 13 | //{#pragma region Global
|
| 14 | + bool SAVED = false; |
| 15 | + bool RESTART = false; |
| 16 | + bool LAUNCHER = false; |
| 17 | + bool FOLDER = false; |
| 18 | + |
14 | 19 | int STEP = 1;
|
15 | 20 | int OPTION = 0;
|
16 |
| - bool SAVED = false; |
| 21 | + int PREVIOUS = 0; |
17 | 22 | int8_t USER;
|
18 |
| - bool RESTART = false; |
| 23 | + |
19 | 24 | char** FILES;
|
| 25 | + char folder_path[256] = ""; |
| 26 | + |
20 | 27 | DIR *directory;
|
21 | 28 | struct dirent *file;
|
22 | 29 | //}#pragma endregion Global
|
|
227 | 234 | //{#pragma region Text
|
228 | 235 | int get_letter(char letter) {
|
229 | 236 | int dx = 0;
|
230 |
| - char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!-'&?.,/()[]~ "; |
231 |
| - char lower[] = "abcdefghijklmnopqrstuvwxyz0123456789!-'&?.,/()[]~ "; |
| 237 | + char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!-'&?.,/()[] "; |
| 238 | + char lower[] = "abcdefghijklmnopqrstuvwxyz0123456789!-'&?.,/()[] "; |
232 | 239 | for(int n = 0; n < strlen(upper); n++) {
|
233 | 240 | if(letter == upper[n] || letter == lower[n]) {
|
234 | 241 | return letter != ' ' ? n * 5 : 0;
|
|
360 | 367 | }
|
361 | 368 | }
|
362 | 369 |
|
| 370 | + void draw_folder(int x, int y, bool current) { |
| 371 | + int i = 0; |
| 372 | + for(int h = 0; h < 16; h++) { |
| 373 | + for(int w = 0; w < 16; w++) { |
| 374 | + buffer[i] = folder[h][w] == WHITE ? current ? WHITE : GUI.fg : GUI.bg; |
| 375 | + i++; |
| 376 | + } |
| 377 | + } |
| 378 | + ili9341_write_frame_rectangleLE(x, y, 16, 16, buffer); |
| 379 | + } |
| 380 | + |
363 | 381 | void draw_media(int x, int y, bool current) {
|
364 | 382 | int offset = (STEP-1) * 16;
|
365 | 383 | int i = 0;
|
|
561 | 579 | //}#pragma endregion Sort
|
562 | 580 |
|
563 | 581 | void get_files() {
|
564 |
| - ROMS.total = 0; |
565 |
| - |
566 | 582 | FILES = (char**)malloc(MAX_FILES * sizeof(void*));
|
| 583 | + ROMS.total = 0; |
567 | 584 |
|
568 | 585 | char path[256] = "/sd/roms/";
|
569 | 586 | strcat(&path[strlen(path) - 1], DIRECTORIES[STEP]);
|
| 587 | + strcat(&path[strlen(path) - 1],folder_path); |
| 588 | + printf("\npath:%s", path); |
| 589 | + |
570 | 590 | strcpy(ROM.path, path);
|
571 |
| - //bool files = !(directory = opendir(path)) ? false : true; |
| 591 | + |
572 | 592 | DIR *directory = opendir(path);
|
573 | 593 |
|
574 | 594 | if(directory == NULL) {
|
575 | 595 | char message[100] = "no games available";
|
576 | 596 | int center = ceil((320/2)-((strlen(message)*5)/2));
|
577 | 597 | draw_text(center,134,message,false,false);
|
578 | 598 | } else {
|
| 599 | + struct dirent *file; |
579 | 600 | while ((file = readdir(directory)) != NULL) {
|
580 | 601 | int rom_length = strlen(file->d_name);
|
581 | 602 | int ext_lext = strlen(EXTENSIONS[STEP]);
|
582 | 603 | bool extenstion = strcmp(&file->d_name[rom_length - ext_lext], EXTENSIONS[STEP]) == 0 && file->d_name[0] != '.';
|
583 |
| - if(extenstion) { |
| 604 | + if(extenstion || (file->d_type == 2)) { |
| 605 | + if(ROMS.total >= MAX_FILES) { break; } |
584 | 606 | size_t len = strlen(file->d_name);
|
585 |
| - FILES[ROMS.total] = (char*)malloc(len + 1); |
586 |
| - strcpy(FILES[ROMS.total], file->d_name); |
| 607 | + FILES[ROMS.total] = (file->d_type == 2) ? (char*)malloc(len + 5) : (char*)malloc(len + 1); |
| 608 | + if((file->d_type == 2)) { |
| 609 | + char dir[256]; |
| 610 | + strcpy(dir, file->d_name); |
| 611 | + char dd[8]; |
| 612 | + sprintf(dd, "%s", ext_lext == 2 ? "dir" : ".dir"); |
| 613 | + strcat(&dir[strlen(dir) - 1], dd); |
| 614 | + strcpy(FILES[ROMS.total], dir); |
| 615 | + } else { |
| 616 | + strcpy(FILES[ROMS.total], file->d_name); |
| 617 | + } |
587 | 618 | ROMS.total++;
|
588 |
| - if(ROMS.total > MAX_FILES) { break; } |
589 | 619 | }
|
590 | 620 | }
|
591 | 621 | ROMS.pages = ROMS.total/ROMS.limit;
|
| 622 | + if(ROMS.offset > ROMS.total) { ROMS.offset = 0;} |
592 | 623 |
|
593 | 624 | closedir(directory);
|
594 |
| - free(FILES); |
595 |
| - |
596 | 625 | if(ROMS.total < 500) sort_files(FILES);
|
597 | 626 | draw_files();
|
| 627 | + |
| 628 | + //free(FILES); |
598 | 629 | }
|
599 | 630 | }
|
600 | 631 |
|
|
618 | 649 | int limit = (ROMS.offset + ROMS.limit) > ROMS.total ? ROMS.total : ROMS.offset + ROMS.limit;
|
619 | 650 | for(int n = ROMS.offset; n < limit; n++) {
|
620 | 651 | draw_text(x+24,y,FILES[n],true,n == ROMS.offset ? true : false);
|
621 |
| - draw_media(x,y-6,n == ROMS.offset ? true : false); |
| 652 | + |
| 653 | + bool directory = strcmp(&FILES[n][strlen(FILES[n]) - 3], "dir") == 0; |
| 654 | + directory ? draw_folder(x,y-6,n == ROMS.offset ? true : false) : draw_media(x,y-6,n == ROMS.offset ? true : false); |
622 | 655 | if(n == ROMS.offset) {
|
623 | 656 | strcpy(ROM.name, FILES[n]);
|
624 | 657 | ROM.ready = true;
|
|
908 | 941 | LEFT
|
909 | 942 | */
|
910 | 943 | if(gamepad.values[ODROID_INPUT_LEFT]) {
|
911 |
| - if(!LAUNCHER) { |
| 944 | + if(!LAUNCHER && !FOLDER) { |
912 | 945 | STEP--;
|
913 | 946 | if( STEP < 0 ) {
|
914 | 947 | STEP = COUNT - 1;
|
|
925 | 958 | RIGHT
|
926 | 959 | */
|
927 | 960 | if(gamepad.values[ODROID_INPUT_RIGHT]) {
|
928 |
| - if(!LAUNCHER) { |
| 961 | + if(!LAUNCHER && !FOLDER) { |
929 | 962 | STEP++;
|
930 | 963 | if( STEP > COUNT-1 ) {
|
931 | 964 | STEP = 0;
|
|
1035 | 1068 | } else {
|
1036 | 1069 | if (ROM.ready && !LAUNCHER) {
|
1037 | 1070 | OPTION = 0;
|
1038 |
| - LAUNCHER = true; |
1039 |
| - |
1040 | 1071 | char file_to_load[256] = "";
|
1041 | 1072 | sprintf(file_to_load, "%s/%s", ROM.path, ROM.name);
|
1042 |
| - odroid_settings_RomFilePath_set(file_to_load); |
1043 |
| - |
1044 |
| - draw_launcher(); |
| 1073 | + bool directory = strcmp(&file_to_load[strlen(file_to_load) - 3], "dir") == 0; |
| 1074 | + |
| 1075 | + if(directory) { |
| 1076 | + FOLDER = true; |
| 1077 | + PREVIOUS = ROMS.offset; |
| 1078 | + ROMS.offset = 0; |
| 1079 | + ROMS.total = 0; |
| 1080 | + |
| 1081 | + sprintf(folder_path, "/%s", ROM.name); |
| 1082 | + folder_path[strlen(folder_path)-(strlen(EXTENSIONS[STEP]) == 3 ? 4 : 3)] = 0; |
| 1083 | + draw_background(); |
| 1084 | + draw_systems(); |
| 1085 | + draw_text(16,16,EMULATORS[STEP],false,true); |
| 1086 | + get_files(); |
| 1087 | + } else { |
| 1088 | + LAUNCHER = true; |
| 1089 | + odroid_settings_RomFilePath_set(file_to_load); |
| 1090 | + draw_launcher(); |
| 1091 | + } |
1045 | 1092 | } else {
|
1046 | 1093 | switch(OPTION) {
|
1047 | 1094 | case 0:
|
|
1069 | 1116 | draw_text(16,16,EMULATORS[STEP],false,true);
|
1070 | 1117 | STEP == 0 ? draw_themes() : draw_files();
|
1071 | 1118 | }
|
| 1119 | + if(FOLDER) { |
| 1120 | + FOLDER = false; |
| 1121 | + ROMS.offset = PREVIOUS; |
| 1122 | + ROMS.total = 0; |
| 1123 | + PREVIOUS = 0; |
| 1124 | + folder_path[0] = 0; |
| 1125 | + get_files(); |
| 1126 | + } |
1072 | 1127 | debounce(ODROID_INPUT_B);
|
1073 | 1128 | }
|
1074 | 1129 |
|
|
0 commit comments