diff --git a/radio/src/gui/9X/navigation.cpp b/radio/src/gui/9X/navigation.cpp index a1f427924..db17b2ca6 100755 --- a/radio/src/gui/9X/navigation.cpp +++ b/radio/src/gui/9X/navigation.cpp @@ -629,37 +629,62 @@ void check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t } #if defined(CPUARM) - if (l_posVert<1) { - s_pgOfs=0; - } - else if (menuTab && horTab) { - vertpos_t realPosVert = l_posVert; - vertpos_t realPgOfs = s_pgOfs; - vertpos_t realMaxrow = maxrow; - for (vertpos_t i=1; i<=maxrow; i++) { - if (MAXCOL(i) == HIDDEN_ROW) { - realMaxrow--; - if (i < l_posVert) - realPosVert--; - if (i < s_pgOfs) - realPgOfs--; + int linesCount = maxrow; + + if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { + s_pgOfs = 0; + if (horTab) { + linesCount = 0; + for (int i=0; i=horTabMax || horTab[i] != HIDDEN_ROW) { + linesCount++; + } + } } } - if (realPosVert>(LCD_LINES-1)+realPgOfs) realPgOfs = realPosVert-(LCD_LINES-1); - else if (realPosVert<1+realPgOfs) realPgOfs = realPosVert-1; - s_pgOfs = realPgOfs; - for (vertpos_t i=1; i<=realPgOfs; i++) { - if (MAXCOL(i) == HIDDEN_ROW) { - s_pgOfs++; + else if (horTab) { + if (maxrow > NUM_BODY_LINES) { + while (1) { + vertpos_t firstLine = 0; + for (int numLines=0; firstLine=horTabMax || horTab[firstLine+1] != HIDDEN_ROW) { + numLines++; + } + } + if (l_posVert <= firstLine) { + s_pgOfs--; + } + else { + vertpos_t lastLine = firstLine; + for (int numLines=0; lastLine=horTabMax || horTab[lastLine+1] != HIDDEN_ROW) { + numLines++; + } + } + if (l_posVert > lastLine) { + s_pgOfs++; + } + else { + linesCount = s_pgOfs + NUM_BODY_LINES; + for (int i=lastLine; i=horTabMax || horTab[i] != HIDDEN_ROW) { + linesCount++; + } + } + break; + } + } + } + } + } + else { + if (l_posVert>NUM_BODY_LINES+s_pgOfs) { + s_pgOfs = l_posVert-NUM_BODY_LINES; + } + else if (l_posVert<=s_pgOfs) { + s_pgOfs = l_posVert-1; } } - maxrow = realMaxrow; - } - else { - uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2; - if (l_posVert>max+s_pgOfs) s_pgOfs = l_posVert-max; - else if (l_posVert<1+s_pgOfs) s_pgOfs = l_posVert-1; - } #else uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2; if (l_posVert<1) s_pgOfs=0;