diff --git a/file_io.cpp b/file_io.cpp index 27865ac..0e40807 100644 --- a/file_io.cpp +++ b/file_io.cpp @@ -1245,7 +1245,11 @@ int ScanDirectory(char* path, int mode, const char *extension, int options, cons iSelectedEntry++; if (iSelectedEntry > iFirstEntry + OsdGetSize() - 1) iFirstEntry = iSelectedEntry - OsdGetSize() + 1; } - return 0; + else + { + ScanDirectory(path, SCANF_INIT, extension, options, prefix); // jump to first visible item + } + return 0; } else if (mode == SCANF_PREV) { @@ -1254,7 +1258,11 @@ int ScanDirectory(char* path, int mode, const char *extension, int options, cons iSelectedEntry--; if (iSelectedEntry < iFirstEntry) iFirstEntry = iSelectedEntry; } - return 0; + else + { + ScanDirectory(path, SCANF_END, extension, options, prefix); // jump to last visible item + } + return 0; } else if (mode == SCANF_NEXT_PAGE) { diff --git a/menu.cpp b/menu.cpp index 2ec6ace..d5f2994 100644 --- a/menu.cpp +++ b/menu.cpp @@ -1003,21 +1003,39 @@ void HandleUI(void) // Also set parentstate to the appropriate menustate. if (menumask) { - if (down && (menumask >= ((uint32_t)1 << (menusub + 1)))) // Any active entries left? + if (down) { - do - { - menusub++; - } while ((menumask & ((uint32_t)1 << menusub)) == 0); - menustate = parentstate; + if((menumask >= ((uint32_t)1 << (menusub + 1)))) // Any active entries left? + { + do + { + menusub++; + } while ((menumask & ((uint32_t)1 << menusub)) == 0); + } + else + { + menusub = 0; // jump to first item + } + + menustate = parentstate; } - if (up && menusub > 0) + if (up) { - do - { - --menusub; - } while ((menumask & ((uint32_t)1 << menusub)) == 0); + if (menusub > 0) + { + do + { + --menusub; + } while ((menumask & ((uint32_t)1 << menusub)) == 0); + } + else + { + do + { + menusub++; + } while ((menumask & ((uint32_t)(~0) << (menusub + 1))) != 0); // jump to last item + } menustate = parentstate; } }