Library to display menus on TextLCDs. Interaction with functions Up,Down and Select (Buttons or RPG) Based on menu-library from pyeh9

Fork of Menu by Peihsun Yeh

Library to display menus on TextLCDs. Interaction with functions Up,Down and Select (Buttons or RPG) Based on menu-library from pyeh9

Navigator.cpp

Committer:
charly
Date:
2015-01-16
Revision:
8:fbaeab73fe1a
Parent:
7:12f2b3b7975f
Child:
9:c9df0b33d176

File content as of revision 8:fbaeab73fe1a:

#include "Navigator.h"

Navigator::Navigator(Menu *root, TextLCD_Base *lcd) : activeMenu(root), lcd(lcd)
{

    _cursorPos = 0;
    _cursorLine = 1;
    _display_rows = lcd->rows();
    
    activeMenu->CurrentSelection = _cursorPos;

    printMenu();
    printCursor();
}

void Navigator::printMenu()
{
    int index =0;
    lcd->cls();

    for(int row=0; row < _display_rows; row++) {

        lcd->locate(0,row);
        index = row + _cursorPos - (_cursorLine-1);    // index into selection for this line
        //should we display a menu on this line?
        if (index <= activeMenu->selections.size()-1 ) {
            lcd->printf(" %s", activeMenu->selections[index].selText);
        }
    }
}

void Navigator::printCursor()
{
    if(activeMenu->selections[_cursorPos].childMenu == NULL) printf("No child menu\n");
    else printf("child menu: %s\n", activeMenu->selections[_cursorPos].childMenu->menuID);

    lcd->locate(0,0);
    for (int row=0; row<_display_rows; row++) {
        lcd->locate(0,row);
        if (row == _cursorLine-1) {
            //we are on Cursor-Line
            //print cursor
            lcd->putc('>');
        } else {
            //on other lines print a space
            lcd->putc(' ');
        }
    }
}

void Navigator::poll()
{
// no longer needed
}

void Navigator::select()
{
    Menu *lastMenu;
    
    if(activeMenu->selections[_cursorPos].fun != NULL) {
        //execute function
        (activeMenu->selections[_cursorPos].fun)();
        // refresh the Menu
        //printMenu();
        //printCursor();
    }
    //change the menu?
    if(activeMenu->selections[_cursorPos].childMenu != NULL) {
        lastMenu = activeMenu;
        
        //change to childMenu
        activeMenu = activeMenu->selections[_cursorPos].childMenu;
        
        // if we went up one level, set CurrectSelection of SubMenu to zero, if we come back again
        if (activeMenu->selections[activeMenu->CurrentSelection].childMenu == lastMenu) {
            //reset menuposition of submenu to zero
            lastMenu->CurrentSelection = 0;
        }            
        
        // return to last position from that menu, if we went up on level
        _cursorPos = activeMenu->CurrentSelection;
               
        _cursorLine = 1;
        printMenu();
        printCursor();
    }
}
void Navigator::moveUp()
{
    // allready on TOP of Display?
    if(_cursorLine > 1) {
        // scroll up cursor one line
        _cursorLine--;
    }

    if(_cursorPos > 0) {
        //scroll up one item
        _cursorPos--;
        activeMenu->CurrentSelection = _cursorPos;

    }
    printMenu();
    printCursor();
}

void Navigator::moveDown()
{

    // allready on last line of display?
    if (_cursorPos == activeMenu->selections.size()-1) {
        //stay on this line
    } else {
        // move down
        if(_cursorLine < _display_rows) {
            // Only move down cursor
            _cursorLine++;
            _cursorPos++;
        } else {
            // on last Display-Line scroll down Menu
            _cursorPos++;
        }
        // save currentPosition in Menu
        activeMenu->CurrentSelection = _cursorPos;

    }

    printMenu();
    printCursor();
}