|
1 | 1 | #include "menu.h" |
2 | 2 | using namespace Menu; |
3 | 3 |
|
| 4 | +void menuIn::setFieldMode(bool) {} |
| 5 | +bool menuIn::fieldMode() const {return false;} |
| 6 | + |
| 7 | +size_t noInput::write(uint8_t) {return 0;} |
| 8 | +int noInput::available() {return 0;} |
| 9 | +int noInput::read() {return -1;} |
| 10 | +int noInput::peek() {return -1;} |
| 11 | + |
| 12 | +#ifdef MENU_ASYNC |
| 13 | + int StringStream::available() {return 0!=*src;} |
| 14 | + int StringStream::read() {return *src++;} |
| 15 | + int StringStream::peek() {return *src?*src:-1;} |
| 16 | + void StringStream::flush() {while(*src) src++;} |
| 17 | + size_t StringStream::write(uint8_t) {return 0;} |
| 18 | +#endif |
| 19 | + |
4 | 20 | //////////////////////////////////////////////////////////////////////////////// |
5 | 21 | //////////////////////////////////////////////////////////////////////////////// |
6 | 22 | //////////////////////////////////////////////////////////////////////////////// |
7 | 23 | // menuOut - base menu output device |
8 | 24 | // |
9 | 25 | //////////////////////////////////////////////////////////////////////////////// |
| 26 | +#if defined(MENU_DEBUG) || defined(MENU_ASYNC) |
| 27 | + #ifdef ESP8266 |
| 28 | + template<typename T> |
| 29 | + menuOut& menuOut::operator<<(T o) {(*(Stream*)this)<<(o);return *this;} |
| 30 | + #endif |
| 31 | +#endif |
| 32 | + |
10 | 33 | #ifdef MENU_ASYNC |
11 | 34 | bool menuOut::isAsync() {return false;} |
12 | 35 | #endif |
13 | 36 |
|
| 37 | +menuOut& menuOut::fill( |
| 38 | + int x1, int y1, int x2, int y2,char ch, |
| 39 | + colorDefs color, |
| 40 | + bool selected, |
| 41 | + status stat, |
| 42 | + bool edit |
| 43 | +) {return *this;} |
| 44 | + |
14 | 45 | idx_t menuOut::printRaw(const char* at,idx_t len) { |
15 | 46 | trace(MENU_DEBUG_OUT<<"menuOut::printRaw"<<endl); |
16 | 47 | const char* p=at; |
@@ -43,13 +74,68 @@ void menuOut::doNav(navCmd cmd,navNode &nav) { |
43 | 74 | } |
44 | 75 | } |
45 | 76 |
|
| 77 | +void menuOut::setColor(colorDefs c,bool selected,status s,bool edit) {} |
| 78 | +void menuOut::drawCursor(idx_t ln,bool selected,status stat,bool edit,idx_t panelNr) { |
| 79 | + setColor(cursorColor, selected, stat,edit); |
| 80 | + write(selected?(stat==disabledStatus? options->disabledCursor : options->selectedCursor):' '); |
| 81 | +} |
| 82 | +idx_t menuOut::startCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr) {write(charEdit?">":"[");return 1;} |
| 83 | +idx_t menuOut::endCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr) {write(charEdit?"<":"]");return 1;} |
| 84 | +idx_t menuOut::editCursor(navRoot& root,idx_t x,idx_t y,bool editing,bool charEdit,idx_t panelNr) {return 0;} |
| 85 | +void menuOut::rect(idx_t panelNr,idx_t x,idx_t y,idx_t w,idx_t h,colorDefs c,bool selected,status stat,bool edit) {} |
| 86 | +void menuOut::box(idx_t panelNr,idx_t x,idx_t y,idx_t w,idx_t h,colorDefs c,bool selected,status stat,bool edit) {} |
| 87 | +#ifdef MENU_FMT_WRAPS |
| 88 | + result menuOut::fmtStart(prompt& target,fmtParts part,navNode &nav,idx_t idx) {return proceed;} |
| 89 | + result menuOut::fmtEnd(prompt& target,fmtParts part,navNode &nav,idx_t idx) {return proceed;} |
| 90 | +#endif |
| 91 | + |
46 | 92 | #if defined(MENU_DEBUG) || defined(MENU_ASYNC) |
47 | 93 | menuOut& menuOut::operator<<(const prompt& p) { |
48 | 94 | print_P(*this,p.getText()); |
49 | 95 | return *this; |
50 | 96 | } |
51 | 97 | #endif |
52 | 98 |
|
| 99 | +void cursorOut::clearLine(idx_t ln,idx_t panelNr,colorDefs color,bool selected,status stat,bool edit) { |
| 100 | + setCursor(0,ln,panelNr); |
| 101 | + for(int n=0;n<maxX();n++) print(' '); |
| 102 | + setCursor(0,ln,panelNr); |
| 103 | +} |
| 104 | + |
| 105 | +menuOut& cursorOut::fill( |
| 106 | + int x1, int y1, int x2, int y2,char ch, |
| 107 | + colorDefs color, |
| 108 | + bool selected, |
| 109 | + status stat, |
| 110 | + bool edit |
| 111 | +) { |
| 112 | + for(int r=y1;r<=y2;r++) { |
| 113 | + setCursor(x1,r); |
| 114 | + for(int c=x1;c<=x2;c++) |
| 115 | + write(ch); |
| 116 | + } |
| 117 | + return *this; |
| 118 | +} |
| 119 | + |
| 120 | +idx_t gfxOut::startCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr) { |
| 121 | + if (charEdit) { |
| 122 | + rect(panelNr, x-1, y, 1, 1, bgColor, false, enabledStatus, false); |
| 123 | + setColor(fgColor,false,enabledStatus,false); |
| 124 | + }/* else |
| 125 | + box(panelNr, x, y, 1, 1, bgColor, false, enabledStatus, false);*/ |
| 126 | + return 0; |
| 127 | +} |
| 128 | + |
| 129 | +idx_t gfxOut::endCursor(navRoot& root,idx_t x,idx_t y,bool charEdit,idx_t panelNr) { |
| 130 | + setColor(fgColor,true,enabledStatus,true);return 0; |
| 131 | +} |
| 132 | + |
| 133 | +idx_t gfxOut::editCursor(navRoot& root,idx_t x,idx_t y,bool editing,bool charEdit,idx_t panelNr) { |
| 134 | + //TODO: next version, this furntiosn should return an USED value (and avoid nasty x-1) |
| 135 | + if (editing) box(panelNr,x-1,y); |
| 136 | + return 0; |
| 137 | +} |
| 138 | + |
53 | 139 | Used outputsList::printMenu(navNode& nav) const { |
54 | 140 | trace(MENU_DEBUG_OUT<<"outputsList::printMenu"<<endl); |
55 | 141 | for(int n=0;n<cnt;n++) { |
@@ -91,6 +177,19 @@ result outputsList::idle(idleFunc f,idleEvent e,bool idleChanged) { |
91 | 177 | return proceed; |
92 | 178 | } |
93 | 179 |
|
| 180 | +void outputsList::refresh() { |
| 181 | + for(int n=0;n<cnt;n++) ((menuOut*)memPtr(outs[n]))->drawn=NULL; |
| 182 | +} |
| 183 | +void outputsList::clearChanged(navNode& nav) const { |
| 184 | + for(int n=0;n<cnt;n++) ((menuOut*)memPtr(outs[n]))->clearChanged(nav); |
| 185 | +} |
| 186 | +void outputsList::clear() { |
| 187 | + for(int n=0;n<cnt;n++) ((menuOut*)memPtr(outs[n]))->clear(); |
| 188 | +} |
| 189 | +void outputsList::doNav(navCmd cmd,class navNode &nav) { |
| 190 | + for(int n=0;n<cnt;n++) ((menuOut*)memPtr(outs[n]))->doNav(cmd,nav); |
| 191 | +} |
| 192 | + |
94 | 193 | // draw a menu preview on a panel |
95 | 194 | void menuOut::previewMenu(navRoot& root,menuNode& menu,idx_t panelNr) { |
96 | 195 | trace(MENU_DEBUG_OUT<<"menuOut::previewMenu"<<endl); |
|
0 commit comments