Library which creates a serial test console, it supports pages and menu items. The items are added and the pages are added as necessary when the user sets it up. This is a great too for creating an easy to maintain menu system, whether for a test sytem, or anything else.
Dependencies: Terminal
page.cpp@9:b1fdd7ea6f72, 2015-07-24 (annotated)
- Committer:
- glansberry
- Date:
- Fri Jul 24 22:18:19 2015 +0000
- Revision:
- 9:b1fdd7ea6f72
- Parent:
- 6:e992366d0684
Fixed bug is choosing the first page.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
glansberry | 0:907d2d5e77f7 | 1 | #include "page.h" |
glansberry | 0:907d2d5e77f7 | 2 | |
glansberry | 6:e992366d0684 | 3 | //default constructor |
glansberry | 0:907d2d5e77f7 | 4 | Page::Page() : |
glansberry | 6:e992366d0684 | 5 | make_active_flag(false), |
glansberry | 6:e992366d0684 | 6 | name(NULL), |
glansberry | 6:e992366d0684 | 7 | term(NULL), |
glansberry | 0:907d2d5e77f7 | 8 | num_menuitems(0), |
glansberry | 0:907d2d5e77f7 | 9 | data_start_x(0), |
glansberry | 0:907d2d5e77f7 | 10 | page_num(0) |
glansberry | 6:e992366d0684 | 11 | {} |
glansberry | 0:907d2d5e77f7 | 12 | |
glansberry | 6:e992366d0684 | 13 | Page::Page(const char * name_p, Terminal * term_p): |
glansberry | 6:e992366d0684 | 14 | make_active_flag(false), |
glansberry | 6:e992366d0684 | 15 | name(name_p), |
glansberry | 6:e992366d0684 | 16 | term(term_p), |
glansberry | 0:907d2d5e77f7 | 17 | num_menuitems(0), |
glansberry | 0:907d2d5e77f7 | 18 | data_start_x(0), |
glansberry | 0:907d2d5e77f7 | 19 | max_upper_letter_cmd('A'-1), |
glansberry | 0:907d2d5e77f7 | 20 | max_lower_letter_cmd('a'-1), |
glansberry | 0:907d2d5e77f7 | 21 | max_number_cmd('1'-1), |
glansberry | 0:907d2d5e77f7 | 22 | page_num(0) |
glansberry | 0:907d2d5e77f7 | 23 | { |
glansberry | 6:e992366d0684 | 24 | // term->printf("Page::Page('%s')\r\n",name); |
glansberry | 0:907d2d5e77f7 | 25 | } |
glansberry | 0:907d2d5e77f7 | 26 | |
iillyyaa | 3:f308cd7a34ed | 27 | Page& Page::add(MenuItem const &item_p) { |
glansberry | 0:907d2d5e77f7 | 28 | if(num_menuitems < MAX_MENUITEMS-1) { |
glansberry | 4:800a75ffea3c | 29 | item[num_menuitems] = item_p; //make a local copy of the item |
glansberry | 4:800a75ffea3c | 30 | |
glansberry | 4:800a75ffea3c | 31 | MenuItem * active_item = &item[num_menuitems]; |
glansberry | 4:800a75ffea3c | 32 | int item_data_start = active_item->name_len+ (LEVEL_INDENT * (active_item->level+1)) + DATA_GAP; |
glansberry | 0:907d2d5e77f7 | 33 | |
glansberry | 0:907d2d5e77f7 | 34 | if (item_data_start > data_start_x) data_start_x = item_data_start; //keep track of length so we can put data after it |
glansberry | 0:907d2d5e77f7 | 35 | |
glansberry | 4:800a75ffea3c | 36 | if(active_item->type == heading) command_letter[num_menuitems]=0; //Headings don't get numbers |
glansberry | 0:907d2d5e77f7 | 37 | |
glansberry | 0:907d2d5e77f7 | 38 | else { |
glansberry | 0:907d2d5e77f7 | 39 | |
glansberry | 4:800a75ffea3c | 40 | //Assign the command character for the menu item |
glansberry | 4:800a75ffea3c | 41 | if(active_item->level==1) //it gets an lower case letter |
glansberry | 0:907d2d5e77f7 | 42 | { |
glansberry | 0:907d2d5e77f7 | 43 | command_letter[num_menuitems] = ++max_lower_letter_cmd; |
glansberry | 0:907d2d5e77f7 | 44 | } |
glansberry | 4:800a75ffea3c | 45 | else if(active_item->level==0) //it gets a number |
glansberry | 0:907d2d5e77f7 | 46 | { |
glansberry | 0:907d2d5e77f7 | 47 | command_letter[num_menuitems] = ++max_number_cmd; |
glansberry | 0:907d2d5e77f7 | 48 | } |
glansberry | 0:907d2d5e77f7 | 49 | else |
glansberry | 0:907d2d5e77f7 | 50 | { |
glansberry | 0:907d2d5e77f7 | 51 | command_letter[num_menuitems] = ++max_lower_letter_cmd; |
glansberry | 0:907d2d5e77f7 | 52 | } |
glansberry | 0:907d2d5e77f7 | 53 | |
glansberry | 4:800a75ffea3c | 54 | } |
glansberry | 6:e992366d0684 | 55 | //term->printf("Added menu item '%s' as index %d cmd %c to page %s\r\n", active_item->name, num_menuitems, command_letter[num_menuitems], name); |
glansberry | 6:e992366d0684 | 56 | num_menuitems++;; |
glansberry | 0:907d2d5e77f7 | 57 | } |
glansberry | 6:e992366d0684 | 58 | else term->printf("Failed to add menu item #%d, '%s'\r\n", num_menuitems, item_p.name); |
iillyyaa | 3:f308cd7a34ed | 59 | return *this; |
iillyyaa | 3:f308cd7a34ed | 60 | } |
glansberry | 0:907d2d5e77f7 | 61 | |
glansberry | 0:907d2d5e77f7 | 62 | void Page::display(void){ |
glansberry | 6:e992366d0684 | 63 | term->cls(); |
glansberry | 6:e992366d0684 | 64 | term->HideCursor(); |
glansberry | 6:e992366d0684 | 65 | term->locate(0,0); |
glansberry | 6:e992366d0684 | 66 | term->printf("%s",name); |
glansberry | 0:907d2d5e77f7 | 67 | int index; |
glansberry | 0:907d2d5e77f7 | 68 | |
glansberry | 0:907d2d5e77f7 | 69 | for (index=0; index < num_menuitems; index++){ |
glansberry | 6:e992366d0684 | 70 | term->locate(LEVEL_INDENT*(item[index].level+1),index+ITEM_ROW_START); |
glansberry | 0:907d2d5e77f7 | 71 | |
glansberry | 0:907d2d5e77f7 | 72 | //don't print command letter for messages without them |
glansberry | 6:e992366d0684 | 73 | if(command_letter[index] != 0) term->printf("%c) ", command_letter[index]); |
glansberry | 0:907d2d5e77f7 | 74 | |
glansberry | 6:e992366d0684 | 75 | term->printf("%s", item[index].name); |
glansberry | 0:907d2d5e77f7 | 76 | } |
glansberry | 0:907d2d5e77f7 | 77 | |
glansberry | 0:907d2d5e77f7 | 78 | index++; //add a space before the return line |
glansberry | 6:e992366d0684 | 79 | term->locate(LEVEL_INDENT,index+ITEM_ROW_START); |
glansberry | 6:e992366d0684 | 80 | term->printf("x) Back to previous page"); |
glansberry | 0:907d2d5e77f7 | 81 | update(); |
glansberry | 0:907d2d5e77f7 | 82 | } |
glansberry | 0:907d2d5e77f7 | 83 | // Update the data on the Page |
glansberry | 0:907d2d5e77f7 | 84 | void Page::update(void){ |
iillyyaa | 3:f308cd7a34ed | 85 | char buf[32]; |
iillyyaa | 3:f308cd7a34ed | 86 | for (int index=0; index < num_menuitems; index++){ |
iillyyaa | 3:f308cd7a34ed | 87 | if(!item[index].action) continue; |
glansberry | 0:907d2d5e77f7 | 88 | |
glansberry | 6:e992366d0684 | 89 | term->locate(data_start_x,index+ITEM_ROW_START); |
iillyyaa | 3:f308cd7a34ed | 90 | item[index].action->getString(buf, sizeof(buf)); |
glansberry | 6:e992366d0684 | 91 | term->printf("%s", buf); |
iillyyaa | 3:f308cd7a34ed | 92 | } |
glansberry | 1:c6deb449c132 | 93 | |
glansberry | 6:e992366d0684 | 94 | term->HideCursor(); |
iillyyaa | 3:f308cd7a34ed | 95 | } |
glansberry | 0:907d2d5e77f7 | 96 |