[Taranis / sky9x] Bad wrap-around in files selection popups

This commit is contained in:
bsongis@gmail.com
2013-05-07 09:35:19 +00:00
parent 481c18d6ff
commit 86baf80ac2
3 changed files with 30 additions and 1 deletions
+17
View File
@@ -146,6 +146,10 @@ bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen,
s_last_menu_offset = 0;
memset(reusableBuffer.modelsel.menu_bss, 0, sizeof(reusableBuffer.modelsel.menu_bss));
}
else if (s_menu_offset == s_menu_count - MENU_MAX_LINES) {
s_last_menu_offset = 0xffff;
memset(reusableBuffer.modelsel.menu_bss, 0, sizeof(reusableBuffer.modelsel.menu_bss));
}
else if (s_menu_offset == s_last_menu_offset) {
// should not happen, only there because of Murphy's law
return true;
@@ -212,6 +216,19 @@ bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen,
for (uint8_t i=0; i<min(s_menu_count, (uint16_t)MENU_MAX_LINES); i++)
s_menu[i] = reusableBuffer.modelsel.menu_bss[i];
}
else if (s_last_menu_offset == 0xffff) {
for (int i=MENU_MAX_LINES-1; i>=0; i--) {
char *line = reusableBuffer.modelsel.menu_bss[i];
if (line[0] == '\0' || strcmp(fn, line) > 0) {
if (i > 0) memmove(reusableBuffer.modelsel.menu_bss[0], reusableBuffer.modelsel.menu_bss[1], sizeof(reusableBuffer.modelsel.menu_bss[i]) * i);
memset(line, 0, MENU_LINE_LENGTH);
strcpy(line, fn);
break;
}
}
for (uint8_t i=0; i<min(s_menu_count, (uint16_t)MENU_MAX_LINES); i++)
s_menu[i] = reusableBuffer.modelsel.menu_bss[i];
}
else if (s_menu_offset > s_last_menu_offset) {
if (strcmp(fn, reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-2]) > 0 && strcmp(fn, reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-1]) < 0) {
memset(reusableBuffer.modelsel.menu_bss[MENU_MAX_LINES-1], 0, MENU_LINE_LENGTH);
+12
View File
@@ -980,6 +980,12 @@ const char * displayMenu(uint8_t event)
#endif
else {
s_menu_item = display_count - 1;
#if defined(SDCARD)
if (s_menu_count > MENU_MAX_LINES) {
s_menu_offset = s_menu_count - display_count;
result = STR_UPDATE_LIST;
}
#endif
}
break;
@@ -999,6 +1005,12 @@ const char * displayMenu(uint8_t event)
#endif
else {
s_menu_item = 0;
#if defined(SDCARD)
if (s_menu_offset) {
s_menu_offset = 0;
result = STR_UPDATE_LIST;
}
#endif
}
break;
CASE_EVT_ROTARY_BREAK